@chllming/wave-orchestration 0.8.9 → 0.9.1

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 (75) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +135 -18
  3. package/docs/README.md +9 -3
  4. package/docs/architecture/README.md +1498 -0
  5. package/docs/concepts/context7-vs-skills.md +1 -1
  6. package/docs/concepts/operating-modes.md +3 -3
  7. package/docs/concepts/what-is-a-wave.md +1 -1
  8. package/docs/guides/author-and-run-waves.md +27 -4
  9. package/docs/guides/monorepo-projects.md +226 -0
  10. package/docs/guides/planner.md +10 -3
  11. package/docs/guides/{recommendations-0.8.9.md → recommendations-0.9.1.md} +8 -7
  12. package/docs/guides/sandboxed-environments.md +158 -0
  13. package/docs/guides/terminal-surfaces.md +14 -12
  14. package/docs/plans/current-state.md +11 -7
  15. package/docs/plans/end-state-architecture.md +3 -1
  16. package/docs/plans/examples/wave-example-design-handoff.md +3 -1
  17. package/docs/plans/examples/wave-example-live-proof.md +6 -1
  18. package/docs/plans/examples/wave-example-rollout-fidelity.md +2 -0
  19. package/docs/plans/migration.md +48 -18
  20. package/docs/plans/sandbox-end-state-architecture.md +153 -0
  21. package/docs/plans/wave-orchestrator.md +4 -4
  22. package/docs/reference/cli-reference.md +125 -57
  23. package/docs/reference/coordination-and-closure.md +1 -1
  24. package/docs/reference/github-packages-setup.md +1 -1
  25. package/docs/reference/migration-0.2-to-0.5.md +9 -7
  26. package/docs/reference/npmjs-token-publishing.md +53 -0
  27. package/docs/reference/npmjs-trusted-publishing.md +4 -50
  28. package/docs/reference/package-publishing-flow.md +272 -0
  29. package/docs/reference/runtime-config/README.md +140 -12
  30. package/docs/reference/sample-waves.md +100 -5
  31. package/docs/reference/skills.md +1 -1
  32. package/docs/reference/wave-control.md +23 -5
  33. package/docs/roadmap.md +43 -201
  34. package/package.json +1 -1
  35. package/releases/manifest.json +38 -0
  36. package/scripts/wave-orchestrator/adhoc.mjs +49 -17
  37. package/scripts/wave-orchestrator/agent-process-runner.mjs +344 -0
  38. package/scripts/wave-orchestrator/agent-state.mjs +0 -1
  39. package/scripts/wave-orchestrator/artifact-schemas.mjs +7 -0
  40. package/scripts/wave-orchestrator/autonomous.mjs +96 -29
  41. package/scripts/wave-orchestrator/benchmark-external.mjs +23 -7
  42. package/scripts/wave-orchestrator/benchmark.mjs +33 -10
  43. package/scripts/wave-orchestrator/closure-engine.mjs +138 -17
  44. package/scripts/wave-orchestrator/config.mjs +239 -24
  45. package/scripts/wave-orchestrator/control-cli.mjs +71 -28
  46. package/scripts/wave-orchestrator/coord-cli.mjs +22 -14
  47. package/scripts/wave-orchestrator/coordination-store.mjs +8 -0
  48. package/scripts/wave-orchestrator/dashboard-renderer.mjs +123 -44
  49. package/scripts/wave-orchestrator/dep-cli.mjs +47 -21
  50. package/scripts/wave-orchestrator/derived-state-engine.mjs +6 -3
  51. package/scripts/wave-orchestrator/feedback.mjs +28 -11
  52. package/scripts/wave-orchestrator/gate-engine.mjs +106 -38
  53. package/scripts/wave-orchestrator/human-input-resolution.mjs +5 -1
  54. package/scripts/wave-orchestrator/install.mjs +13 -0
  55. package/scripts/wave-orchestrator/launcher-progress.mjs +91 -0
  56. package/scripts/wave-orchestrator/launcher-runtime.mjs +179 -68
  57. package/scripts/wave-orchestrator/launcher.mjs +222 -53
  58. package/scripts/wave-orchestrator/ledger.mjs +7 -2
  59. package/scripts/wave-orchestrator/planner.mjs +48 -27
  60. package/scripts/wave-orchestrator/project-profile.mjs +31 -8
  61. package/scripts/wave-orchestrator/projection-writer.mjs +13 -1
  62. package/scripts/wave-orchestrator/proof-cli.mjs +18 -12
  63. package/scripts/wave-orchestrator/reducer-snapshot.mjs +6 -0
  64. package/scripts/wave-orchestrator/retry-cli.mjs +19 -13
  65. package/scripts/wave-orchestrator/retry-control.mjs +3 -3
  66. package/scripts/wave-orchestrator/retry-engine.mjs +93 -6
  67. package/scripts/wave-orchestrator/role-helpers.mjs +30 -0
  68. package/scripts/wave-orchestrator/session-supervisor.mjs +94 -85
  69. package/scripts/wave-orchestrator/shared.mjs +77 -14
  70. package/scripts/wave-orchestrator/supervisor-cli.mjs +1306 -0
  71. package/scripts/wave-orchestrator/terminals.mjs +12 -32
  72. package/scripts/wave-orchestrator/tmux-adapter.mjs +300 -0
  73. package/scripts/wave-orchestrator/wave-control-client.mjs +84 -16
  74. package/scripts/wave-orchestrator/wave-files.mjs +43 -6
  75. package/scripts/wave.mjs +13 -0
