mandrel 1.68.0 → 1.70.0

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/.agents/README.md +1 -1
  2. package/.agents/docs/agentrc-reference.json +1 -2
  3. package/.agents/docs/configuration.md +2 -4
  4. package/.agents/docs/workflows.md +1 -1
  5. package/.agents/schemas/agentrc.schema.json +1 -5
  6. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +2 -1
  7. package/.agents/scripts/agents-update-preflight.js +235 -0
  8. package/.agents/scripts/apply-quality-bootstrap.js +79 -0
  9. package/.agents/scripts/audit-labels-bootstrap.js +52 -30
  10. package/.agents/scripts/audit-to-stories.js +54 -0
  11. package/.agents/scripts/bootstrap.js +13 -3
  12. package/.agents/scripts/epic-deliver-preflight.js +30 -13
  13. package/.agents/scripts/epic-deliver-prepare.js +40 -53
  14. package/.agents/scripts/epic-execute-record-wave.js +119 -133
  15. package/.agents/scripts/generate-config-docs.js +189 -94
  16. package/.agents/scripts/lib/audit-suite/findings.js +0 -4
  17. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +99 -0
  18. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +13 -5
  19. package/.agents/scripts/lib/baseline-snapshot.js +163 -4
  20. package/.agents/scripts/lib/baselines/refresh-service.js +13 -5
  21. package/.agents/scripts/lib/config/baselines.js +0 -20
  22. package/.agents/scripts/lib/config/explain.js +0 -2
  23. package/.agents/scripts/lib/config/limits.js +19 -8
  24. package/.agents/scripts/lib/config/temp-paths.js +0 -31
  25. package/.agents/scripts/lib/config-settings-schema.js +1 -2
  26. package/.agents/scripts/lib/crap-utils.js +281 -0
  27. package/.agents/scripts/lib/maintainability-utils.js +32 -9
  28. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -2
  29. package/.agents/scripts/lib/orchestration/epic-cleanup.js +11 -7
  30. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +6 -6
  31. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +11 -5
  32. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +203 -110
  33. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +38 -162
  34. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +3 -4
  35. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +16 -13
  36. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +10 -7
  37. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +37 -24
  38. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +0 -4
  39. package/.agents/scripts/lib/orchestration/manifest-builder.js +6 -0
  40. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +101 -70
  41. package/.agents/scripts/lib/orchestration/spec-renderer.js +42 -14
  42. package/.agents/scripts/lib/orchestration/ticket-lease.js +3 -0
  43. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +6 -2
  44. package/.agents/scripts/lib/orchestration/wave-record-io.js +18 -77
  45. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +78 -122
  46. package/.agents/scripts/lib/orchestration/wave-record-projection.js +21 -226
  47. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +18 -1
  48. package/.agents/scripts/lib/presentation/manifest-render-waves.js +77 -4
  49. package/.agents/scripts/lib/story-adjacency.js +14 -10
  50. package/.agents/scripts/lib/story-body/story-body.js +142 -65
  51. package/.agents/scripts/lib/templates/decomposer-prompts.js +23 -3
  52. package/.agents/scripts/lib/test-tiers.js +13 -7
  53. package/.agents/scripts/lib/wave-runner/ready-set.js +295 -0
  54. package/.agents/scripts/lib/wave-runner/tick.js +446 -216
  55. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +2 -1
  56. package/.agents/scripts/lib/workers/combined-mi-crap-worker.js +226 -0
  57. package/.agents/scripts/lint-label-vocabulary.js +1 -1
  58. package/.agents/scripts/providers/github/issues.js +48 -0
  59. package/.agents/scripts/providers/github.js +1 -0
  60. package/.agents/scripts/stories-wave-tick.js +262 -161
  61. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +6 -0
  62. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +108 -101
  63. package/.agents/skills/skills.index.json +2 -2
  64. package/.agents/workflows/agents-update.md +205 -28
  65. package/.agents/workflows/deliver.md +12 -9
  66. package/.agents/workflows/helpers/deliver-epic.md +126 -90
  67. package/.agents/workflows/helpers/deliver-stories.md +131 -85
  68. package/.agents/workflows/helpers/plan-epic.md +13 -10
  69. package/.agents/workflows/plan.md +1 -1
  70. package/README.md +20 -0
  71. package/docs/CHANGELOG.md +46 -0
  72. package/lib/cli/registry.js +49 -6
  73. package/lib/cli/update.js +335 -332
  74. package/package.json +16 -11
  75. package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +0 -91
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: >-
3
- npm-era upgrade wraparound for a Mandrel consumer. Runs `mandrel update`
3
+ npm-era upgrade wraparound for a Mandrel consumer. Runs `npx mandrel update`
4
4
  (resolve newest published version → install → re-materialize `.agents/` →
5
5
  migrate → doctor → surface changelog) as the single mechanical step, then
