mandrel 2.37.0 → 2.38.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 (154) hide show
  1. package/.agents/README.md +16 -16
  2. package/.agents/agents/plan-critic.md +1 -1
  3. package/.agents/docs/SDLC.md +40 -40
  4. package/.agents/docs/configuration.md +16 -16
  5. package/.agents/docs/execution-reference.md +3 -3
  6. package/.agents/docs/quality-gates.md +2 -2
  7. package/.agents/docs/workflows.md +6 -6
  8. package/.agents/instructions.md +5 -5
  9. package/.agents/rules/changelog-style.md +3 -3
  10. package/.agents/rules/ci-remediation.md +1 -1
  11. package/.agents/rules/git-conventions-reference.md +4 -4
  12. package/.agents/schemas/agentrc.schema.json +9 -9
  13. package/.agents/schemas/story-deliver-terminal.schema.json +2 -2
  14. package/.agents/schemas/validation-evidence.schema.json +1 -1
  15. package/.agents/scripts/acceptance-eval.js +1 -1
  16. package/.agents/scripts/apply-quality-bootstrap.js +1 -1
  17. package/.agents/scripts/audit-to-stories.js +2 -2
  18. package/.agents/scripts/check-doc-links.js +32 -4
  19. package/.agents/scripts/check-test-temp-hygiene.js +1 -1
  20. package/.agents/scripts/check-workflow-cli-lint.js +1 -1
  21. package/.agents/scripts/deliver-light.js +10 -10
  22. package/.agents/scripts/deliver-recover.js +1 -1
  23. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  24. package/.agents/scripts/evidence-gate.js +1 -1
  25. package/.agents/scripts/generate-workflows-doc.js +1 -1
  26. package/.agents/scripts/lib/audit-suite/selector.js +1 -1
  27. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +1 -1
  28. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +1 -1
  29. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +5 -5
  30. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +1 -1
  31. package/.agents/scripts/lib/bdd-runner-detect.js +1 -1
  32. package/.agents/scripts/lib/bdd-scenario-budget.js +1 -1
  33. package/.agents/scripts/lib/bdd-scenario-scanner.js +3 -3
  34. package/.agents/scripts/lib/bdd-step-index.js +1 -1
  35. package/.agents/scripts/lib/bootstrap/branch-protection.js +1 -1
  36. package/.agents/scripts/lib/bootstrap/commit-push.js +2 -2
  37. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +1 -1
  38. package/.agents/scripts/lib/checks/core-bare-clean.js +1 -1
  39. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +1 -1
  40. package/.agents/scripts/lib/cli-args.js +1 -1
  41. package/.agents/scripts/lib/command-header.js +1 -1
  42. package/.agents/scripts/lib/config/delivery-routing.js +1 -1
  43. package/.agents/scripts/lib/config/explain.js +1 -1
  44. package/.agents/scripts/lib/config/runners.js +2 -2
  45. package/.agents/scripts/lib/config/runtime.js +1 -1
  46. package/.agents/scripts/lib/config/temp-paths.js +2 -2
  47. package/.agents/scripts/lib/config-settings-schema-delivery.js +3 -3
  48. package/.agents/scripts/lib/config-settings-schema-quality.js +6 -6
  49. package/.agents/scripts/lib/config-settings-schema.js +3 -3
  50. package/.agents/scripts/lib/duplicate-search.js +1 -1
  51. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +4 -4
  52. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  53. package/.agents/scripts/lib/findings/classify-finding.js +1 -1
  54. package/.agents/scripts/lib/findings/promote-finding.js +12 -12
  55. package/.agents/scripts/lib/findings/route-finding.js +2 -2
  56. package/.agents/scripts/lib/generated/agentrc-validator.js +1 -1
  57. package/.agents/scripts/lib/git-branch-lifecycle.js +2 -2
  58. package/.agents/scripts/lib/label-constants.js +2 -2
  59. package/.agents/scripts/lib/label-taxonomy.js +1 -1
  60. package/.agents/scripts/lib/onboard/init-tail.js +4 -4
  61. package/.agents/scripts/lib/onboard/scaffold-docs.js +2 -2
  62. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +1 -1
  63. package/.agents/scripts/lib/orchestration/code-review.js +4 -4
  64. package/.agents/scripts/lib/orchestration/complexity-gate.js +5 -5
  65. package/.agents/scripts/lib/orchestration/deliver-recover.js +3 -3
  66. package/.agents/scripts/lib/orchestration/docs-digest.js +3 -3
  67. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +2 -2
  68. package/.agents/scripts/lib/orchestration/light-backstop.js +1 -1
  69. package/.agents/scripts/lib/orchestration/light-escalation.js +6 -6
  70. package/.agents/scripts/lib/orchestration/light-suitability.js +19 -19
  71. package/.agents/scripts/lib/orchestration/plan-context.js +4 -4
  72. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +2 -2
  73. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +2 -2
  74. package/.agents/scripts/lib/orchestration/plan-metrics.js +1 -1
  75. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +1 -1
  76. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +3 -3
  77. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +6 -6
  78. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +16 -16
  79. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +3 -3
  80. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +6 -6
  81. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +7 -7
  82. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -1
  83. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +3 -3
  84. package/.agents/scripts/lib/orchestration/remote-verifier.js +2 -2
  85. package/.agents/scripts/lib/orchestration/resolve-stories.js +4 -4
  86. package/.agents/scripts/lib/orchestration/run-epilogue.js +2 -2
  87. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +2 -2
  88. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +1 -1
  89. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +5 -1
  90. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -1
  91. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +3 -3
  92. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +2 -2
  93. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  94. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +14 -12
  95. package/.agents/scripts/lib/orchestration/ticket-validator.js +1 -1
  96. package/.agents/scripts/lib/orchestration/ticketing/reads.js +3 -3
  97. package/.agents/scripts/lib/plan-phase-cleanup.js +1 -1
  98. package/.agents/scripts/lib/signals/schema.js +1 -1
  99. package/.agents/scripts/lib/story-adjacency.js +2 -2
  100. package/.agents/scripts/lib/templates/decomposer-prompts.js +1 -1
  101. package/.agents/scripts/lib/ticket-body-sections.js +1 -1
  102. package/.agents/scripts/lib/util/concurrent-map.js +1 -1
  103. package/.agents/scripts/lib/util/parse-id-list.js +1 -1
  104. package/.agents/scripts/lib/wave-runner/live-probe.js +4 -4
  105. package/.agents/scripts/lib/wave-runner/ready-set.js +1 -1
  106. package/.agents/scripts/lib/workflow-closure.js +1 -1
  107. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +2 -2
  108. package/.agents/scripts/lint-issue-body.js +3 -3
  109. package/.agents/scripts/plan-context.js +4 -4
  110. package/.agents/scripts/plan-critics.js +2 -2
  111. package/.agents/scripts/plan-persist.js +2 -2
  112. package/.agents/scripts/plan-run-epilogue.js +2 -2
  113. package/.agents/scripts/providers/github/board-add.js +1 -1
  114. package/.agents/scripts/providers/github/errors.js +1 -1
  115. package/.agents/scripts/providers/github/tickets.js +6 -6
  116. package/.agents/scripts/resolve-stories.js +3 -3
  117. package/.agents/scripts/resync-status-column.js +1 -1
  118. package/.agents/scripts/run-lint.js +1 -1
  119. package/.agents/scripts/single-story-close.js +2 -2
  120. package/.agents/scripts/single-story-init.js +5 -5
  121. package/.agents/scripts/stories-wave-tick.js +8 -8
  122. package/.agents/skills/core/idea-refinement/SKILL.md +5 -5
  123. package/.agents/skills/core/scope-triage/SKILL.md +3 -3
  124. package/.agents/skills/skills.index.json +1 -1
  125. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -1
  126. package/.agents/workflows/audit-data-model.md +1 -1
  127. package/.agents/workflows/audit-documentation.md +2 -2
  128. package/.agents/workflows/audit-to-stories.md +11 -11
  129. package/.agents/workflows/git-deliver.md +4 -4
  130. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  131. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  132. package/.agents/workflows/helpers/code-review.md +4 -4
  133. package/.agents/workflows/helpers/deliver-light.md +26 -26
  134. package/.agents/workflows/helpers/deliver-reference.md +15 -7
  135. package/.agents/workflows/helpers/deliver-story-reference.md +9 -4
  136. package/.agents/workflows/helpers/deliver-story.md +6 -7
  137. package/.agents/workflows/helpers/diagnose.md +2 -2
  138. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  139. package/.agents/workflows/helpers/plan-reference.md +9 -9
  140. package/.agents/workflows/helpers/qa-core.md +8 -8
  141. package/.agents/workflows/helpers/worktree-lifecycle.md +6 -6
  142. package/.agents/workflows/{deliver.md → mandrel-deliver.md} +15 -19
  143. package/.agents/workflows/{plan.md → mandrel-plan.md} +9 -9
  144. package/.agents/workflows/memory-consolidate.md +4 -4
  145. package/.agents/workflows/prototype.md +3 -3
  146. package/.agents/workflows/qa-assist.md +12 -12
  147. package/.agents/workflows/qa-explore.md +6 -6
  148. package/.agents/workflows/qa-run.md +1 -1
  149. package/README.md +7 -7
  150. package/docs/CHANGELOG.md +11 -0
  151. package/lib/cli/doctor.js +1 -1
  152. package/lib/cli/init.js +1 -1
  153. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +1 -1
  154. package/package.json +1 -1