@@ -13,7 +13,7 @@ The active context for an agent is assembled from multiple layers:
13
13
  - repository source and the wave's owned files
14
14
  - wave markdown and shared plan docs
15
15
  - generated shared summary and per-agent inbox
16
- - saved project defaults such as `.wave/project-profile.json`
16
+ - saved project defaults such as `.wave/project-profile.json` for the implicit default project, or `.wave/projects/<projectId>/project-profile.json` for explicit projects
17
17
  - resolved repo-owned skills
18
18
  - selected Context7 snippets for external library truth
19
19
  - generated runtime overlays and launch artifacts
@@ -11,7 +11,7 @@ Today that posture is captured in project profile memory and planner output. The
11
11
  - `dark-factory`
12
12
  The goal is end-to-end execution without routine human intervention.
13
13
 
14
- These values are stored in `.wave/project-profile.json` and emitted into planner-generated specs and wave markdown.
14
+ These values are stored in `.wave/project-profile.json` for the implicit default project, or `.wave/projects/<projectId>/project-profile.json` for explicit projects, and emitted into planner-generated specs and wave markdown.
15
15
 
16
16
  ## What Ships Today
17
17
 
@@ -82,10 +82,10 @@ That usually means:
82
82
 
83
83
  ## Relationship To The Roadmap
84
84
 
85
- The roadmap still includes stronger explicit oversight vs dark-factory workflows. What is shipped today is the planning foundation:
85
+ The current roadmap is a release-direction document, not a backlog of planner phases. What is shipped today is still the planning foundation:
86
86
 
87
87
  - stored project defaults
88
88
  - typed values in planner output
89
89
  - better environment modeling
90
90
 
91
- The stricter execution semantics are the next step, not a hidden already-finished feature.
91
+ The stricter execution semantics are still future work, not a hidden already-finished feature in `0.9.1`.
@@ -160,7 +160,7 @@ The active context for an agent is assembled from:
160
160
 
161
161
  - repository source and owned files
162
162
  - wave markdown and shared plan docs
163
- - saved project defaults such as `.wave/project-profile.json`
163
+ - saved project defaults such as `.wave/project-profile.json` for the implicit default project, or `.wave/projects/<projectId>/project-profile.json` for explicit projects
164
164
  - the generated shared summary and the agent's inbox
165
165
  - resolved skills and runtime-specific skill projections
166
166
  - selected Context7 snippets for external library truth
@@ -13,6 +13,13 @@ pnpm exec wave project setup
13
13
  pnpm exec wave project show --json
14
14
  ```
15
15
 
16
+ In a monorepo, run the same setup per project:
17
+
18
+ ```bash
19
+ pnpm exec wave project setup --project backend
20
+ pnpm exec wave project show --project backend --json
21
+ ```
22
+
16
23
  The saved project profile remembers:
17
24
 
18
25
  - default oversight mode
@@ -31,6 +38,12 @@ Generate a structured draft:
31
38
  pnpm exec wave draft --wave 1 --template implementation
32
39
  ```
33
40
 
41
+ For an explicit monorepo project:
42
+
43
+ ```bash
44
+ pnpm exec wave draft --project backend --lane main --wave 1 --template implementation
45
+ ```
46
+
34
47
  The planner writes two artifacts:
35
48
 
36
49
  - `docs/plans/waves/specs/wave-<n>.json`
@@ -61,7 +74,7 @@ Good fits:
61
74
  - multi-owner waves where downstream implementers need the same decisions and assumptions
62
75
  - ambiguous tasks where open questions should become explicit before code owners fan out
63
76
 
64
- The starter contract in `0.8.9` is:
77
+ The starter contract in `0.9.1` is:
65
78
 