6
6
  walks the operator through the judgment wraparound the CLI deliberately
@@ -15,7 +15,7 @@ description: >-
15
15
  > **Upgrade owner.** The mechanical upgrade is owned end to end by the
16
16
  > [`mandrel update`](../../lib/cli/update.js) CLI under the npm distribution
17
17
  > model (`mandrel`, #3436/#3437). This workflow wraps that CLI: it
18
- > runs `mandrel update`, then walks the operator through the
18
+ > runs `npx mandrel update`, then walks the operator through the
19
19
  > **distribution-agnostic judgment steps** the CLI deliberately does **not**
20
20
  > perform — config reconciliation, the Epic #1386 quality-gate installs, the
21
21
  > permission-allowlist refresh, the consumer-side changelog reconciliation,
@@ -60,22 +60,105 @@ The upgrade contract:
60
60
  > **Persona**: `devops-engineer` · **Skills**:
61
61
  > `core/ci-cd-and-automation`, `core/documentation-and-adrs`
62
62
 
63
+ **Invocation form.** In a consumer project `mandrel` is a local
64
+ devDependency at `node_modules/.bin/mandrel` and is **not** on `PATH`, so a
65
+ bare `mandrel <subcommand>` fails with `command not found` before any of the
66
+ hardened CLI logic ([`lib/cli/update.js`](../../lib/cli/update.js)) runs.
67
+ Every **runnable** command in this workflow therefore uses the
68
+ `npx mandrel <subcommand>` form, matching [`README.md`](../../README.md).
69
+ Prose that names the CLI as a noun (e.g. "`mandrel update`'s sync step")
70
+ refers to the binary by name, not as a command to type — run it via the form
71
+ Step 0 selects. The exception is a project where `mandrel` is installed
72
+ **globally**: there, the bare form works and Step 0 says so.
73
+
74
+ ## Step 0 — Detect the install state and pick the invocation form
75
+
76
+ Before running the updater, detect how `mandrel` resolves in this project and
77
+ route to the matching invocation form. Run from the consumer repo root:
78
+
79
+ ```bash
80
+ # 1. Globally installed and on PATH?
81
+ command -v mandrel
82
+ # 2. Installed as a local devDependency?
83
+ ls node_modules/.bin/mandrel 2>/dev/null || npm ls mandrel
84
+ ```
85
+
86
+ Three real states, three routes:
87
+
88
+ | State | Detection | Invocation form |
89
+ | --------------------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------- |
90
+ | **Global install (on `PATH`)** | `command -v mandrel` prints a path | Bare `mandrel <subcommand>` works. |
91
+ | **Local devDependency (not on `PATH`)** | `command -v mandrel` is empty; `node_modules/.bin/mandrel` exists | Use `npx mandrel <subcommand>` (resolves the local bin). |
92
+ | **Not installed** | `command -v mandrel` empty **and** `node_modules/.bin/mandrel` absent | Run `npm install -D mandrel` first, then `npx mandrel`. |
93
+
94
+ The common consumer case is **local devDependency** — `npx mandrel` is the
95
+ default form the rest of this workflow uses. On a global install you may drop
96
+ the `npx` prefix; on a fresh project, install the package first. The `npx`
97
+ form is harmless on a global install too (it prefers the local bin and falls
98
+ back to a one-off fetch), so when unsure, use `npx mandrel`.
99
+
100
+ ## Step 0.5 — First-run preflight (before any bump)
101
+
102
+ Before running the updater, run the first-run preflight. It catches three
103
+ day-0 failure modes — **wrong project**, a **dirty git index**, and being
104
+ **offline** — before `npx mandrel update` bumps anything. Run from the
105
+ consumer repo root:
106
+
107
+ ```bash
108
+ node .agents/scripts/agents-update-preflight.js
109
+ ```
110
+
111
+ The preflight runs three checks and prints a JSON envelope
112
+ (`{ ok, blocked, findings[] }`) on stdout plus a human-readable report:
113
+
114
+ | Check | Severity | What it verifies |
115
+ | ------------------ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
116
+ | **consumer-shape** | **blocker** (exit 2) | `package.json` lists `mandrel` as a dependency **and** a `.agents/` directory exists. Hard-stops in the framework repo itself or any non-consumer project. |
117
+ | **dirty-index** | warn-only | The git index has no pre-existing staged changes. `mandrel update` leaves the lockfile staged and Step 5 would otherwise sweep unrelated staged files into the commit. |
118
+ | **offline** | warn-only | The npm registry is reachable (`npm ping`), so the version probe in Step 1 will not fail with a confusing offline error. |
119
+
120
+ Severity follows framework preflight conventions (cf.
121
+ [`epic-deliver-preflight.js`](../scripts/epic-deliver-preflight.js), the
122
+ `story-close` preflight): the **consumer-shape** check is a hard stop — the
123
+ script exits `2` and you MUST NOT proceed until it is resolved; **dirty-index**
124
+ and **offline** are warn-only and never block the run.
125
+
126
+ Routing:
127
+
128
+ - **Exit 0, `ok: true`** — all checks passed; proceed to Step 1.
129
+ - **Exit 0 with warnings** (`blocked: false`, non-empty `findings[]`) —
130
+ review the warnings. For **dirty-index**, unstage unrelated changes
131
+ (`git restore --staged <path>`) so they are not swept into the
132
+ `chore: update mandrel` commit. For **offline**, restore connectivity
133
+ before the version probe. Then proceed.
134
+ - **Exit 2, `blocked: true`** — the consumer-shape check failed. Stop. You
135
+ are not in a Mandrel consumer project (wrong directory, the framework repo
136
+ itself, or a project that never ran `mandrel sync`). `cd` into the consumer
137
+ repo, or bootstrap one with `npm install -D mandrel && npx mandrel sync`,
138
+ then re-run the preflight.
139
+
140
+ > **Scope.** The preflight is a **workflow-layer** guard; it deliberately
141
+ > lives outside [`lib/cli/update.js`](../../lib/cli/update.js), which stays
142
+ > git-free and side-effect-scoped. It composes cleanly with the Step 0
143
+ > invocation-form detection above — Step 0 picks *how* to call the updater;
144
+ > Step 0.5 verifies it is *safe* to call it at all.
145
+
63
146
  ## Step 1 — Run the updater
64
147
 
65
148
  Preview first, then apply. From the consumer repo root:
66
149
 
67
150
  ```bash
68
- mandrel update --dry-run
69
- mandrel update
151
+ npx mandrel update --dry-run
152
+ npx mandrel update
70
153
  ```
71
154
 
72
- `mandrel update --dry-run` resolves the newest published version and prints
73
- the ordered step plan (`npm-update → runSync → runMigrations → doctor →
155
+ `npx mandrel update --dry-run` resolves the newest published version and
156
+ prints the ordered step plan (`npm-update → runSync → runMigrations → doctor →
74
157
  surface changelog`) without invoking any effectful seam — no dependency bump,
75
158
  no sync, no migrations, no doctor, nothing written. Read the planned target
76
159
  version before applying.
77
160
 
78
- `mandrel update` (no flags) runs the live cycle:
161
+ `npx mandrel update` (no flags) runs the live cycle:
79
162
 
80
163
  1. **Resolve target** — the newest published `mandrel` version (via
81
164
  the daily freshness cache in `temp/version-check.json`) and the currently
@@ -130,6 +213,86 @@ mandrel update — planned upgrade v1.44.0 → v1.46.0
130
213
  Dry run: no files written, no dependency bumped.
131
214
  ```
132
215
 
216
+ ## Step 2.5 — Partial-upgrade recovery (**blocker — resolve before Step 5**)
217
+
218
+ `mandrel update` runs its post-install phases in order — **install** →
219
+ **sync** → **sync-commands** → **migrate** → **doctor** — and the install
220
+ phase bumps `package.json` / `package-lock.json` and leaves the change
221
+ **staged on disk** *before* any of the later phases run. By deliberate
222
+ design the CLI **never rolls back the install on failure** (the lockfile
223
+ bump is left staged for the operator — see the Out-of-Scope note in
224
+ [`lib/cli/update.js`](../../lib/cli/update.js)). So when a post-install
225
+ phase exits non-zero, you land in a **partially-upgraded state**:
226
+
227
+ - The lockfile bump to the new version is **already staged**, *and*
228
+ - `.agents/` may be **half-materialized** (sync failed midway), the flat
229
+ `.claude/commands/` tree may be **out of sync** (sync-commands failed), a
230
+ version-keyed migration may have **partially applied** (migrate failed), or
231
+ the post-upgrade state failed validation (doctor failed).
232
+
233
+ This is the dangerous case the whole workflow exists to guard: the operator
234
+ is now **one `git commit` away** (Step 5) from recording a broken
235
+ half-upgrade as "done". `mandrel update` prints the per-phase manual remedy
236
+ to **stderr**, but a line buried in stderr is easy to scroll past and commit
237
+ right over. **Treat any post-install phase failure as an explicit blocker:
238
+ do not proceed to Step 5 (commit) until the failed phase is recovered and a
239
+ clean re-run reports success.**
240
+
241
+ When `npx mandrel update` exits non-zero, identify which phase failed (the
242
+ CLI's stderr names it) and run the matching manual remedy from the consumer
243
+ repo root. These commands match the hint strings
244
+ [`lib/cli/update.js`](../../lib/cli/update.js) emits verbatim — it is the
245
+ single source of truth, kept in lockstep with this table by the
246
+ `agents-update-recovery-drift` contract test
247
+ ([`tests/bootstrap/agents-update-recovery-drift.test.js`](../../tests/bootstrap/agents-update-recovery-drift.test.js)):
248
+
249
+ | Failed phase | Manual remedy |
250
+ | ----------------- | ------------------------------------------------------- |
251
+ | **sync** | `npx mandrel sync` |
252
+ | **sync-commands** | `npm run sync:commands` |
253
+ | **migrate** | `npx mandrel migrate --from <cur> --to <target>` |
254
+ | **doctor** | `npx mandrel doctor` (then apply the per-check remedies) |
255
+
256
+ The exact stderr the CLI prints per failed phase — quoted verbatim from
257
+ [`lib/cli/update.js`](../../lib/cli/update.js) so the table above can never
258
+ drift from what the operator actually sees:
259
+
260
+ - **sync** — the .agents/ materialization may be incomplete. Run `mandrel
261
+ sync` manually to restore.
262
+ - **sync-commands** — the .claude/commands/ tree may be out of sync. Run `npm
263
+ run sync:commands` manually to restore.
264
+ - **migrate** — some migrations for v\<cur\> → v\<target\> may not have
265
+ applied. Run `mandrel migrate --from <cur> --to <target>` manually to retry.
266
+ - **doctor** — upgraded to v\<target\> but doctor reported failures. → Run
267
+ `mandrel doctor` for remedies.
268
+
269
+ > **`<cur>` / `<target>`** are the installed and resolved-newest version
270
+ > strings the CLI printed in Step 1 (e.g. `--from 1.44.0 --to 1.46.0`).
271
+ > Substitute the real values the failing run reported.
272
+
273
+ Recovery sequence:
274
+
275
+ 1. **Run the matching remedy** for the failed phase from the table above.
276
+ 2. **Re-run `npx mandrel update`.** It is idempotent — the install already
277
+ landed, so a clean re-run short-circuits the bump and re-drives the
278
+ post-install phases. Repeat the per-phase remedy until the run reports
279
+ `✅ Updated to v<target>. The lockfile bump is staged for review.` (or
280
+ `✅ Already up to date`).
281
+ 3. **Only then proceed** to Step 3. The staged lockfile bump is safe to
282
+ commit (Step 5) once — and only once — the post-install phases have all
283
+ gone green.
284
+
285
+ > **Why not auto-rollback / `mandrel update --resume`?** A `--resume` flag
286
+ > that re-enters the cycle at the failed phase was **evaluated and
287
+ > deferred** (Story #4172, Out of Scope). The per-phase manual remedies
288
+ > above fully cover recovery: each failed phase has an exact, idempotent
289
+ > command, and re-running `npx mandrel update` already short-circuits the
290
+ > completed install and re-drives the remaining phases — so a dedicated
291
+ > resume entrypoint would add a parallel code path without covering any
292
+ > recovery case the manual remedies miss. If a future change makes the
293
+ > phases expensive enough that re-driving completed ones is wasteful,
294
+ > revisit `--resume` then; today it is unnecessary.
295
+
133
296
  ## Step 3 — Reconcile `.agentrc.json` against the new defaults
134
297
 
135
298
  A framework bump can add or reshape fields in
@@ -177,22 +340,18 @@ framework version sees `no-change` everywhere here.
177
340
  Run from the consumer repo root:
178
341
 
179
342
  ```bash
180
- node -e "
181
- Promise.all([
182
- import('./.agents/scripts/lib/bootstrap/quality-bootstrap.js'),
183
- import('./.agents/scripts/lib/bootstrap/baselines-layout-migration.js'),
184
- ]).then(([qb, bm]) => {
185
- const root = process.cwd();
186
- const quality = qb.applyQualityBootstrap({ projectRoot: root });
187
- const baselines = bm.migrateBaselinesLayout({
188
- baselinesDir: require('node:path').join(root, 'baselines'),
189
- repoRoot: root,
190
- });
191
- console.log(JSON.stringify({ quality, baselines }, null, 2));
192
- });
193
- "
343
+ node .agents/scripts/apply-quality-bootstrap.js
194
344
  ```
195
345
 
346
+ The script (Story #4171) replaced the prior inline `node -e` heredoc — a
347
+ shell-fragile, untested block that silently drifted whenever the two helper
348
+ signatures moved (see
349
+ [`apply-quality-bootstrap.js`](../scripts/apply-quality-bootstrap.js)). It
350
+ runs the same two installs in order against `process.cwd()` —
351
+ `applyQualityBootstrap` then `migrateBaselinesLayout` — and prints the same
352
+ `{ quality, baselines }` JSON envelope to stdout. It is idempotent: a second
353
+ run is a no-op beyond reporting `no-change` on every install path.
354
+
196
355
  The four `quality-bootstrap` outcomes:
197
356
 
198
357
  1. **`helper`** — copies
@@ -329,6 +488,14 @@ response."
329
488
 
330
489
  ## Step 5 — Commit the bump
331
490
 
491
+ > **Blocker check before you commit.** The staged lockfile bump is only safe
492
+ > to commit once every post-install phase has gone green. If `npx mandrel
493
+ > update` exited non-zero, you are in a partially-upgraded state — resolve it
494
+ > via [Step 2.5 — Partial-upgrade recovery](#step-25--partial-upgrade-recovery-blocker--resolve-before-step-5)
495
+ > (run the per-phase remedy, re-run the updater to success) **before** running
496
+ > the `git commit` below. Committing over a half-upgrade records a broken
497
+ > state as "done".
498
+
332
499
  `mandrel update` leaves the dependency bump **staged on disk** but never
333
500
  commits. After reviewing the surfaced changelog, any `.agentrc.json`
334
501
  reconciliation diff from Step 3, the `.claude/settings.json` allowlist
@@ -359,7 +526,7 @@ no-op.
359
526
  > distribution `.agents/` is a
360
527
  > materialized directory rebuilt from the installed package — whether the
361
528
  > consumer commits the regenerated `.agents/` tree, or treats it as a
362
- > gitignored install artifact rebuilt by `mandrel sync`, depends on the
529
+ > gitignored install artifact rebuilt by `npx mandrel sync`, depends on the
363
530
  > consumer's own vendoring policy. Stage the `.agents/` / `.claude/`
364
531
  > changes here only if the project commits its materialized tree.
365
532
 
@@ -367,21 +534,31 @@ no-op.
367
534
 
368
535
  - **`doctor reported failures: …`** — the dependency bumped and `.agents/`
369
536
  re-materialized, but a doctor check failed (and the run exited
370
- non-zero). Run `mandrel doctor` for the per-check remedies. The lockfile
371
- bump is already staged; fix the doctor finding (often a missing
372
- bootstrap install — Step 3.5 — or a stale `.agentrc.json` — Step 3)
373
- before committing in Step 5.
537
+ non-zero). This is one shape of the **partial-upgrade** failure mode —
538
+ the lockfile bump is already staged, so it is a **blocker** you MUST
539
+ resolve before the commit step (see
540
+ [Step 2.5 — Partial-upgrade recovery](#step-25--partial-upgrade-recovery-blocker--resolve-before-step-5)).
541
+ Run `npx mandrel doctor` for the per-check remedies; fix the doctor
542
+ finding (often a missing bootstrap install — Step 3.5 — or a stale
543
+ `.agentrc.json` — Step 3), re-run `npx mandrel update` until it reports
544
+ success, and only then commit in Step 5.
545
+
546
+ - **A post-install phase failed (`sync` / `sync-commands` / `migrate`)** —
547
+ the install bumped the lockfile but a later phase exited non-zero, leaving
548
+ a partially-upgraded tree. Do not commit. Run the matching per-phase
549
+ remedy and re-run the updater per
550
+ [Step 2.5 — Partial-upgrade recovery](#step-25--partial-upgrade-recovery-blocker--resolve-before-step-5).
374
551
 
375
552
  - **Install command failed / `npm install … exited <n>`** — the npm
376
553
  install step could not bump the dependency (network hiccup, registry
377
554
  auth gap, or a peer-dependency conflict). Resolve the underlying npm
378
- error and re-run `mandrel update`; it is idempotent — a clean re-run
555
+ error and re-run `npx mandrel update`; it is idempotent — a clean re-run
379
556
  resumes from the resolve step and short-circuits if the install already
380
557
  landed.
381
558
 
382
559
  - **Wrong package manager** — the default install is `npm install`. For a
383
560
  pnpm or yarn workspace, pass the package manager explicitly:
384
- `mandrel update --install-cmd "pnpm add mandrel@<target>"`.
561
+ `npx mandrel update --install-cmd "pnpm add mandrel@<target>"`.
385
562
  The registry probe always stays on `npm view` (a PM-agnostic query); only
386
563
  the install seam honours the override.
387
564
 
@@ -21,8 +21,8 @@ path selection only — all phase content lives in the two path helpers:
21
21
  close-validation, epic-audit, code-review, retro, finalize, watch,
22
22
  auto-merge gate, cleanup).
23
23
  - [`helpers/deliver-stories.md`](helpers/deliver-stories.md) — the
24
- standalone multi-Story path (`stories-wave-tick.js` wave plan, operator
25
- confirmation, parallel fan-out to
24
+ standalone multi-Story path (`stories-wave-tick.js` continuous ready-set
25
+ loop, operator confirmation, parallel fan-out to
26
26
  [`helpers/single-story-deliver`](helpers/single-story-deliver.md)).
27
27
 
28
28
  ## Input matrix (authoritative)
@@ -100,13 +100,16 @@ plans).
100
100
  /deliver <id> <id> … --dep <from>:<to> --concurrency <n> --yes
101
101
  ```
102
102
 
103
- behaves exactly as the retired multi-Story command did: the same
104
- `stories-wave-tick.js` wave plan, the same operator confirmation gate
105
- (suppressed by `--yes`), and the same parallel fan-out — one Agent call per
106
- Story per wave, capped by the resolved `concurrencyCap` — to
107
- [`helpers/single-story-deliver`](helpers/single-story-deliver.md). The
108
- parallelism lives **inside** the standalone segment; segments themselves
109
- remain strictly sequential.
103
+ preserves the retired multi-Story command's full surface — the same flags,
104
+ the same operator confirmation gate (suppressed by `--yes`), and the same
105
+ parallel fan-out to
106
+ [`helpers/single-story-deliver`](helpers/single-story-deliver.md) — but
107
+ schedules through `stories-wave-tick.js`'s **continuous ready-set loop**
108
+ (the shared `selectReadySet` core) rather than a static wave plan: each
109
+ Story dispatches the instant its own dependencies are done, capped by the
110
+ resolved global `concurrencyCap` and guarded against file-overlap
111
+ co-dispatch, exactly as the Epic path is. The parallelism lives **inside**
112
+ the standalone segment; segments themselves remain strictly sequential.
110
113
 
111
114
  ## Procedure
112
115