@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.
- package/CHANGELOG.md +52 -1
- package/LICENSE.md +21 -0
- package/README.md +20 -9
- package/docs/README.md +8 -4
- package/docs/agents/wave-security-role.md +1 -0
- package/docs/architecture/README.md +1 -1
- package/docs/concepts/operating-modes.md +1 -1
- package/docs/guides/author-and-run-waves.md +1 -1
- package/docs/guides/planner.md +2 -2
- package/docs/guides/{recommendations-0.9.1.md → recommendations-0.9.2.md} +7 -7
- package/docs/guides/recommendations-0.9.3.md +137 -0
- package/docs/guides/sandboxed-environments.md +2 -2
- package/docs/plans/current-state.md +8 -2
- package/docs/plans/end-state-architecture.md +1 -1
- package/docs/plans/examples/wave-example-design-handoff.md +1 -1
- package/docs/plans/examples/wave-example-live-proof.md +1 -1
- package/docs/plans/migration.md +65 -67
- package/docs/reference/cli-reference.md +1 -1
- package/docs/reference/coordination-and-closure.md +20 -3
- package/docs/reference/corridor.md +225 -0
- package/docs/reference/npmjs-token-publishing.md +2 -2
- package/docs/reference/package-publishing-flow.md +11 -11
- package/docs/reference/runtime-config/README.md +61 -3
- package/docs/reference/sample-waves.md +5 -5
- package/docs/reference/skills.md +1 -1
- package/docs/reference/wave-control.md +358 -27
- package/docs/roadmap.md +12 -19
- package/package.json +1 -1
- package/releases/manifest.json +44 -3
- package/scripts/wave-cli-bootstrap.mjs +52 -1
- package/scripts/wave-orchestrator/agent-state.mjs +26 -9
- package/scripts/wave-orchestrator/config.mjs +199 -3
- package/scripts/wave-orchestrator/context7.mjs +231 -29
- package/scripts/wave-orchestrator/coordination.mjs +15 -1
- package/scripts/wave-orchestrator/corridor.mjs +363 -0
- package/scripts/wave-orchestrator/derived-state-engine.mjs +38 -1
- package/scripts/wave-orchestrator/gate-engine.mjs +20 -0
- package/scripts/wave-orchestrator/install.mjs +34 -1
- package/scripts/wave-orchestrator/launcher-runtime.mjs +111 -7
- package/scripts/wave-orchestrator/launcher.mjs +21 -3
- package/scripts/wave-orchestrator/planner.mjs +30 -0
- package/scripts/wave-orchestrator/projection-writer.mjs +23 -0
- package/scripts/wave-orchestrator/provider-runtime.mjs +104 -0
- package/scripts/wave-orchestrator/shared.mjs +1 -0
- package/scripts/wave-orchestrator/traces.mjs +25 -0
- package/scripts/wave-orchestrator/wave-control-client.mjs +14 -1
package/docs/plans/migration.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Migration
|
|
2
2
|
|
|
3
|
-
This page is the practical repo-upgrade guide for the current `0.9.
|
|
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.
|
|
15
|
+
## What `0.9.3` Changes
|
|
16
16
|
|
|
17
|
-
The current `0.9.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
173
|
+
## `0.9.3` Release Model
|
|
150
174
|
|
|
151
|
-
The current `0.9.
|
|
175
|
+
The current `0.9.3` surface combines these strands:
|
|
152
176
|
|
|
153
|
-
- the
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
131
|
-
git push -u origin release/0.9.
|
|
132
|
-
gh pr create --base main --head release/0.9.
|
|
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.
|
|
142
|
-
git push origin v0.9.
|
|
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.
|
|
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.
|
|
215
|
+
"version": "0.9.2",
|
|
216
216
|
"dist-tags": {
|
|
217
|
-
"latest": "0.9.
|
|
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.
|
|
235
|
-
git push origin refs/tags/v0.9.
|
|
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.
|