66
79
  - import `docs/agents/wave-design-role.md`
67
80
  - own one packet such as `docs/plans/waves/design/wave-<n>-<agentId>.md`
@@ -88,12 +101,12 @@ Human feedback is an escalation path, not the operating mode itself. The orchest
88
101
 
89
102
  ## 4. Choose The Operator Surface
90
103
 
91
- Live runs always execute in `tmux`. The terminal surface only decides how you attach:
104
+ Live agent runs now execute in detached process runners. The terminal surface only decides how you follow logs and attach to dashboard projections:
92
105
 
93
106
  - `vscode`
94
- VS Code gets temporary attach entries for the live tmux sessions.
107
+ VS Code gets temporary attach entries for process-backed agent logs and dashboard projections.
95
108
  - `tmux`
96
- Terminal-native operation with no VS Code integration.
109
+ Terminal-native dashboard and operator projection surface with no VS Code integration.
97
110
  - `none`
98
111
  Dry-run only.
99
112
 
@@ -103,6 +116,16 @@ Recommended defaults:
103
116
  - remote shell or devbox: `tmux`
104
117
  - CI or validation-only work: `none` with `--dry-run`
105
118
 
119
+ If the surrounding environment is the unstable part, not the repo itself, prefer the sandbox-safe path:
120
+
121
+ - `wave submit`
122
+ - `wave supervise`
123
+ - `wave status`
124
+ - `wave wait`
125
+ - `wave attach`
126
+
127
+ That is the right fit for LEAPclaw, OpenClaw, Nemoshell, Docker, and similar short-lived exec shells. Use direct `wave launch` when the client shell itself can stay alive for the entire wave. For the concrete setup patterns, read [sandboxed-environments.md](./sandboxed-environments.md).
128
+
106
129
  ## 5. Dry-Run Before Live Execution
107
130
 
108
131
  Treat dry-run as the quality gate for the authored wave:
