@chllming/wave-orchestration 0.9.1 → 0.9.3

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 (46) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/LICENSE.md +21 -0
  3. package/README.md +20 -9
  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/recommendations-0.9.3.md +137 -0
  12. package/docs/guides/sandboxed-environments.md +2 -2
  13. package/docs/plans/current-state.md +8 -2
  14. package/docs/plans/end-state-architecture.md +1 -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 +65 -67
  18. package/docs/reference/cli-reference.md +1 -1
  19. package/docs/reference/coordination-and-closure.md +20 -3
  20. package/docs/reference/corridor.md +225 -0
  21. package/docs/reference/npmjs-token-publishing.md +2 -2
  22. package/docs/reference/package-publishing-flow.md +11 -11
  23. package/docs/reference/runtime-config/README.md +61 -3
  24. package/docs/reference/sample-waves.md +5 -5
  25. package/docs/reference/skills.md +1 -1
  26. package/docs/reference/wave-control.md +358 -27
  27. package/docs/roadmap.md +12 -19
  28. package/package.json +1 -1
  29. package/releases/manifest.json +44 -3
  30. package/scripts/wave-cli-bootstrap.mjs +52 -1
  31. package/scripts/wave-orchestrator/agent-state.mjs +26 -9
  32. package/scripts/wave-orchestrator/config.mjs +199 -3
  33. package/scripts/wave-orchestrator/context7.mjs +231 -29
  34. package/scripts/wave-orchestrator/coordination.mjs +15 -1
  35. package/scripts/wave-orchestrator/corridor.mjs +363 -0
  36. package/scripts/wave-orchestrator/derived-state-engine.mjs +38 -1
  37. package/scripts/wave-orchestrator/gate-engine.mjs +20 -0
  38. package/scripts/wave-orchestrator/install.mjs +34 -1
  39. package/scripts/wave-orchestrator/launcher-runtime.mjs +111 -7
  40. package/scripts/wave-orchestrator/launcher.mjs +21 -3
  41. package/scripts/wave-orchestrator/planner.mjs +30 -0
  42. package/scripts/wave-orchestrator/projection-writer.mjs +23 -0
  43. package/scripts/wave-orchestrator/provider-runtime.mjs +104 -0
  44. package/scripts/wave-orchestrator/shared.mjs +1 -0
  45. package/scripts/wave-orchestrator/traces.mjs +25 -0
  46. package/scripts/wave-orchestrator/wave-control-client.mjs +14 -1
@@ -1,6 +1,6 @@
1
1
  # Migration
2
2
 
3
- This page is the practical repo-upgrade guide for the current `0.9.1` surface.
3
+ This page is the practical repo-upgrade guide for the current `0.9.3` surface.
4
4
 
5
5
  Use it when you are:
6
6
 