@@ -95,7 +95,7 @@ signature is worth naming:
95
95
  **Invariant (stated in the core): the delivering flow owns tidying the local
96
96
  checkout — reaping its own merged refs and fast-forwarding the base branch.
97
97
  `/git-cleanup` is a recovery tool, not a routine chore.** The outcome every
98
- delivering flow (`/deliver`, `/git-deliver`) guarantees, with the mechanics
98
+ delivering flow (`/mandrel-deliver`, `/git-deliver`) guarantees, with the mechanics
99
99
  owned by `boot-sweep.js` / `git-cleanup.js`:
100
100
 
101
101
  - **`main` is fast-forwarded** by the flow itself in its cleanup phase, so the
@@ -104,7 +104,7 @@ owned by `boot-sweep.js` / `git-cleanup.js`:
104
104
  - **Merged local refs are reaped** at the next workflow boot's protected sweep
105
105
  (`boot-sweep.js`) — every local branch whose PR is already merged, skipping
106
106
  any candidate with unpushed work, a dirty worktree, or a still-open parent
107
- ticket. `/plan` and `/git-deliver` widen the sweep's `--include` scope beyond
107
+ ticket. `/mandrel-plan` and `/git-deliver` widen the sweep's `--include` scope beyond
108
108
  the default `story-*` to their own branch namespaces at their boot call site.
109
109
  - **Content-merged branches are report-only.** A branch detected only via the