@@ -0,0 +1,226 @@
1
+ # Monorepo Projects Guide
2
+
3
+ Use this guide when one repository needs multiple independent Wave tracks.
4
+
5
+ Wave now supports:
6
+
7
+ - `defaultProject`
8
+ - `projects.<projectId>`
9
+ - project-scoped lanes
10
+ - project-scoped planner memory
11
+ - project-scoped ad-hoc runs
12
+ - project-scoped launcher state and telemetry
13
+
14
+ ## What A Project Means
15
+
16
+ A Wave project is the namespace above lanes.
17
+
18
+ - a project owns its own `lanes`
19
+ - a project can relocate its docs root with `rootDir`
20
+ - a project can override planner, runtime, skills, and Wave Control settings
21
+ - a project gets isolated runtime state when it is explicit in `wave.config.json`
22
+
23
+ That isolation is what lets one checkout run multiple project/lane/wave tracks without tmux, telemetry, ad-hoc storage, or planner-profile collisions.
24
+
25
+ ## Minimal Config
26
+
27
+ ```json
28
+ {
29
+ "defaultProject": "app",
30
+ "projects": {
31
+ "app": {
32
+ "rootDir": ".",
33
+ "lanes": {
34
+ "main": {}
35
+ }
36
+ },
37
+ "service": {
38
+ "rootDir": "services/api",
39
+ "lanes": {
40
+ "main": {}
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ Rules:
48
+
49
+ - `defaultProject` is used when you omit `--project`
50
+ - `projects.<projectId>.rootDir` changes that project's default docs root
51
+ - `projects.<projectId>.paths.*` overrides that project's docs, launcher-state, terminal-registry, benchmark-catalog, and component-matrix paths
52
+ - `projects.<projectId>.lanes.<lane>` is the authoritative lane map for that project
53
+ - legacy top-level `lanes` still work as the implicit default-project compatibility layer
54
+ - an explicit unknown `--project` now fails fast instead of silently falling back to the default project
55
+
56
+ Supported `projects.<projectId>.paths.*` fields:
57
+
58
+ - `docsDir`
59
+ - `stateRoot`
60
+ - `orchestratorStateDir`
61
+ - `terminalsPath`
62
+ - `context7BundleIndexPath`
63
+ - `benchmarkCatalogPath`
64
+ - `componentCutoverMatrixDocPath`
65
+ - `componentCutoverMatrixJsonPath`
66
+
67
+ Path precedence is:
68
+
69
+ 1. lane-specific override such as `projects.<projectId>.lanes.<lane>.terminalsPath`
70
+ 2. `projects.<projectId>.paths.*`
71
+ 3. repo-global `paths.*`
72
+ 4. the built-in lane default for derived docs, plans, waves, and matrix paths
73
+
74
+ ## Advanced Config
75
+
76
+ Use a fuller project block when different projects need isolated docs roots, terminal registries, telemetry ids, or runtime-policy defaults:
77
+
78
+ ```json
79
+ {
80
+ "defaultProject": "app",
81
+ "paths": {
82
+ "stateRoot": ".tmp",
83
+ "terminalsPath": ".vscode/terminals.json"
84
+ },
85
+ "projects": {
86
+ "app": {
87
+ "rootDir": ".",
88
+ "lanes": {
89
+ "main": {}
90
+ }
91
+ },
92
+ "service": {
93
+ "rootDir": "services/api",
94
+ "paths": {
95
+ "docsDir": "services/api/docs",
96
+ "stateRoot": ".tmp/service-wave",
97
+ "orchestratorStateDir": ".tmp/service-orchestrator",
98
+ "terminalsPath": ".vscode/service-terminals.json",
99
+ "context7BundleIndexPath": "services/api/docs/context7/bundles.json",
100
+ "benchmarkCatalogPath": "services/api/docs/evals/benchmark-catalog.json",
101
+ "componentCutoverMatrixDocPath": "services/api/docs/plans/component-cutover-matrix.md",
102
+ "componentCutoverMatrixJsonPath": "services/api/docs/plans/component-cutover-matrix.json"
103
+ },
104
+ "waveControl": {
105
+ "projectId": "service-api",
106
+ "reportMode": "metadata-plus-selected"
107
+ },
108
+ "lanes": {
109
+ "main": {
110
+ "runtimePolicy": {
111
+ "defaultExecutorByRole": {
112
+ "design": "claude",
113
+ "implementation": "codex",
114
+ "integration": "claude",
115
+ "documentation": "claude",
116
+ "cont-qa": "claude",
117
+ "cont-eval": "codex"
118
+ },
119
+ "runtimeMixTargets": {
120
+ "codex": 4,
121
+ "claude": 3,
122
+ "opencode": 1
123
+ },
124
+ "fallbackExecutorOrder": ["claude", "opencode", "codex"]
125
+ }
126
+ },
127
+ "release": {
128
+ "docsDir": "services/api/docs/release",
129
+ "plansDir": "services/api/docs/release/plans",
130
+ "wavesDir": "services/api/docs/release/plans/waves"
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ## Where State Lives
139
+
140
+ Implicit default project:
141
+
142
+ - planner profile: `.wave/project-profile.json`
143
+ - ad-hoc runs: `.wave/adhoc/default/runs/<run-id>/`
144
+ - launcher state: `.tmp/<lane>-wave-launcher/`
145
+
146
+ Explicit projects:
147
+
148
+ - planner profile: `.wave/projects/<projectId>/project-profile.json`
149
+ - ad-hoc runs: `.wave/adhoc/<projectId>/runs/<run-id>/`
150
+ - launcher state: `.tmp/projects/<projectId>/<lane>-wave-launcher/`
151
+
152
+ Project-scoped tmux session names, terminal prefixes, and telemetry spools derive from that same project id.
153
+
154
+ If a project overrides `stateRoot` or `terminalsPath`, those derived runtime locations move with it. For example, the `service` project above writes launcher state under `.tmp/service-wave/projects/service/<lane>-wave-launcher/` and keeps its VS Code terminal registry in `.vscode/service-terminals.json`.
155
+
156
+ ## Common Commands
157
+
158
+ Set project defaults:
159
+
160
+ ```bash
161
+ pnpm exec wave project setup --project service
162
+ pnpm exec wave project show --project service --json
163
+ ```
164
+
165
+ Draft and dry-run:
166
+
167
+ ```bash
168
+ pnpm exec wave draft --project service --lane main --wave 1 --template implementation
169
+ pnpm exec wave launch --project service --lane main --dry-run --no-dashboard
170
+ ```
171
+
172
+ Control and inspection:
173
+
174
+ ```bash
175
+ pnpm exec wave control status --project service --lane main --wave 0 --json
176
+ pnpm exec wave coord show --project service --lane main --wave 0 --json
177
+ pnpm exec wave dep show --project service --lane main --wave 0 --json
178
+ pnpm exec wave dashboard --project service --lane main --attach current
179
+ ```
180
+
181
+ Ad-hoc work:
182
+
183
+ ```bash
184
+ pnpm exec wave adhoc plan --project service --lane main --task "Investigate release blocker"
185
+ pnpm exec wave adhoc run --project service --lane main --task "Patch the deploy script" --yes
186
+ ```
187
+
188
+ Benchmarks:
189
+
190
+ ```bash
191
+ pnpm exec wave benchmark run --project service --lane main --json
192
+ pnpm exec wave benchmark external-run --project service --lane main --adapter swe-bench-pro --dry-run --json
193
+ ```
194
+
195
+ ## Cross-Project Dependencies
196
+
197
+ Use owner and requester project metadata when the dependency crosses project boundaries:
198
+
199
+ ```bash
200
+ pnpm exec wave dep post \
201
+ --owner-project service --owner-lane main \
202
+ --requester-project app --requester-lane release \
203
+ --owner-wave 0 --requester-wave 2 \
204
+ --agent launcher \
205
+ --summary "Need API contract landed before release wave 2"
206
+ ```
207
+
208
+ Dependency tickets are stored under the owner project's scoped dependency directory and carry both owner and requester project metadata.
209
+
210
+ ## Telemetry Defaults
211
+
212
+ Packaged defaults:
213
+
214
+ - endpoint: `https://wave-control.up.railway.app/api/v1`
215
+ - enabled: `true`
216
+ - report mode: `metadata-only`
217
+
218
+ By default, repos using the packaged surface send project, lane, wave, run, proof, and benchmark metadata to the author's Wave Control endpoint. This is a personal project default, not a neutral hosted default.
219
+
220
+ Opt out explicitly with any of:
221
+
222
+ - `waveControl.enabled: false`
223
+ - `waveControl.reportMode: "disabled"`
224
+ - `pnpm exec wave launch --project service --lane main --no-telemetry`
225
+
226
+ Project-scoped telemetry identity defaults to the resolved `projectId` first, then lane and wave metadata from the active run.
@@ -6,7 +6,7 @@ If you want the full author-to-launch workflow, start with [author-and-run-waves
6
6
 
7
7
  It reduces repeated setup questions, stores project defaults, and generates wave specs plus markdown that already fit the launcher.
8
8
 
9
- The published `0.8.9` package already includes the optional `design` worker role for pre-implementation design packets. This guide calls out where that affects drafting.
9
+ The published `0.9.1` package already includes the optional `design` worker role for pre-implementation design packets. This guide calls out where that affects drafting.
10
10
 
11
11
  ## What Ships Today
12
12
 
@@ -17,7 +17,7 @@ The published `0.8.9` package already includes the optional `design` worker role
17
17
  - planner run review via `wave draft --show-run <run-id>`
18
18
  - explicit materialization via `wave draft --apply-run <run-id>`
19
19
  - worker role kinds including optional `design`
20
- - persistent project memory in `.wave/project-profile.json`
20
+ - persistent project memory in `.wave/project-profile.json` for the implicit default project, or `.wave/projects/<projectId>/project-profile.json` for explicit projects
21
21
  - transient planner packets in `.wave/planner/runs/<run-id>/`
22
22
  - planner-run Context7 injection via `planner.agentic.context7Bundle`
23
23
  - JSON specs in `docs/plans/waves/specs/wave-<n>.json`
@@ -48,7 +48,7 @@ pnpm exec wave launch --lane main --dry-run --no-dashboard
48
48
  - forward replanning of later waves
49
49
  - separate runtime enforcement for oversight vs dark-factory
50
50
 
51
- Those remain roadmap work. The planner foundation is about better structured authoring, not a second execution engine.
51
+ Those remain future work outside the current `0.9.1` release line. The planner foundation is about better structured authoring, not a second execution engine.
52
52
 
53
53
  ## Project Profile
54
54
 
@@ -59,6 +59,13 @@ pnpm exec wave project setup
59
59
  pnpm exec wave project show --json
60
60
  ```
61
61
 
62
+ For monorepos, scope that memory explicitly:
63
+
64
+ ```bash
65
+ pnpm exec wave project setup --project backend
66
+ pnpm exec wave project show --project backend --json
67
+ ```
68
+
62
69
  The saved profile remembers:
63
70
 
64
71
  - whether the repo is a new project
@@ -1,21 +1,22 @@
1
1
  ---
2
- title: "0.8.9 Recommendations"
3
- summary: "How to use 0.8.9's softer blocker states, advisory turn budgets, and targeted recovery without weakening proof and closure."
2
+ title: "0.9.1 Recommendations"
3
+ summary: "How to use 0.9.1's softer blocker states, advisory turn budgets, and targeted recovery without weakening proof and closure."
4
4
  ---
5
5
 
6
- # 0.8.9 Recommendations
6
+ # 0.9.1 Recommendations
7
7
 
8
- Use this guide when you are adopting `0.8.9` and want one practical operating stance for the softer blocker states, advisory turn-budget behavior, and targeted recovery flow that the current package line ships.
8
+ Use this guide when you are adopting `0.9.1` and want one practical operating stance for the softer blocker states, advisory turn-budget behavior, and targeted recovery flow that the current package line ships.
9
9
 
10
10
  ## Recommended Default
11
11
 
12
- For most repos, the safest `0.8.9` default is:
12
+ For most repos, the safest `0.9.1` default is:
13
13
 
14
14
  - bound work with `budget.minutes`
15
15
  - leave generic `budget.turns` as advisory metadata
16
16
  - author non-proof follow-up as `soft`, `stale`, or `advisory` instead of silently treating every open record as a hard blocker
17
17
  - use `resolve-policy` when the answer already exists in repo policy or shipped docs
18
18
  - prefer targeted rerun or resume after timeout, max-turn, rate-limit, or missing-status outcomes instead of relaunching the whole wave
19
+ - in short-lived sandboxes, prefer `wave submit`, `wave supervise`, `wave status`, and `wave wait` instead of binding the full run to one client shell
19
20
 
20
21
  That recommendation matches the runtime:
21
22
 
@@ -75,7 +76,7 @@ Only set a hard runtime ceiling when you deliberately want the runtime itself to
75
76
 
76
77
  ## 2. Softer Coordination States
77
78
 
78
- `0.8.9` keeps “still visible” separate from “still blocking”.
79
+ `0.9.1` keeps “still visible” separate from “still blocking”.
79
80
 
80
81
  Use these states intentionally:
81
82
 
@@ -111,7 +112,7 @@ If the current wave cannot truthfully close without the answer, keep it blocking
111
112
 
112
113
  ## 4. Recovery Recommendation
113
114
 
114
- My recommendation after reviewing the current `0.8.9` code path is:
115
+ My recommendation after reviewing the current `0.9.1` code path is:
115
116
 
116
117
  - let timeout, max-turn, rate-limit, and missing-status failures go through the built-in targeted recovery path first
117
118
  - inspect the queued rerun or resume request before manually relaunching the whole wave
@@ -0,0 +1,158 @@
1
+ # Running Wave In Sandboxed Environments
2
+
3
+ Use this guide when Wave is running under a short-lived shell or exec environment rather than a normal long-lived operator shell.
4
+
5
+ Typical examples:
6
+
7
+ - LEAPclaw or OpenClaw-style agent harnesses that give you short `exec` windows
8
+ - Nemoshell or similar hosted terminal sandboxes
9
+ - Docker or devcontainer setups where the client process is disposable but the workspace and state volume persist
10
+
11
+ The core rule in `0.9.1` is simple:
12
+
13
+ - clients should be short-lived
14
+ - supervision should be long-lived
15
+ - agent execution should be process-backed, not tmux-backed
16
+
17
+ Wave now launches agents through detached process runners by default, which lowers tmux session churn and memory pressure compared with the old “every live agent owns a tmux session” shape. Tmux is now optional and dashboard-only.
18
+
19
+ ## Recommended Model
20
+
21
+ For sandboxes, prefer the async supervisor surface:
22
+
23
+ ```bash
24
+ pnpm exec wave submit ...
25
+ pnpm exec wave supervise ...
26
+ pnpm exec wave status ...
27
+ pnpm exec wave wait ...
28
+ pnpm exec wave attach ...
29
+ ```
30
+
31
+ Use direct `wave launch` when:
32
+
33
+ - you control a normal long-lived shell
34
+ - the launcher process can stay alive for the whole run
35
+ - you are doing local debugging or dry-run validation
36
+
37
+ Do not bind a multi-hour wave to one short-lived sandbox client process.
38
+
39
+ ## Baseline Configuration
40
+
41
+ Set the Codex sandbox default in `wave.config.json` for the lane or executor profile instead of retyping `--codex-sandbox` on every command.
42
+
43
+ Typical sandbox-safe pattern:
44
+
45
+ ```json
46
+ {
47
+ "executors": {
48
+ "codex": {
49
+ "sandbox": "workspace-write"
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ Use a stricter mode such as `read-only` when the task truly should not write. Use `danger-full-access` only when the outer environment is already providing the isolation you want.
56
+
57
+ Treat `tmux` as optional:
58
+
59
+ - install it only if you want live dashboard attach
60
+ - use `--no-dashboard` in constrained environments when you do not need the extra projection process
61
+
62
+ ## LEAPclaw / OpenClaw / Nemoshell Pattern
63
+
64
+ In these environments, the common failure mode is a short-lived client exec timeout while the wave itself needs much longer.
65
+
66
+ Preferred shape:
67
+
68
+ 1. A disposable client submits work.
69
+ 2. A durable daemon owns the run.
70
+ 3. Clients poll or wait observationally.
71
+
72
+ Example:
73
+
74
+ ```bash
75
+ runId=$(pnpm exec wave submit \
76
+ --project backend \
77
+ --lane main \
78
+ --start-wave 2 \
79
+ --end-wave 2 \
80
+ --no-dashboard \
81
+ --json | jq -r .runId)
82
+
83
+ pnpm exec wave status --run-id "$runId" --project backend --lane main --json
84
+ pnpm exec wave wait --run-id "$runId" --project backend --lane main --timeout-seconds 300 --json
85
+ ```
86
+
87
+ Keep `wave supervise` alive outside the short-lived client call:
88
+
89
+ - a long-lived host shell
90
+ - a background service
91
+ - a job runner that can outlive the client request
92
+
93
+ If the sandbox only gives you short exec windows, `wave autonomous` should not be the thing owning the run. Use submit plus observe instead.
94
+
95
+ ## Docker And Containerized Setups
96
+
97
+ Docker works well with the `0.9.1` process-backed runner model, but only if the state directories survive container restarts.
98
+
99
+ Recommended container posture:
100
+
101
+ - mount the repo root as a persistent volume
102
+ - preserve `.tmp/` and `.wave/`
103
+ - run `wave supervise` in a long-lived container or sidecar
104
+ - use `wave submit/status/wait` from short-lived execs
105
+ - disable dashboards unless the image actually includes `tmux` and you want the extra process
106
+
107
+ Practical rules:
108
+
109
+ - dashboard attach is optional; log-follow attach is enough for most sandbox automation
110
+ - `wave attach --agent <id>` now follows the recorded log when no live interactive session exists
111
+ - `wave attach --dashboard` falls back to the last written dashboard file when no live dashboard session exists
112
+
113
+ ## Terminal Surface Recommendations
114
+
115
+ For constrained sandboxes:
116
+
117
+ - `--terminal-surface vscode`
118
+ Good when the repo is local and the editor integration is useful.
119
+ - `--terminal-surface tmux`
120
+ Good only when `tmux` is installed and you actually want live dashboard attach.
121
+ - `--terminal-surface none`
122
+ Dry-run only.
123
+
124
+ The important distinction is that terminal surface is now an operator preference, not the agent execution backend.
125
+
126
+ ## Validation Checklist
127
+
128
+ Run these after setup changes:
129
+
130
+ ```bash
131
+ pnpm exec wave doctor --json
132
+ pnpm exec wave launch --lane main --dry-run --no-dashboard
133
+ ```
134
+
135
+ For a sandboxed lane, also verify:
136
+
137
+ - `wave submit --json` returns a `runId`
138
+ - `wave status` and `wave wait` work with exact `--project` and `--lane`
139
+ - the supervisor run tree exists under `.tmp/.../control/supervisor/runs/<runId>/`
140
+ - dashboards are either intentionally disabled or intentionally backed by a real `tmux` install
141
+
142
+ ## When To Keep Using `wave launch`
143
+
144
+ Use `wave launch` directly when:
145
+
146
+ - you are on a normal workstation shell
147
+ - the launcher can stay alive for the entire run
148
+ - you want the fastest direct local workflow
149
+ - you are debugging wave behavior and want the simplest path
150
+
151
+ Use `wave submit` plus `wave supervise` when the surrounding environment, not the wave itself, is the unstable part.
152
+
153
+ ## Related Docs
154
+
155
+ - [author-and-run-waves.md](./author-and-run-waves.md)
156
+ - [terminal-surfaces.md](./terminal-surfaces.md)
157
+ - [../reference/cli-reference.md](../reference/cli-reference.md)
158
+ - [../plans/sandbox-end-state-architecture.md](../plans/sandbox-end-state-architecture.md)
@@ -6,15 +6,16 @@ Wave has separate concepts for execution substrate and operator surface.
6
6
 
7
7
  The important detail is:
8
8
 
9
- - live runs use `tmux` sessions
10
- - terminal surfaces control how operators attach to those sessions
9
+ - live agent runs use detached process runners
10
+ - terminal surfaces control how operators follow logs and attach to dashboard projections
11
+ - sandbox-safe submission and supervision are documented separately in [sandboxed-environments.md](./sandboxed-environments.md)
11
12
 
12
13
  ## The Three Terminal Surfaces
13
14
 
14
15
  - `vscode`
15
- The launcher writes temporary entries to `.vscode/terminals.json` so VS Code can attach to the tmux sessions.
16
+ The launcher writes temporary entries to `.vscode/terminals.json` so VS Code can follow process-backed agent logs and attach to stable dashboard projections.
16
17
  - `tmux`
17
- The launcher uses tmux only and never touches `.vscode/terminals.json`.
18
+ The launcher uses tmux only for dashboard and operator projection sessions and never touches `.vscode/terminals.json`.
18
19
  - `none`
19
20
  Dry-run only. No live terminal surface is allowed in this mode.
20
21
 
@@ -22,12 +23,12 @@ The important detail is:
22
23
 
23
24
  `vscode` is not a second process host. It is a convenience attachment surface.
24
25
 
25
- The actual live sessions still run in tmux. The VS Code terminal registry just exposes stable attach commands for those tmux sessions.
26
+ The actual live agent work runs in detached processes. The VS Code terminal registry exposes stable log-follow commands for agents plus stable attach commands for dashboard projections.
26
27
 
27
28
  Use `vscode` when:
28
29
 
29
30
  - your main operator flow is inside VS Code
30
- - you want one-click attach behavior for agent sessions and dashboards
31
+ - you want one-click attach behavior for agent logs and dashboards
31
32
  - touching `.vscode/terminals.json` is acceptable in the repo
32
33
 
33
34
  ## What `tmux` Really Means
@@ -47,7 +48,7 @@ By default the launcher can start per-wave dashboard sessions in tmux.
47
48
 
48
49
  Wave now maintains stable tmux attach targets for both the current-wave dashboard and the global dashboard on the lane socket.
49
50
 
50
- Wave-agent sessions and the resident orchestrator now also use stable per-wave tmux session names. A relaunch reuses the same session identity for that wave instead of creating a new run-tagged session name each time, which reduces stale session buildup after launcher crashes or interrupted retries.
51
+ Wave agent execution no longer depends on tmux. `wave attach --agent` uses a live interactive session only when the runtime explicitly exposes one; otherwise it follows the recorded agent log or prints the terminal log tail.
51
52
 
52
53
  Use:
53
54
 
@@ -56,18 +57,18 @@ pnpm exec wave dashboard --lane main --attach current
56
57
  pnpm exec wave dashboard --lane main --attach global
57
58
  ```
58
59
 
59
- Those commands work for both `tmux` and `vscode` terminal surfaces because the live sessions still run on the lane tmux socket.
60
+ Those commands work for both `tmux` and `vscode` terminal surfaces because the live dashboard projections still run on the lane tmux socket. If no live dashboard session exists, the attach command falls back to the last written dashboard JSON instead of failing immediately.
60
61
 
61
62
  When `--terminal-surface vscode` is active, Wave also maintains a stable current-wave dashboard terminal entry instead of creating a new wave-numbered dashboard attach target for every wave transition.
62
63
 
63
64
  Important flags:
64
65
 
65
66
  - `--no-dashboard`
66
- Disable the per-wave tmux dashboard session.
67
+ Disable the per-wave dashboard projection session.
67
68
  - `--cleanup-sessions`
68
- Kill lane tmux sessions after each wave. This is the default.
69
+ Kill lane tmux dashboard and projection sessions after each wave. This is the default.
69
70
  - `--keep-sessions`
70
- Preserve tmux sessions after the wave for inspection.
71
+ Preserve tmux dashboard and projection sessions after the wave for inspection.
71
72
  - `--keep-terminals`
72
73
  Keep temporary VS Code terminal entries instead of cleaning them up.
73
74
 
@@ -76,7 +77,8 @@ Important flags:
76
77
  - Use `vscode` for local interactive operator work when the temporary terminal registry is useful.
77
78
  - Use `tmux` for remote, CI-like, or editor-independent operation.
78
79
  - Use `none` only with `--dry-run`.
79
- - Prefer `wave dashboard --attach current|global` over manual `tmux -L <socket> attach ...` lookups.
80
+ - In constrained sandboxes or containers, treat dashboards as optional and prefer `--no-dashboard` unless `tmux` is installed and you actually want the extra projection process.
81
+ - Prefer `wave dashboard --attach current|global` over manual `tmux -L <socket> attach ...` lookups; it will fall back to the last written dashboard file when no live session exists.
80
82
  - Pair `--keep-sessions` with incident review or deep debugging, not as a default steady-state mode.
81
83
  - Pair `--no-dashboard` with scripted dry-runs or when the board and summaries are sufficient.
82
84