@@ -12,22 +12,44 @@ For the completed internal architecture cutover record, see [architecture-harden
12
12
 
13
13
  For the sandbox-specific long-running execution target, including async `submit/status/wait` semantics and daemon ownership goals, see [sandbox-end-state-architecture.md](./sandbox-end-state-architecture.md).
14
14
 
15
- ## What `0.9.1` Changes
15
+ ## What `0.9.3` Changes
16
16
 
17
- The current `0.9.1` surface keeps the packaged operator-guidance alignment, monorepo project support, and project-aware default telemetry from `0.9.0`, but adds a more sandbox-friendly execution model and lower-overhead live orchestration.
17
+ The current `0.9.3` surface keeps everything from `0.9.2` and adds two focused improvements with no breaking changes.
18
+
19
+ The practical changes are:
20
+
21
+ - `WAVE_GATE_REGEX` now accepts `gap` alongside `pass|concerns|blocked` for all five gate dimensions (architecture, integration, durability, live, docs), so agents that report a documented gap no longer have their marker rejected entirely
22
+ - `validateContQaSummary` treats `gap` dimension values as a conditional pass (`ok: true`, `statusCode: conditional-pass`) instead of a hard blocker
23
+ - the cont-QA coordination prompt now documents `gap` as a valid dimension value
24
+ - first-time `wave launch` now auto-triggers `wave project setup` when no project profile exists, matching existing `wave draft` behavior
25
+ - `wave project setup` now shows descriptive help text before each prompt, explains all template and posture options inline, and adds whitespace between question groups for readability
26
+ - `PromptSession` gains a `describe(text)` method for writing contextual help to stderr during interactive setup flows
27
+ - `parseArgs` now passes the loaded config object through to `runLauncherCli`, avoiding a redundant `loadWaveConfig()` call
28
+
29
+ There are no breaking changes. Just upgrade with `pnpm up @chllming/wave-orchestration` and run `pnpm exec wave upgrade`.
30
+
31
+ If your repo uses wave-gate markers, you can now use `gap` for dimensions where the gap is documented and not an actionable blocker.
32
+
33
+ For the practical `0.9.3` operating stance after the upgrade, read [../guides/recommendations-0.9.3.md](../guides/recommendations-0.9.3.md).
34
+
35
+ ## What `0.9.2` Changes
36
+
37
+ The current `0.9.2` surface keeps the packaged operator-guidance alignment, monorepo project support, and project-aware default telemetry from `0.9.0`, but adds a more sandbox-friendly execution model and lower-overhead live orchestration.
18
38
 
19
39
  The practical changes are:
20
40
 
21
41
  - live agent execution now uses detached process runners instead of per-agent tmux execution sessions, which reduces tmux churn and lowers memory pressure during broader fan-out
22
42
  - `wave submit`, `wave supervise`, `wave status`, `wave wait`, and `wave attach` are now the preferred path for short-lived clients and sandbox automation
23
43
  - supervisor recovery now reconciles launcher status and progress more conservatively, preserves the correct remaining wave range during multi-wave reruns, and keeps read-side status/wait calls aligned even after daemon loss
44
+ - the packaged docs now cover the actual shipped owned-deployment Wave Control surface: Stack-authenticated browser access, Wave-managed approval states and provider grants, PATs, service tokens, encrypted per-user credentials, runtime env leasing, and the separate `services/wave-control-web` frontend
45
+ - Corridor is now documented as a first-class security input, including direct versus broker versus hybrid mode, implementation-owned path matching, generated artifact paths, and the closure-gate interaction with the human security reviewer
24
46
  - a dedicated setup guide now ships for LEAPclaw, OpenClaw, Nemoshell, Docker, and similar constrained environments
25
47
  - the `0.9.0` monorepo and project-aware state layout remains part of the release surface, including `defaultProject`, `projects.<projectId>`, project-scoped state roots, and project-aware CLI routing
26
- - the current release surface and tracked install-state fixtures now all move together on `0.9.1`
48
+ - the current release surface and tracked install-state fixtures now all move together on `0.9.2`
27
49
 
28
- If your repo copied starter docs, shell automation, runbooks, or `wave.config.json` defaults, these are the areas most likely to need a sync before the `0.9.1` package cut.
50
+ If your repo copied starter docs, shell automation, runbooks, or `wave.config.json` defaults, these are the areas most likely to need a sync before the `0.9.2` package cut.
29
51
 
30
- For a practical `0.9.1` operating stance after the upgrade, read [../guides/recommendations-0.9.1.md](../guides/recommendations-0.9.1.md).
52
+ For a practical `0.9.2` operating stance after the upgrade, read [../guides/recommendations-0.9.2.md](../guides/recommendations-0.9.2.md).
31
53
  For the concrete operator setup in Nemoshell, Docker, and other sandboxed shells, also read [../guides/sandboxed-environments.md](../guides/sandboxed-environments.md).
32
54
 
33
55
  ## What `0.8.6` Changes
@@ -95,7 +117,7 @@ pnpm exec wave upgrade
95
117
 
96
118
  ### 3. Sync repo-owned starter surface only if you copied it
97
119
 
98
- The most common sync set for `0.9.1` is:
120
+ The most common sync set for `0.9.2` is:
99
121
 
100
122
  - `docs/agents/wave-launcher-role.md`
101
123
  - `docs/agents/wave-orchestrator-role.md`
@@ -116,8 +138,10 @@ The most common sync set for `0.9.1` is:
116
138
  - `docs/context7/planner-agent/`
117
139
  - `docs/reference/wave-planning-lessons.md`
118
140
  - `docs/reference/cli-reference.md`
141
+ - `docs/reference/corridor.md`
119
142
  - `docs/reference/skills.md`
120
143
  - `docs/reference/sample-waves.md`
144
+ - `docs/reference/wave-control.md`
121
145
  - `docs/plans/current-state.md`
122
146
  - `docs/plans/end-state-architecture.md`
123
147
  - `docs/plans/wave-orchestrator.md`
@@ -146,20 +170,23 @@ pnpm exec wave coord inbox --lane main --wave 0 --agent A1 --dry-run
146
170
 
147
171
  Use `pnpm exec wave dashboard --lane <lane> --attach current` or `--attach global` when you need to reattach to a tmux-backed dashboard after the upgrade.
148
172
 
149
- ## `0.9.1` Release Model
173
+ ## `0.9.3` Release Model
150
174
 
151
- The current `0.9.1` surface is five changes together:
175
+ The current `0.9.3` surface combines these strands:
152
176
 
153
- - the detached process-runner and sandbox supervisor hardening released in `0.9.1`
177
+ - the gap-value wave-gate fix and first-time setup UX improvements released in `0.9.3`
178
+ - the detached process-runner and sandbox supervisor hardening released in `0.9.2`
154
179
  - the shipped `0.9.0` monorepo project support and project-aware runtime isolation
155
180
  - the shipped `design` worker role and hybrid design-steward flow introduced in `0.8.5`
156
181
  - the signal-driven long-running-agent and wrapper model introduced in `0.8.6`
157
182
  - the policy-consistency, targeted-recovery, capability-specific routing, and stable per-wave session reuse hardening introduced in `0.8.7`
158
- - the packaged recommendations guide, sandbox setup guide, and install-state alignment follow-up released in `0.9.1`
183
+ - the current owned-deployment Wave Control surface: Stack-authenticated app access, provider grants, PATs, service tokens, encrypted per-user credentials, and runtime credential leasing
184
+ - the Corridor-backed security surface: direct or brokered provider fetches, normalized per-wave artifacts, and closure gating before integration
185
+ - the packaged recommendations guide, sandbox setup guide, and release-surface alignment follow-up that make the current docs describe that combined surface consistently
159
186
 
160
187
  ### Sandbox-safe execution and lower-overhead live runs
161
188
 
162
- This is the main new behavior in `0.9.1`.
189
+ This is the main new behavior in `0.9.2`.
163
190
 
164
191
  The runtime now:
165
192
 
@@ -168,7 +195,7 @@ The runtime now:
168
195
  - keeps `wave attach --agent` usable through log-follow attach even when no live interactive terminal session exists
169
196
  - uses `wave submit/supervise/status/wait/attach` as the preferred sandbox-safe surface for short-lived clients
170
197
 
171
- If your repo copied sandbox, CI, or container runbooks, this is the main sync set to apply from `0.9.1`:
198
+ If your repo copied sandbox, CI, or container runbooks, this is the main sync set to apply from `0.9.2`:
172
199
 
173
200
  - `README.md`
174
201
  - `docs/README.md`
@@ -177,6 +204,24 @@ If your repo copied sandbox, CI, or container runbooks, this is the main sync se
177
204
  - `docs/reference/cli-reference.md`
178
205
  - `docs/plans/sandbox-end-state-architecture.md`
179
206
 
207
+ ### Authenticated Wave Control and Corridor-backed security
208
+
209
+ The same `0.9.2` doc surface also now describes the current control-plane and security model as shipped:
210
+
211
+ - owned Wave Control deployments use Stack for browser sign-in, then apply Wave-managed approval states and provider grants on top of that identity
212
+ - approved users and superusers can issue PATs for scoped repo-runtime access, while dedicated service tokens keep machine-admin workflows separate from user-owned runtime credentials
213
+ - arbitrary stored credentials are encrypted at rest and only returned through explicit runtime lease responses
214
+ - `externalProviders.corridor` can run direct, brokered through an owned Wave Control deployment, or hybrid; the result is persisted as a normalized security artifact and can block closure before integration
215
+
216
+ If your repo copied release docs, security runbooks, or Wave Control setup docs, this is the main sync set to apply from `0.9.2`:
217
+
218
+ - `README.md`
219
+ - `docs/README.md`
220
+ - `docs/reference/runtime-config/README.md`
221
+ - `docs/reference/coordination-and-closure.md`
222
+ - `docs/reference/corridor.md`
223
+ - `docs/reference/wave-control.md`
224
+
180
225
  ### Signal-driven waiting and wrapper model
181
226
 
182
227
  This is the main new behavior in `0.8.6`.
@@ -237,7 +282,7 @@ The interactive `wave draft` flow supports `design` as a worker role and scaffol
237
282
 
238
283
  ## Version-Specific Upgrade Guidance
239
284
 
240
- ## Upgrading From `0.8.5` To `0.8.6`
285
+ ## Upgrading From `0.8.5` To `0.9.3`
241
286
 
242
287
  This is the smallest upgrade, but it changes the live wait-loop contract for external automation and intentionally long-running agents.
243
288
 
@@ -274,7 +319,7 @@ If the repo copied starter surface, sync:
274
319
  - if the repo uses long-running watchers, confirm they can write the ack file where the prompt tells them to
275
320
  - reroute one targeted feedback or coordination request and confirm the resident signal version changes even when the signal kind stays the same
276
321
 
277
- ## Upgrading From `0.8.4` To `0.8.6`
322
+ ## Upgrading From `0.8.4` To `0.9.3`
278
323
 
279
324
  ### What changed
280
325
 
@@ -312,56 +357,9 @@ If your repo copied starter config defaults, also sync the `designRolePromptPath
312
357
  - hybrid design stewards rejoin implementation when they explicitly own code
313
358
  - long-running prompts receive signal-state and ack paths when the repo uses the new waiting model
314
359
 
315
- ## Upgrading From `0.8.3` To `0.8.6`
316
-
317
- This is the most common one-step package upgrade path.
318
-
319
- ### What changed across that range
320
-
321
- - `0.8.4` tightened contradiction replay, component-promotion threshold handling, and projection persistence boundaries
322
- - `0.8.5` ships the `design` worker role, the `role-design` and `tui-design` starter bundles, and the hybrid design-steward runtime model as part of the published package
323
- - `0.8.6` adds versioned signal snapshots, `signal-hygiene`, prompt-injected signal ack loops, and the seeded operator wrappers
324
- - current operator and planner docs now describe the shipped surface directly instead of splitting behavior between a published package and newer `main`-only additions
325
-
326
- ### Required repo changes
327
-
328
- Usually none if the repo does not copy starter prompts, skills, planning docs, or wrapper scripts.
329
-
330
- ### Strongly recommended sync
331
-
332
- If the repo copied starter surface, sync:
333
-
334
- - `docs/agents/wave-design-role.md`
335
- - `skills/role-design/`
336
- - `skills/tui-design/`
337
- - `skills/signal-hygiene/`
338
- - `scripts/wave-status.sh`
339
- - `scripts/wave-watch.sh`
340
- - `docs/guides/author-and-run-waves.md`
341
- - `docs/guides/signal-wrappers.md`
342
- - `docs/guides/planner.md`
343
- - `docs/reference/skills.md`
344
- - `docs/reference/sample-waves.md`
345
- - `docs/plans/current-state.md`
346
- - `docs/plans/wave-orchestrator.md`
347
- - `docs/plans/end-state-architecture.md`
348
-
349
- If the repo copied starter `wave.config.json` defaults, also sync:
350
-
351
- - `roles.designRolePromptPath`
352
- - `skills.byRole.design`
353
- - `executors.profiles.design-pass`
354
-
355
- ### Validation focus
356
-
357
- - confirm contradiction-blocked replay cases still compare cleanly if the repo keeps replay fixtures
358
- - if the repo uses design stewards, confirm packet-only design waves still block implementation until `ready-for-implementation`
359
- - if the repo uses hybrid design stewards, confirm the same agent rejoins implementation only when the authored wave explicitly gives it code ownership
360
- - if the repo uses long-running agents or shell automation, confirm the new wrapper exit contract and ack-loop semantics before relying on an older polling script
361
-
362
- ## Upgrading From `0.8.3` To `0.9.1`
360
+ ## Upgrading From `0.8.3` To `0.9.3`
363
361
 
364
- Treat this as one move to the current `0.9.1` surface.
362
+ Treat this as one move to the current `0.9.2` surface.
365
363
 
366
364
  ### What changed across that range
367
365
 
@@ -394,7 +392,7 @@ If your repo copied starter docs or skills, sync:
394
392
  - dry-run one design-steward wave if the repo wants the new authored surface
395
393
  - if the repo uses long-running watcher agents or shell automation, validate `scripts/wave-status.sh` and `scripts/wave-watch.sh` against a live or staged lane
396
394
 
397
- ## Upgrading From `0.6.x` Or `0.7.x` To `0.9.1`
395
+ ## Upgrading From `0.6.x` Or `0.7.x` To `0.9.3`
398
396
 
399
397
  This is the main migration path for older adopted repos.
400
398
 
@@ -435,7 +433,7 @@ pnpm exec wave control proof get --lane main --wave 0 --json
435
433
 
436
434
  If the repo carries proof-first waves, verify that required proof artifacts still exist locally and not only in historical summaries.
437
435
 
438
- ## Upgrading From `0.5.x` Or Earlier To `0.9.1`
436
+ ## Upgrading From `0.5.x` Or Earlier To `0.9.3`
439
437
 
440
438
  Do not treat this as a tiny patch bump.
441
439
 
@@ -545,4 +543,4 @@ For repos that depend on replay parity, replay at least:
545
543
 
546
544
  ## Summary
547
545
 
548
- The current `0.9.1` surface keeps the same authority-set and phase-engine architecture, ships both the design-role starter surface and the signal-driven long-running-agent starter surface, keeps the `0.8.7` policy and routing hardening, and now also packages the practical operator recommendations guide inside the release line. For most repos already on `0.8.x`, the upgrade is package bump plus validation. For older adopted repos, the real work is syncing repo-owned prompts, skills, planner corpus, wrapper scripts, and runbooks so they describe the runtime the package now ships.
546
+ The current `0.9.3` surface keeps the same authority-set and phase-engine architecture, ships both the design-role starter surface and the signal-driven long-running-agent starter surface, keeps the `0.8.7` policy and routing hardening, and now also packages the practical operator recommendations guide inside the release line. For most repos already on `0.8.x`, the upgrade is package bump plus validation. For older adopted repos, the real work is syncing repo-owned prompts, skills, planner corpus, wrapper scripts, and runbooks so they describe the runtime the package now ships.
@@ -629,7 +629,7 @@ Interactive draft currently offers worker role kinds:
629
629
  - `research`
630
630
  - `security`
631
631
 
632
- Agentic planner payloads also accept `workerAgents[].roleKind = "design"`. The shipped `0.9.1` surface uses `design-pass` as the default executor profile for that role and typically assigns a packet path like `docs/plans/waves/design/wave-<n>-<agentId>.md`. Interactive draft scaffolds the docs-first default; hybrid design stewards are authored by explicitly adding implementation-owned paths and the normal implementation contract sections.
632
+ Agentic planner payloads also accept `workerAgents[].roleKind = "design"`. The shipped `0.9.2` surface uses `design-pass` as the default executor profile for that role and typically assigns a packet path like `docs/plans/waves/design/wave-<n>-<agentId>.md`. Interactive draft scaffolds the docs-first default; hybrid design stewards are authored by explicitly adding implementation-owned paths and the normal implementation contract sections.
633
633
 
634
634
  ## Ad-Hoc Task Commands
635
635
 
@@ -36,6 +36,8 @@ At runtime, those distinctions map onto separate modules:
36
36
 
37
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
38
 
39
+ If `externalProviders.corridor.enabled` is on, Wave also materializes a normalized Corridor artifact before security and integration run. Security review still owns the human-readable report and `[wave-security]` marker, but the security gate can fail closed when the saved Corridor artifact reports a fetch failure or matched blocking findings on implementation-owned paths.
40
+
39
41
  ## Durable State Surfaces
40
42
 
41
43
  The runtime writes several different artifacts, but they do different jobs:
@@ -56,6 +58,12 @@ The runtime writes several different artifacts, but they do different jobs:
56
58
  `.tmp/<lane>-wave-launcher/inboxes/wave-<n>/<agent>.md`
57
59
  - integration summary:
58
60
  `.tmp/<lane>-wave-launcher/integration/wave-<n>.json`
61
+ - security summary:
62
+ `.tmp/<lane>-wave-launcher/security/wave-<n>.json`
63
+ - security markdown summary:
64
+ `.tmp/<lane>-wave-launcher/security/wave-<n>.md`
65
+ - Corridor security context:
66
+ `.tmp/<lane>-wave-launcher/security/wave-<n>-corridor.json`
59
67
  - wave dashboard:
60
68
  `.tmp/<lane>-wave-launcher/dashboards/wave-<n>.json`
61
69
  - run-state:
@@ -134,7 +142,7 @@ Practical rule:
134
142
 
135
143
  That means a targeted helper request only blocks while it remains open *and* still has blocking severity in coordination state.
136
144
 
137
- For the practical `0.9.1` recommendation on when to keep records blocking versus when to downgrade them to `soft`, `stale`, or `advisory`, see [../guides/recommendations-0.9.1.md](../guides/recommendations-0.9.1.md).
145
+ For the practical `0.9.2` recommendation on when to keep records blocking versus when to downgrade them to `soft`, `stale`, or `advisory`, see [../guides/recommendations-0.9.2.md](../guides/recommendations-0.9.2.md).
138
146
 
139
147
  This page is documenting runtime semantics first. The important contract is that closure follows the durable coordination state, not that a particular human or agent used one exact command path to mutate it.
140
148
 
@@ -392,6 +400,15 @@ If present, security review must emit a final `[wave-security]` marker and publi
392
400
  - `concerns` remains visible in summaries and traces
393
401
  - `clear` is only valid when no unresolved findings or approvals remain
394
402
 
403
+ Corridor does not replace that review. When `externalProviders.corridor.enabled` is on:
404
+
405
+ - Wave first materializes the normalized Corridor artifact
406
+ - `requiredAtClosure: true` turns provider fetch failures into `corridor-fetch-failed`
407
+ - matched findings at or above the configured threshold turn the gate into `corridor-blocked`
408
+ - matched findings still stay visible in security and integration summaries even when the human reviewer reports only advisory concerns
409
+
410
+ Only implementation-owned non-doc, non-`.tmp/`, non-markdown paths are eligible for Corridor matching. See [corridor.md](./corridor.md) for the provider-specific rules.
411
+
395
412
  ### Integration
396
413
 
397
414
  Integration must reconcile cross-agent state and report `ready-for-doc-closure` only when there is no remaining meaningful contradiction, blocker, proof gap, or deploy risk.
@@ -411,9 +428,9 @@ The important distinction is:
411
428
  `cont-QA` must emit:
412
429
 
413
430
  - a final verdict
414
- - a final `[wave-gate]` marker
431
+ - a final `[wave-gate]` marker with each of the five gate dimensions (architecture, integration, durability, live, docs) set to `pass`, `concerns`, `blocked`, or `gap`
415
432
 
416
- Final PASS requires all gate dimensions to pass in the final state.
433
+ Final PASS requires all gate dimensions to be `pass` or `gap` in the final state. A `gap` value means the dimension has a documented gap that is not an actionable blocker; it is treated as a conditional pass (`ok: true`, `statusCode: conditional-pass`) with detail text listing which dimensions have documented gaps.
417
434
 
418
435
  ## Why The Closure Model Works
419
436
 
@@ -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.