110
110
  weaker content-equivalence signal (`detectedBy: 'content-merged'` — content
@@ -149,13 +149,13 @@ different hazards:
149
149
  - **Recognition signature**: close aborts naming stray files in the main
150
150
  checkout that intersect the Story's diff. **Resolution**: relocate those
151
151
  edits under the worktree, restore the main checkout
152
- (`git -C <main-repo> checkout -- <files>`), then re-run `/deliver <storyId>`.
152
+ (`git -C <main-repo> checkout -- <files>`), then re-run `/mandrel-deliver <storyId>`.
153
153
  Never `git reset --hard` or `git checkout --force` to clear the way.
154
154
 
155
155
  ## Meta Labels (Retrospective Signal Routing)
156
156
 
157
157
  Two `meta::*` labels route retrospective signals into durable substrates so
158
- the `/plan` Phase 0 fetcher (see
158
+ the `/mandrel-plan` Phase 0 fetcher (see
159
159
  [`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
160
160
  can surface open feedback issues to the planner. Both labels live in
161
161
  [`label-constants.js`](../scripts/lib/label-constants.js) under the
@@ -298,7 +298,7 @@
298
298
  },
299
299
  "planning": {
300
300
  "type": "object",
301
- "description": "Inputs to `/plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.",
301
+ "description": "Inputs to `/mandrel-plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.",
302
302
  "properties": {
303
303
  "riskHeuristics": {
304
304
  "oneOf": [
@@ -440,7 +440,7 @@
440
440
  },
441
441
  "delivery": {
442
442
  "type": "object",
443
- "description": "Everything `/deliver` and `single-story-close` consume: execution timeouts, worktree isolation, runner concurrency, docs freshness, signals, quality gates, merge/CI watch, review ceremony, and the feedback loop.",
443
+ "description": "Everything `/mandrel-deliver` and `single-story-close` consume: execution timeouts, worktree isolation, runner concurrency, docs freshness, signals, quality gates, merge/CI watch, review ceremony, and the feedback loop.",
444
444
  "properties": {
445
445
  "execution": {
446
446
  "type": "object",
@@ -521,12 +521,12 @@
521
521
  },
522
522
  "deliverRunner": {
523
523
  "type": "object",
524
- "description": "Bounded-concurrency knob for the /deliver fan-out.",
524
+ "description": "Bounded-concurrency knob for the /mandrel-deliver fan-out.",
525
525
  "properties": {
526
526
  "concurrencyCap": {
527
527
  "type": "integer",
528
528
  "minimum": 1,
529
- "description": "Maximum ready Stories dispatched by /deliver at once. Default 3. Moderate by design — keeps host-quota consumption predictable while allowing a small ready-set fan-out. Set 1 for strictly sequential delivery; raise further on hosts with adequate parallel-agent quota. See deliver.md for the sequencing model and throughput tradeoff.",
529
+ "description": "Maximum ready Stories dispatched by /mandrel-deliver at once. Default 3. Moderate by design — keeps host-quota consumption predictable while allowing a small ready-set fan-out. Set 1 for strictly sequential delivery; raise further on hosts with adequate parallel-agent quota. See deliver.md for the sequencing model and throughput tradeoff.",
530
530
  "default": 3
531
531
  },
532
532
  "footprintGuard": {
@@ -1628,7 +1628,7 @@
1628
1628
  },
1629
1629
  "navigability": {
1630
1630
  "type": "object",
1631
- "description": "Navigability lens + journey-suite config (Epic #4131, F2/F3/F1/F4). Read by audit-suite/selector.js (route globs) and /deliver's per-Story ceremony (journey suite). Opt-in: absent or empty routeGlobs degrades to a silent no-op.",
1631
+ "description": "Navigability lens + journey-suite config (Epic #4131, F2/F3/F1/F4). Read by audit-suite/selector.js (route globs) and /mandrel-deliver's per-Story ceremony (journey suite). Opt-in: absent or empty routeGlobs degrades to a silent no-op.",
1632
1632
  "properties": {
1633
1633
  "routeGlobs": {
1634
1634
  "type": "array",
@@ -1648,7 +1648,7 @@
1648
1648
  },
1649
1649
  "journeySuite": {
1650
1650
  "type": "string",
1651
- "description": "Path or command for the per-persona journey suite /deliver's per-Story ceremony runs."
1651
+ "description": "Path or command for the per-persona journey suite /mandrel-deliver's per-Story ceremony runs."
1652
1652
  }
1653
1653
  },
1654
1654
  "additionalProperties": false
@@ -1692,7 +1692,7 @@
1692
1692
  },
1693
1693
  "codeReview": {
1694
1694
  "type": "object",
1695
- "description": "Review-provider chain plus bounded-retry knobs for the /deliver code-review ceremony.",
1695
+ "description": "Review-provider chain plus bounded-retry knobs for the /mandrel-deliver code-review ceremony.",
1696
1696
  "properties": {
1697
1697
  "providers": {
1698
1698
  "type": "array",
@@ -1780,7 +1780,7 @@
1780
1780
  "maxFixAttempts": {
1781
1781
  "type": "integer",
1782
1782
  "minimum": 0,
1783
- "description": "Maximum auto-fix retry attempts per finding in /deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.",
1783
+ "description": "Maximum auto-fix retry attempts per finding in /mandrel-deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.",
1784
1784
  "default": 3
1785
1785
  },
1786
1786
  "maxFixScopeFiles": {
@@ -1792,7 +1792,7 @@
1792
1792
  "autoFixSeverity": {
1793
1793
  "type": "string",
1794
1794
  "enum": ["high", "medium"],
1795
- "description": "Severity threshold for on-branch remediation in /deliver Phase 5 (code-review). `medium` (default) routes 🔴/🟠/🟡 findings into the host-LLM focused-fix routing (Mediums batched per lens: one commit per lens, a single validation + rescan at the end) while 🟢 suggestions still graduate to follow-up issues; `high` reproduces the pre-4399 Critical/High-only routing. Hard cutover — no back-compat flag.",
1795
+ "description": "Severity threshold for on-branch remediation in /mandrel-deliver Phase 5 (code-review). `medium` (default) routes 🔴/🟠/🟡 findings into the host-LLM focused-fix routing (Mediums batched per lens: one commit per lens, a single validation + rescan at the end) while 🟢 suggestions still graduate to follow-up issues; `high` reproduces the pre-4399 Critical/High-only routing. Hard cutover — no back-compat flag.",
1796
1796
  "default": "medium"
1797
1797
  }
1798
1798
  },
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "status": {
23
23
  "type": "string",
24
- "description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated — the /deliver-light suitability gate refused an over-scope prompt under --yes; nothing was created and the session ENDS here, nextCommand naming the /plan invocation that owns the work instead.",
24
+ "description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated — the /deliver-light suitability gate refused an over-scope prompt under --yes; nothing was created and the session ENDS here, nextCommand naming the /mandrel-plan invocation that owns the work instead.",
25
25
  "enum": ["landed", "pending", "blocked", "failed", "escalated"]
26
26
  },
27
27
  "phase": {
@@ -173,7 +173,7 @@
173
173
  },
174
174
  "nextCommand": {
175
175
  "type": ["string", "null"],
176
- "description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /plan invocation the operator runs in a FRESH session — the one case where the command is a slash command rather than a script, because the work needs planning, not resumption.",
176
+ "description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /mandrel-plan invocation the operator runs in a FRESH session — the one case where the command is a slash command rather than a script, because the work needs planning, not resumption.",
177
177
  "minLength": 1
178
178
  },
179
179
  "elapsedSeconds": { "type": "number", "minimum": 0 },
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "validation-evidence",
4
4
  "title": "Validation Evidence",
5
- "description": "Per-scope record of which validation gates have passed against which commit SHA. Written by lib/validation-evidence.js under the per-Epic temp tree at temp/run-<id>/validation-evidence.json (Epic-scoped) or temp/run-<id>/stories/story-<storyId>/validation-evidence.json (Story-scoped). Standalone Stories (no parent Epic) use a storyId-anchored keyspace at temp/standalone/stories/story-<storyId>/validation-evidence.json. All paths are gitignored via temp/. Consumed by close-validation, epic-code-review, the acceptance self-eval critic, and /deliver Phase 3 (close-validation) to skip identical re-runs against an already-validated tree. The `storyId` field carries the scope id and equals the epic id for Epic-scoped records.",
5
+ "description": "Per-scope record of which validation gates have passed against which commit SHA. Written by lib/validation-evidence.js under the per-Epic temp tree at temp/run-<id>/validation-evidence.json (Epic-scoped) or temp/run-<id>/stories/story-<storyId>/validation-evidence.json (Story-scoped). Standalone Stories (no parent Epic) use a storyId-anchored keyspace at temp/standalone/stories/story-<storyId>/validation-evidence.json. All paths are gitignored via temp/. Consumed by close-validation, epic-code-review, the acceptance self-eval critic, and /mandrel-deliver Phase 3 (close-validation) to skip identical re-runs against an already-validated tree. The `storyId` field carries the scope id and equals the epic id for Epic-scoped records.",
6
6
  "type": "object",
7
7
  "required": ["storyId", "schemaVersion", "records"],
8
8
  "properties": {
@@ -20,7 +20,7 @@
20
20
  * and the resolved, undisableable round cap
21
21
  * (`delivery.acceptanceEval.maxRounds`, clamped to `[1, ceiling]`).
22
22
  * 3. Emit one per-criterion `acceptance-eval` signal into the retro /
23
- * feedback substrate so the retro and `/plan` Phase 0 feedback
23
+ * feedback substrate so the retro and `/mandrel-plan` Phase 0 feedback
24
24
  * fetch can see which acceptance items needed rework and the round
25
25
  * count.
26
26
  * 4. Print a single JSON envelope and exit:
@@ -20,7 +20,7 @@
20
20
  *
21
21
  * Story #5007 retired the second step. `migrateBaselinesLayout` relocated
22
22
  * per-Epic ratchet snapshots into `temp/epic/<id>/baselines/` on the contract
23
- * that `/deliver` reaps that namespace on merge — a mechanism the Story-only
23
+ * that `/mandrel-deliver` reaps that namespace on merge — a mechanism the Story-only
24
24
  * v2 model deleted, so the migration moved dead data into a namespace no code
25
25
  * path writes, reads, or reaps. Its one residual hygiene value (getting the
26
26
  * committed `baselines/epic/` tree out of version control) survives as
@@ -13,7 +13,7 @@
13
13
  * stdout when --json is set).
14
14
  *
15
15
  * --emit-plan-seed --plan <plan.json> --out <path>
16
- * Read the plan envelope from disk, render the `/plan --seed`
16
+ * Read the plan envelope from disk, render the `/mandrel-plan --seed`
17
17
  * seed markdown, persist to --out.
18
18
  *
19
19
  * --emit-stories --plan <plan.json>
@@ -844,7 +844,7 @@ runAsCli(import.meta.url, main, {
844
844
  flags: [
845
845
  ['--scan', 'Print the grouped, deduplicated plan as JSON.'],
846
846
  ['--auto', 'Run the full scan → file pipeline and print the summary.'],
847
- ['--emit-plan-seed', 'Emit a /plan --seed-file document.'],
847
+ ['--emit-plan-seed', 'Emit a /mandrel-plan --seed-file document.'],
848
848
  ['--emit-stories', 'Emit the Story drafts as JSON.'],
849
849
  [
850
850
  '--wire-edges',
@@ -19,7 +19,7 @@
19
19
  //
20
20
  // 3. No active doc mentions any retired slash command. The retired-command
21
21
  // blocklist is seeded with `agents-bootstrap-github`,
22
- // `single-story-plan` (renamed to `/plan`), and `mandrel`
22
+ // `single-story-plan` (renamed to `/mandrel-plan`), and `mandrel`
23
23
  // (retired in favor of the generated `.agents/docs/workflows.md`
24
24
  // catalog) and takes precedence over the workflow-resolution check —
25
25
  // a retired token is always a non-zero exit even if a stale workflow
@@ -61,6 +61,18 @@ export const RETIRED_COMMANDS = new Set([
61
61
  'git-merge-pr',
62
62
  ]);
63
63
 
64
+ // Command spellings a *historical* record may still name, keyed by the file
65
+ // allowed to name them. A decisions log that cannot quote the name a command
66
+ // had is a broken record: an ADR describes the world as it was, so freezing
67
+ // its prose is the point. Scoped per-file and per-token rather than
68
+ // allowlisted globally — everywhere else these are simply wrong, and a typo
69
+ // like `/mandrl-plan` must still fail here. Story #5126 renamed `/plan` →
70
+ // `/mandrel-plan` and `/deliver` → `/mandrel-deliver`; the ADRs that decided
71
+ // the Story-only model still name them as they were called then.
72
+ export const SUPERSEDED_COMMAND_SPELLINGS = new Map([
73
+ ['docs/decisions.md', new Set(['plan', 'deliver'])],
74
+ ]);
75
+
64
76
  // Tokens that look like `/foo` in prose but are not slash commands. Tokens
65
77
  // are stored WITHOUT the leading slash. The list focuses on common URL path
66
78
  // fragments and on-disk path roots that appear in tutorial prose. The
@@ -379,6 +391,20 @@ export function extractSlashTokens(masked) {
379
391
 
380
392
  // --- Per-file check --------------------------------------------------------
381
393
 
394
+ /**
395
+ * The slash tokens `relFile` may name without resolving to a workflow: the
396
+ * global allowlist, plus any superseded spelling this particular file is
397
+ * allowed to quote.
398
+ *
399
+ * @param {string} relFile Repo-relative path of the file being checked.
400
+ * @returns {Set<string>} Tokens to skip, stored without the leading slash.
401
+ */
402
+ function slashAllowlistFor(relFile) {
403
+ const superseded = SUPERSEDED_COMMAND_SPELLINGS.get(relFile);
404
+ if (!superseded) return SLASH_ALLOWLIST;
405
+ return new Set([...SLASH_ALLOWLIST, ...superseded]);
406
+ }
407
+
382
408
  export function checkFile(absPath, repoRoot) {
383
409
  const violations = [];
384
410
  const source = fs.readFileSync(absPath, 'utf8');
@@ -454,14 +480,16 @@ export function checkFile(absPath, repoRoot) {
454
480
  }
455
481
  }
456
482
 
457
- // 3. Slash-command resolution. Skip retired hits (already reported) and
458
- // allowlisted tokens. A command is valid if it resolves to a top-level
483
+ // 3. Slash-command resolution. Skip retired hits (already reported),
484
+ // allowlisted tokens, and a superseded spelling in the one file allowed
485
+ // to quote it (SUPERSEDED_COMMAND_SPELLINGS). A command is valid if it resolves to a top-level
459
486
  // workflow file OR to a helpers/ module (helpers are not projected into
460
487
  // the `.claude/commands/` tree but are still legitimate named workflows
461
488
  // that parent workflows invoke by prose reference).
489
+ const slashAllowlist = slashAllowlistFor(relFile);
462
490
  for (const { token, line } of slashTokens) {
463
491
  if (RETIRED_COMMANDS.has(token)) continue;
464
- if (SLASH_ALLOWLIST.has(token)) continue;
492
+ if (slashAllowlist.has(token)) continue;
465
493
  // Namespaced loop commands (`/loops:<name>`, Story #4289) resolve to a
466
494
  // loop unit under `.agents/workflows/loops/<name>.md`. Split on the `:`
467
495
  // and resolve the namespaced path rather than a flat `loops:<name>.md`.
@@ -422,7 +422,7 @@ export function findReservedIdStreamFiles(tempDir) {
422
422
  * the **repository-root** temp tree (Story #4892).
423
423
  *
424
424
  * Resolution matters more than it looks: every writer anchors a relative
425
- * `tempRoot` to the *main checkout* (so a Story worktree and its `/deliver`
425
+ * `tempRoot` to the *main checkout* (so a Story worktree and its `/mandrel-deliver`
426
426
  * host converge on one ledger), so a guard that scanned `cwd` would scan an
427
427
  * empty worktree tree and pass vacuously on the very tree it is meant to
428
428
  * protect. `resolveRoot` is the injection seam for tests.
@@ -136,7 +136,7 @@ export function toParagraphs(lines) {
136
136
  * heading (inclusive) — i.e. the section is *about* that script, so the
137
137
  * table is restating its surface.
138
138
  *
139
- * A slash command's own argument table (`/plan`, `/deliver`) has no script
139
+ * A slash command's own argument table (`/mandrel-plan`, `/mandrel-deliver`) has no script
140
140
  * behind it — nothing owns those flags but the workflow prose itself — so
141
141
  * condition 2 leaves it alone by design.
142
142
  *
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * A **thin entry point, not a second delivery engine.** It runs the
7
7
  * suitability gate, authors a minimal receipt `type::story`, and then hands off
8
- * to the SAME engine scripts `/deliver` uses:
8
+ * to the SAME engine scripts `/mandrel-deliver` uses:
9
9
  *
10
10
  * suitability gate → inline receipt Story → single-story-init.js
11
11
  * → (agent implements + self-evals) → diff backstop
@@ -38,9 +38,9 @@
38
38
  * envelope with status `escalated` and **ends the session**. Before that it was
39
39
  * an ordinary gate envelope plus exit 2 — a warning a caller could walk past,
40
40
  * and one mandrel-bench 2.13.0 light-arm run did exactly that: it read the
41
- * escalation, invoked `/plan` in the same session, and delivered. In-session
41
+ * escalation, invoked `/mandrel-plan` in the same session, and delivered. In-session
42
42
  * planning under-decomposed (ONE Story against the scenario's 3-5 contract,
43
- * where a fresh `/plan` session on the identical seed authored four), so
43
+ * where a fresh `/mandrel-plan` session on the identical seed authored four), so
44
44
  * escalation silently produced the outcome the guard exists to prevent.
45
45
  * {@link module:lib/orchestration/story-deliver-terminal.buildEscalationTerminal}
46
46
  * carries the guarantees the schema then enforces.
@@ -88,7 +88,7 @@ Usage:
88
88
  deliver-light.js --backstop --story <id>
89
89
 
90
90
  The thin /deliver-light entry point: suitability gate → inline receipt Story →
91
- the same single-story-init.js / single-story-close.js engine /deliver uses.
91
+ the same single-story-init.js / single-story-close.js engine /mandrel-deliver uses.
92
92
 
93
93
  The gate judges EFFORT and RISK, not artifact counts: N instances of one
94
94
  mechanical edit is one kind at N sites. It rejects only clearly-epic work; the
@@ -102,9 +102,9 @@ Gate options:
102
102
  --kinds <csv> Distinct KINDS of change (default: one per assumption, so
103
103
  N same-shaped edits count once).
104
104
  --magnitude <m> Coarse effort bucket: trivial | moderate | substantial
105
- (default moderate; substantial routes to /plan).
105
+ (default moderate; substantial routes to /mandrel-plan).
106
106
  --uncertainty <u> determined (the request fixes the shape) | needs-design
107
- (default determined; needs-design routes to /plan).
107
+ (default determined; needs-design routes to /mandrel-plan).
108
108
  --route <r> Ledgered model verdict route: lite | full.
109
109
  --reason <text> Recorded reason for a lite verdict (required for lite).
110
110
  --amends <#id> Mark this as an amendment of an existing issue.
@@ -125,7 +125,7 @@ Backstop options:
125
125
  change's IMPLEMENTATION half by magnitude (changed lines +
126
126
  file sprawl); test/doc/baseline companions are exempt from
127
127
  the counts but still matched for sensitive paths. A block
128
- emits a nextCommand recycling the receipt through /plan.
128
+ emits a nextCommand recycling the receipt through /mandrel-plan.
129
129
  --story <id> Story issue number whose story-<id> branch to diff.
130
130
 
131
131
  --pretty Pretty-print the JSON envelope.
@@ -280,7 +280,7 @@ export async function createLightReceipt({
280
280
  }
281
281
 
282
282
  /**
283
- * The engine hand-off — the SAME scripts `/deliver` uses. Named here as
283
+ * The engine hand-off — the SAME scripts `/mandrel-deliver` uses. Named here as
284
284
  * commands, never reimplemented: this is the whole of deliver-light's
285
285
  * relationship to worktree/branch/lease/PR/merge mechanics.
286
286
  *
@@ -397,7 +397,7 @@ export async function runGateMode(values, deps = {}) {
397
397
  if (values.yes === true && hasOperatorOverride(values)) {
398
398
  process.stderr.write(HELP);
399
399
  throw new Error(
400
- '[deliver-light] --operator-proceed-light is attended-only and cannot be combined with --yes: an unattended run has no operator whose answer this is, and over-scope must fail closed to /plan',
400
+ '[deliver-light] --operator-proceed-light is attended-only and cannot be combined with --yes: an unattended run has no operator whose answer this is, and over-scope must fail closed to /mandrel-plan',
401
401
  );
402
402
  }
403
403
 
@@ -423,7 +423,7 @@ export async function runGateMode(values, deps = {}) {
423
423
  });
424
424
  emitTerminalFn(envelope);
425
425
  Logger.warn(
426
- `[deliver-light] ESCALATED to /plan — this session ENDS here; run ${envelope.nextCommand} in a FRESH session: ${gate.outcome.reasons.join('; ')}`,
426
+ `[deliver-light] ESCALATED to /mandrel-plan — this session ENDS here; run ${envelope.nextCommand} in a FRESH session: ${gate.outcome.reasons.join('; ')}`,
427
427
  );
428
428
  return exitCodeForTerminal(envelope);
429
429
  }
@@ -12,7 +12,7 @@
12
12
  * is the thing they cannot act on.
13
13
  *
14
14
  * The strand this exists for above all others is the **merged-but-label-stale**
15
- * Story: a `/deliver` re-run refuses it outright, because
15
+ * Story: a `/mandrel-deliver` re-run refuses it outright, because
16
16
  * `single-story-init.js` hard-errors on an already-closed Story. Before this
17
17
  * surface, that Story had no automated way back.
18
18
  *
@@ -8,7 +8,7 @@
8
8
  * any still-stuck entries by enumerating the processes holding handles
9
9
  * inside the worktree path and terminating them.
10
10
  *
11
- * Invoked by `/deliver` and `/plan`
11
+ * Invoked by `/mandrel-deliver` and `/mandrel-plan`
12
12
  * (via `drainPendingCleanupAtBoot` → `worktree-sweep.js`), and
13
13
  * `story-close` so the pending-cleanup ledger drains automatically
14
14
  * across the sprint lifecycle. Operators can also run it standalone:
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * evidence-gate.js — evidence-aware wrapper around a single shell gate.
5
5
  *
6
- * Tech Spec #819 §"Evidence record (Story 7)" — `/deliver` Phase 3
6
+ * Tech Spec #819 §"Evidence record (Story 7)" — `/mandrel-deliver` Phase 3
7
7
  * (close-validation) runs `npm run lint` and `npm test` against the Epic
8
8
  * branch before opening the PR.
9
9
  * If the same gate has already passed against the current `git rev-parse
@@ -93,7 +93,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
93
93
  'Every command file lives at `.agents/workflows/<name>.md` and is projected',
94
94
  'into a flat `.claude/commands/` tree by `npm run sync:commands` (kept',
95
95
  'current at install time and on every `mandrel sync`/`update`) so it shows',
96
- 'up as a bare `/<name>` slash command (e.g. `/deliver`). The projection',
96
+ 'up as a bare `/<name>` slash command (e.g. `/mandrel-deliver`). The projection',
97
97
  'writes only `.claude/commands/<name>.md` — there is no plugin manifest and no',
98
98
  'marketplace listing. The commands load in every Claude Code environment.',
99
99
  '',
@@ -701,7 +701,7 @@ export function changeSetLacksSiblingTest(changedFiles) {
701
701
  * callers MUST pass the requested Epic's own branch ref (e.g.
702
702
  * `refs/heads/epic/<id>`) so the change set is pinned to that Epic's branch
703
703
  * rather than whatever HEAD the shared checkout happens to sit on. Under two
704
- * concurrent `/deliver` runs sharing one checkout, diffing against
704
+ * concurrent `/mandrel-deliver` runs sharing one checkout, diffing against
705
705
  * `HEAD` silently resolves the *other* Epic's change set (Story #3362). When
706
706
  * `headRef` cannot be resolved in the repo, the selector returns a
707
707
  * `degraded: true` envelope (or hard-fails in gate-mode) instead of diffing
@@ -140,7 +140,7 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
140
140
  name: AGENT_LABELS.READY,
141
141
  color: hex(LABEL_COLORS.AGENT),
142
142
  description:
143
- 'Parking state — frozen dispatch manifest exists; awaiting local /deliver',
143
+ 'Parking state — frozen dispatch manifest exists; awaiting local /mandrel-deliver',
144
144
  },
145
145
  {
146
146
  name: RISK_LABELS.HIGH,
@@ -292,7 +292,7 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
292
292
  };
293
293
 
294
294
  // The `---` / `blocked by #N` footer is the canonical serializer's own, so
295
- // the body round-trips through `parse()` and `/deliver`'s resolver reads the
295
+ // the body round-trips through `parse()` and `/mandrel-deliver`'s resolver reads the
296
296
  // ordering from the same place it reads every other Story's.
297
297
  const canonicalSections = serialize(storyBody, {
298
298
  includeFooter: storyBody.depends_on.length > 0,
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * lib/audit-to-stories/seed-from-findings.js
3
3
  *
4
- * Build the `/plan --seed`-shaped one-pager markdown that the audit-to-
5
- * stories Single-plan grouping path emits for `/plan` to consume.
4
+ * Build the `/mandrel-plan --seed`-shaped one-pager markdown that the audit-to-
5
+ * stories Single-plan grouping path emits for `/mandrel-plan` to consume.
6
6
  *
7
7
  * The seed renders the canonical one-pager sections so the authoring
8
8
  * pass can sharpen it without having to invent context:
@@ -10,7 +10,7 @@
10
10
  * - Recommended Direction (rollup of recommendations by dimension)
11
11
  * - Key Assumptions (carries the source-report links forward)
12
12
  * - MVP Scope (the proposed Stories, one bullet per group)
13
- * - Key Files (explicit file paths so `/plan` authoring has concrete
13
+ * - Key Files (explicit file paths so `/mandrel-plan` authoring has concrete
14
14
  * anchors)
15
15
  * - Not Doing (out-of-scope items by convention)
16
16
  *
@@ -97,8 +97,8 @@ function formatMVPScope(groups) {
97
97
  const dims = g.dimensions.join(' / ');
98
98
  const file = g.files[0] ? ` (\`${g.files[0]}\`)` : '';
99
99
  // Carry each group's fingerprint (and location-based semantic-key)
100
- // footer into the seed so a Story authored from it via `/plan` inherits
101
- // the dedup identity — without this the recommended `/plan --seed-file`
100
+ // footer into the seed so a Story authored from it via `/mandrel-plan` inherits
101
+ // the dedup identity — without this the recommended `/mandrel-plan --seed-file`
102
102
  // path is invisible to the next sweep's dedup (Story #4626). The footers
103
103
  // are HTML comments, so they never render in the visible one-pager but
104
104
  // stay machine-readable for the dedup probe.
@@ -17,7 +17,7 @@
17
17
  * edges**. Both halves are written:
18
18
  *
19
19
  * 1. The **body footer** (`---` / `blocked by #N`) — canonical, parsed by
20
- * `/deliver`'s resolver, and the fallback when the dependencies API is
20
+ * `/mandrel-deliver`'s resolver, and the fallback when the dependencies API is
21
21
  * unavailable.
22
22
  * 2. The **native `blocked_by` relation** — visible in the GitHub UI,
23
23
  * readable without parsing markdown, and settable by an operator later.
@@ -13,7 +13,7 @@
13
13
  * The verification is **static**: we inspect `package.json` for a known BDD
14
14
  * runner dependency, and consult a small lookup table of which runners
15
15
  * support which pending/skip tag. We do not boot the runner. This keeps
16
- * `/plan` Phase 7 hermetic and offline.
16
+ * `/mandrel-plan` Phase 7 hermetic and offline.
17
17
  *
18
18
  * **Workspace awareness (Story #2956).** In a pnpm / npm / yarn monorepo the
19
19
  * BDD runner is rarely a root devDependency — it lives in the workspace
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * bdd-scenario-budget.js — envelope byte budget for the `bddScenarios`
3
- * `/plan` context-envelope field (Story #4977).
3
+ * `/mandrel-plan` context-envelope field (Story #4977).
4
4
  *
5
5
  * `bdd-scenario-scanner.js`'s `scanBddScenarios` stays a faithful, uncapped
6
6
  * index of the project's `.feature` corpus — that scan is also used
@@ -1,5 +1,5 @@
1
1
  /**
2
- * bdd-scenario-scanner.js — Gherkin scenario index for /plan Phase 7.
2
+ * bdd-scenario-scanner.js — Gherkin scenario index for /mandrel-plan Phase 7.
3
3
  *
4
4
  * Story #2637 (sibling to #2636's file-assumption gate; the #2634 and #2635
5
5
  * planner-grounding siblings were retired in Story #4811). The Acceptance
@@ -8,7 +8,7 @@
8
8
  * alone — it never inspects the consumer project's existing `.feature`
9
9
  * files. Planned ACs frequently duplicate scenarios that already exist or
10
10
  * re-specify behaviour the codebase already proves; the duplication is
11
- * only discovered (at best) during `/deliver` or (at worst) after
11
+ * only discovered (at best) during `/mandrel-deliver` or (at worst) after
12
12
  * a redundant PR ships.
13
13
  *
14
14
  * `scanBddScenarios` walks every configured feature root, parses each
@@ -21,7 +21,7 @@
21
21
  * have a matching scenario.
22
22
  *
23
23
  * Determinism is load-bearing: the matcher is keyword-based, not
24
- * embedding-based, so re-running `/plan` against the same
24
+ * embedding-based, so re-running `/mandrel-plan` against the same
25
25
  * acceptance spec produces the same disposition annotations.
26
26
  */
27
27
 
@@ -9,7 +9,7 @@
9
9
  * 1. **Discovery** — which files under a scope's `stepRoots` hold step
10
10
  * definitions, and which `.feature` files sit under its `featureRoots`.
11
11
  * Feature discovery is delegated to `listFeatureFiles` in
12
- * `bdd-scenario-scanner.js` rather than copied: /plan's scenario index and
12
+ * `bdd-scenario-scanner.js` rather than copied: /mandrel-plan's scenario index and
13
13
  * this gate must agree on what counts as a feature file, and two walkers
14
14
  * would eventually disagree.
15
15
  * 2. **Matching** — turn each definition's Cucumber expression or regular
@@ -7,7 +7,7 @@
7
7
  * - `enforce_admins: true` — admins do not bypass the prGate suite.
8
8
  * - `required_pull_request_reviews.required_approving_review_count: 0` —
9
9
  * CI is the gate; the operator monitors and iterates the open PR
10
- * to green via `/deliver`'s Phase 7 watch loop.
10
+ * to green via `/mandrel-deliver`'s Phase 7 watch loop.
11
11
  *
12
12
  * Behaviour rules
13
13
  * ---------------
@@ -112,8 +112,8 @@ export function buildManualInstructions({ stagePaths, baseBranch }) {
112
112
  ` git push -u origin ${baseBranch}`,
113
113
  '',
114
114
  'Story delivery runs in git worktrees that check out tracked files only,',
115
- 'so the .agents/ wiring MUST be committed before any /deliver or',
116
- '/deliver run — otherwise the worktree has no scripts and breaks.',
115
+ 'so the .agents/ wiring MUST be committed before any /mandrel-deliver or',
116
+ '/mandrel-deliver run — otherwise the worktree has no scripts and breaks.',
117
117
  ].join('\n');
118
118
  }
119
119
 
@@ -325,7 +325,7 @@ function renderConformanceWorkflow() {
325
325
  # Generated by agents-bootstrap-github. Runs the canonical story-body parser
326
326
  # against human-opened type::story issues and comments when the
327
327
  # body does not round-trip, instead of letting the supported human entry
328
- # points (e.g. /plan from an existing Epic ID) fail silently later. The lint
328
+ # points (e.g. /mandrel-plan from an existing Epic ID) fail silently later. The lint
329
329
  # informs; it never fails the issue. Re-run /agents-bootstrap-github to refresh.
330
330
  name: Issue Body Conformance
331
331
 
@@ -26,7 +26,7 @@ export default {
26
26
  severity: 'blocker',
27
27
  // 'npm-test' keeps the test-wrapper preflight's refusal claim true: a
28
28
  // poisoned shared config is caught before a suite (or N concurrent
29
- // /deliver workers) inherits it, not only at close/retro time (#4580).
29
+ // /mandrel-deliver workers) inherits it, not only at close/retro time (#4580).
30
30
  scope: ['story-close', 'retro', 'npm-test'],
31
31
  autoCorrect: 'refuse-and-print',
32
32
  detect(state) {
@@ -11,7 +11,7 @@
11
11
  *
12
12
  * Scope: 'story-close', 'retro'. The check runs at every
13
13
  * preflight surface that has the opportunity to invoke Story init —
14
- * primarily `/deliver`'s init step — and surfaces as a retro audit
14
+ * primarily `/mandrel-deliver`'s init step — and surfaces as a retro audit
15
15
  * signal if the failure mode resurfaces during a sprint.
16
16
  *
17
17
  * The check is `refuse-and-print`. Auto-rewriting an orchestration call
@@ -253,7 +253,7 @@ export function parseSprintArgs(
253
253
  process.env.AGENT_WORKTREE_ROOT ||
254
254
  null,
255
255
  recutOf: parseTicketId(values['recut-of']),
256
- // Story #4253: pre-resolved Epic linkage threaded by the /deliver
256
+ // Story #4253: pre-resolved Epic linkage threaded by the /mandrel-deliver
257
257
  // fan-out so `single-story-init.js` can skip redundant Epic lookups when
258
258
  // the parent already threaded Epic context (pre-v2; field retained for
259
259
  // CLI compatibility).
@@ -36,7 +36,7 @@ export function applyHeader(content, header) {
36
36
  * True when a workflow opts out of slash-command projection via a
37
37
  * `command: false` key in its YAML frontmatter (#4482). Used for dual-use
38
38
  * lens files (e.g. `audit-security.md`) that stay in
39
- * the payload as `/deliver` audit-suite prompts but must NOT surface as
39
+ * the payload as `/mandrel-deliver` audit-suite prompts but must NOT surface as
40
40
  * standalone slash commands because the host ships a native equivalent.
41
41
  *
42
42
  * Both `sync-claude-commands.js` (projection + orphan-reap) and the
@@ -36,7 +36,7 @@ export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
36
36
  /** @type {'minimal'|'standard'|'strict'} */
37
37
  ceremonyProfile: 'standard',
38
38
  /**
39
- * When true (default), attended `/deliver` lands through merge in one
39
+ * When true (default), attended `/mandrel-deliver` lands through merge in one
40
40
  * close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
41
41
  * Operators opt out per-run with `--no-wait-merge`.
42
42
  */
@@ -266,7 +266,7 @@ const PREFIX_MEANINGS = Object.freeze([
266
266
  const BLOCK_MEANINGS = Object.freeze({
267
267
  project: 'Project identity, paths, and command configuration.',
268
268
  github: 'GitHub provider identity and merge/notification policy.',
269
- planning: 'Inputs and guardrails for /plan.',
269
+ planning: 'Inputs and guardrails for /mandrel-plan.',
270
270
  delivery: 'Execution, isolation, quality, and CI settings for delivery.',
271
271
  qa: 'Agent-driven QA harness contract.',
272
272
  });