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
@@ -12,7 +12,7 @@
12
12
  * Section-scoped writes are the load-bearing contract (extending the
13
13
  * single-writer discipline #4303 established for the body trailer):
14
14
  *
15
- * - The `/plan` persist path upserts the `techSpec` and `acceptanceTable`
15
+ * - The `/mandrel-plan` persist path upserts the `techSpec` and `acceptanceTable`
16
16
  * regions.
17
17
  * - The close-time acceptance reconciler
18
18
  * (`acceptance-spec-reconciler.js`) reads and rewrites the
@@ -16,7 +16,7 @@
16
16
  /**
17
17
  * The one bound every independent-write fan-out over the GitHub API uses
18
18
  * (Story #4952 raised those loops off serial; Story #4961 made this the single
19
- * owner of the number they share). Imported by the `/plan` context gathers,
19
+ * owner of the number they share). Imported by the `/mandrel-plan` context gathers,
20
20
  * the persist checkpoint fan-out, the `agent::ready` flips and the supersede
21
21
  * close loop, so re-tuning the policy is one edit rather than six.
22
22
  *
@@ -2,7 +2,7 @@
2
2
  * parse-id-list — expand a Story-id list that may contain dash ranges.
3
3
  *
4
4
  * Operators name a contiguous span of Stories the way they read one — as a
5
- * range: `/deliver 4922 - 4926`. Enumerating it by hand is the kind of
5
+ * range: `/mandrel-deliver 4922 - 4926`. Enumerating it by hand is the kind of
6
6
  * transcription step that silently drops or invents an id, so the range is a
7
7
  * first-class shape of every delivery id list rather than something the host
8
8
  * expands from prose.
@@ -7,7 +7,7 @@
7
7
  * in-flight count, and it decides. Until now the only adapter was the
8
8
  * flag-driven one (`stories-wave-tick.js --dag/--done/--in-flight`), which
9
9
  * pushed the *gathering* of those inputs onto the caller — in practice onto
10
- * the host LLM following `/deliver`'s prose, re-seeding `--done` and counting
10
+ * the host LLM following `/mandrel-deliver`'s prose, re-seeding `--done` and counting
11
11
  * `--in-flight` by hand every beat. That is hand-maintained accounting on the
12
12
  * one correctness-critical path where a mistake silently wedges a run (a
13
13
  * dropped foreign blocker) or double-dispatches a Story (a miscounted slot).
@@ -47,7 +47,7 @@
47
47
  * The graph resolution is **not** reimplemented here — it reuses
48
48
  * `resolve-stories.js`'s machinery wholesale (body `depends_on` ∪ native
49
49
  * `blocked_by` edges, foreign-blocker resolution, `files[]` footprints), so
50
- * the probe and `/deliver`'s step-1 resolution cannot disagree about what
50
+ * the probe and `/mandrel-deliver`'s step-1 resolution cannot disagree about what
51
51
  * depends on what.
52
52
  *
53
53
  * @module lib/wave-runner/live-probe
@@ -127,7 +127,7 @@ function deriveInFlightIds(storyRecords, dispatched = []) {
127
127
  * in-flight, so `detectWedge` dropped it (its "undone work with no unmet
128
128
  * blockers would have been dispatched" invariant is precisely what probe mode
129
129
  * broke) and the beat reported exit 0 / `ready: []` / `wedged: null` forever.
130
- * `/deliver` reads that as "waiting", so the `agent::blocked` HITL pause — the
130
+ * `/mandrel-deliver` reads that as "waiting", so the `agent::blocked` HITL pause — the
131
131
  * one runtime gate in the protocol — was never surfaced to the operator.
132
132
  *
133
133
  * @param {Array<{id?: number, number?: number, labels?: string[], state?: string}>} storyRecords
@@ -193,7 +193,7 @@ function deriveForeignHeld(storyRecords, self, warn) {
193
193
  * Resolve the provider + repo coordinates the probe reads through.
194
194
  *
195
195
  * Shares `resolve-stories.js`'s provider seam, so probe mode authenticates and
196
- * targets exactly the same repo `/deliver`'s resolution step does. Tests
196
+ * targets exactly the same repo `/mandrel-deliver`'s resolution step does. Tests
197
197
  * inject a stub provider instead of calling this.
198
198
  *
199
199
  * @param {object} [deps]
@@ -2,7 +2,7 @@
2
2
  * lib/wave-runner/ready-set.js — the path-agnostic ready-set scheduling
3
3
  * core.
4
4
  *
5
- * This module is the scheduling kernel the v2 `/deliver` multi-Story path
5
+ * This module is the scheduling kernel the v2 `/mandrel-deliver` multi-Story path
6
6
  * dispatches through (`stories-wave-tick.js`). It replaces wave-*batch* selection
7
7
  * (group N must fully drain before group N+1 opens) with *continuous*,
8
8
  * dependency-driven selection: a Story becomes dispatchable the instant
@@ -345,7 +345,7 @@ function loadDocs(root, fs) {
345
345
  * (`helpers/deliver-story.md` → `# /deliver-story …`). The self-naming test is
346
346
  * what separates an invocable helper from an appendix that merely titles itself
347
347
  * after the command it documents (`helpers/deliver-reference.md` →
348
- * `# /deliver — reference appendix`), which is read on demand, never invoked.
348
+ * `# /mandrel-deliver — reference appendix`), which is read on demand, never invoked.
349
349
  *
350
350
  * @param {WorkflowDoc} doc
351
351
  * @returns {boolean}
@@ -7,7 +7,7 @@
7
7
  * on a Windows lock-class failure, the entry is appended to
8
8
  * `.worktrees/.pending-cleanup.json`. The plan-time `worktree-sweep.js`
9
9
  * reader (shipped in Epic #349) picks up the manifest on the next
10
- * `/plan` run and retries removal
10
+ * `/mandrel-plan` run and retries removal
11
11
  * (`git worktree remove` then `fs.rm`) — by then the live file handles from Node / AV / the Windows
12
12
  * Search indexer are almost always gone. If `MAX_SWEEP_ATTEMPTS` elapses
13
13
  * without clearing, an `OPERATOR ACTION REQUIRED: persistent-lock` line
@@ -17,7 +17,7 @@
17
17
  * git-ignored; no tracked state is mutated.
18
18
  *
19
19
  * **Story #5112 — the manifest is shared mutable state.** `recordPendingCleanup`
20
- * runs from the close reap and `drainPendingCleanup` runs from the `/plan`
20
+ * runs from the close reap and `drainPendingCleanup` runs from the `/mandrel-plan`
21
21
  * boot, so two concurrent delivery sessions can read-modify-write the same
22
22
  * file. Three properties close that:
23
23
  *
@@ -10,8 +10,8 @@
10
10
  * human files a ticket whose body `parse()` rejects (or which lacks the
11
11
  * binding `goal` / `acceptance` / `verify` sections), the lint surfaces a
12
12
  * **comment** on the issue rather than failing silently — the supported
13
- * human entry points (`/plan` from an existing Epic ID, the qa-assist →
14
- * `/plan` handoff) depend on a parseable body.
13
+ * human entry points (`/mandrel-plan` from an existing Epic ID, the qa-assist →
14
+ * `/mandrel-plan` handoff) depend on a parseable body.
15
15
  *
16
16
  * ## Design
17
17
  *
@@ -157,7 +157,7 @@ export function renderConformanceComment(verdict) {
157
157
  '### ⚠️ Ticket body does not round-trip through the Mandrel parser',
158
158
  '',
159
159
  'Agents build ticket bodies from a canonical schema that this body does ' +
160
- 'not match, so the supported human entry points (e.g. `/plan` from an ' +
160
+ 'not match, so the supported human entry points (e.g. `/mandrel-plan` from an ' +
161
161
  'existing Epic ID) will reject it. Please fix the following:',
162
162
  '',
163
163
  ...verdict.problems.map((p) => `- ${p}`),
@@ -2,9 +2,9 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * plan-context.js — step 1 of the collapsed `/plan` pipeline.
5
+ * plan-context.js — step 1 of the collapsed `/mandrel-plan` pipeline.
6
6
  *
7
- * Emits one stdout-pure JSON envelope for the `/plan` authoring middle.
7
+ * Emits one stdout-pure JSON envelope for the `/mandrel-plan` authoring middle.
8
8
  *
9
9
  * Two operator modes (exactly one is required):
10
10
  *
@@ -25,7 +25,7 @@
25
25
  *
26
26
  * Flags:
27
27
  * --out <path> Write the envelope to <path> (parent dirs created).
28
- * `/plan` points this at `<plan-dir>/plan-context.json`,
28
+ * `/mandrel-plan` points this at `<plan-dir>/plan-context.json`,
29
29
  * which is where `plan-persist.js` auto-discovers the
30
30
  * `--tickets` source ids from (Story #4554). Without a
31
31
  * captured envelope persist cannot know a `--tickets` run
@@ -348,7 +348,7 @@ runAsCli(import.meta.url, main, {
348
348
  invocation:
349
349
  'node .agents/scripts/plan-context.js (--seed "<text>" | --seed-file <path> | --tickets <ids> | --amends <id>) [--out <path>] [--pretty]',
350
350
  summary:
351
- 'Build the /plan authoring-context envelope on stdout. Exactly one entry form must be supplied.',
351
+ 'Build the /mandrel-plan authoring-context envelope on stdout. Exactly one entry form must be supplied.',
352
352
  flags: [
353
353
  ['--seed "<text>"', 'Inline seed prose.'],
354
354
  ['--seed-file <path>', 'Seed document to read.'],
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * plan-critics.js — the /plan critic-dispatch verdict CLI (Story #4592).
4
+ * plan-critics.js — the /mandrel-plan critic-dispatch verdict CLI (Story #4592).
5
5
  *
6
- * `/plan` step 2.5 (between Author and Persist) runs this against the draft
6
+ * `/mandrel-plan` step 2.5 (between Author and Persist) runs this against the draft
7
7
  * `stories.json`. It evaluates the consolidation + pre-mortem dispatch
8
8
  * conditions and prints the verdict as JSON on stdout so the workflow can
9
9
  * act on it — dispatching a fresh-context critic sub-agent and folding its
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * plan-persist.js — flat Story GitHub-write surface for v2 `/plan`
4
+ * plan-persist.js — flat Story GitHub-write surface for v2 `/mandrel-plan`
5
5
  * (Stage 3 — `docs/roadmap.md`).
6
6
  *
7
7
  * Given the author-written planning artifacts (`stories.json`, optional shared
@@ -201,7 +201,7 @@ async function loadArtifacts(paths) {
201
201
  *
202
202
  * Exported for tests: this is the join where the envelope-derived source ids
203
203
  * meet the persist engine, so a regression here silently un-wires
204
- * `/plan --tickets` superseding (Story #4554).
204
+ * `/mandrel-plan --tickets` superseding (Story #4554).
205
205
  *
206
206
  * @param {object} values Parsed `parseArgs` values.
207
207
  * @param {ReturnType<typeof resolveInputPaths>} paths
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * plan-run-epilogue.js — execute the real per-run closeout for a
4
- * multi-Story `/deliver`.
4
+ * multi-Story `/mandrel-deliver`.
5
5
  *
6
6
  * Usage:
7
7
  * node .agents/scripts/plan-run-epilogue.js --stories 1,2,3
@@ -67,7 +67,7 @@ export async function main(argv = process.argv.slice(2), deps = {}) {
67
67
  // along with the label itself. The epilogue is keyed on the delivered id
68
68
  // set, and the synthesized `adhoc-<ids>` id it already used for positional
69
69
  // runs is now the only id it needs.
70
- // Range tokens expand here too (`--stories 101-104`): /deliver blesses the
70
+ // Range tokens expand here too (`--stories 101-104`): /mandrel-deliver blesses the
71
71
  // dash range at the operator surface, so the id set the epilogue is keyed on
72
72
  // must read the same shape. Rejecting a bad token is deliberate — the old
73
73
  // silent filter turned a typo into an empty, wrongly-keyed rollup.
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Story #3822 — single source of truth for the post-create board-add
5
5
  * step. Issues created through any create path (`createTicket`,
6
- * `createIssue` — which backs `/plan` persist and the `/plan`
6
+ * `createIssue` — which backs `/mandrel-plan` persist and the `/mandrel-plan`
7
7
  * Phase 4 Epic open) must land on the configured Projects V2 board
8
8
  * without relying on GitHub's "Auto-add to project" built-in workflow,
9
9
  * which is off by default on fresh boards and cannot be enabled via API.
@@ -156,7 +156,7 @@ export function classifyGithubError(err) {
156
156
  // Read-path callers (paginateRest, getTicket, getNativeSubIssues, …) all
157
157
  // absorb the same jittered exponential backoff on transient GitHub errors
158
158
  // through this one primitive, instead of bubbling a one-shot
159
- // 502/429/ECONNRESET that kills a longer pipeline (e.g. the /deliver
159
+ // 502/429/ECONNRESET that kills a longer pipeline (e.g. the /mandrel-deliver
160
160
  // Phase E retro). The network consumers repointed here
161
161
  // (branch-protection, labels, projects-v2-graphql) call with no opts, so
162
162
  // they adopt these defaults; their retry *classes* (the network blips) are
@@ -15,7 +15,7 @@
15
15
  * Epic-hierarchy write surface. It composed the exact `Epic: #N` footer that
16
16
  * `pr-base-guard.js` hard-refuses at delivery, so the framework retained the
17
17
  * ability to generate work it would then reject; it had no production caller
18
- * (`/plan` persists through the bare `createIssue` below).
18
+ * (`/mandrel-plan` persists through the bare `createIssue` below).
19
19
  *
20
20
  * Public surface: `GitHubProvider.createIssue / getTicket /
21
21
  * getTickets / updateTicket / getTicketDependencies / primeTicketCache /
@@ -251,8 +251,8 @@ export class TicketGateway {
251
251
 
252
252
  /**
253
253
  * Create a **bare** issue — no footer composition and no sub-issue link.
254
- * Since Story #4545 this is the *only* create path: `/plan` persist and the
255
- * `/plan` Phase 4 Epic open (`openEpicFromOnePager`'s `createIssue` port)
254
+ * Since Story #4545 this is the *only* create path: `/mandrel-plan` persist and the
255
+ * `/mandrel-plan` Phase 4 Epic open (`openEpicFromOnePager`'s `createIssue` port)
256
256
  * both route through it.
257
257
  *
258
258
  * After the POST, the new issue is added to the configured Project V2
@@ -264,13 +264,13 @@ export class TicketGateway {
264
264
  * The POST is wrapped in `withTransientRetry` (Story #4541) so it absorbs
265
265
  * the same 502/429/ECONNRESET blips the read surfaces already do. It used
266
266
  * to post bare, which made a single transient failure at story *k* of *N*
267
- * abort `/plan` persist with `1..k-1` already live on the tracker.
267
+ * abort `/mandrel-plan` persist with `1..k-1` already live on the tracker.
268
268
  *
269
269
  * Retry alone is not sufficient for that failure mode — a POST whose
270
270
  * response is lost would double-create on the retry. Story #5112 closed
271
271
  * that: `findExisting` is consulted **before every retry POST**, and a hit
272
272
  * is adopted instead of re-created, so a response-lost first attempt files
273
- * exactly one issue. `/plan` persist supplies the plan-fingerprint lookup
273
+ * exactly one issue. `/mandrel-plan` persist supplies the plan-fingerprint lookup
274
274
  * its resume path already uses (`plan-persist`'s `createStoryIssues`);
275
275
  * callers with no content identity omit it and keep the pre-#5112
276
276
  * retry-only behaviour.
@@ -405,7 +405,7 @@ export class TicketGateway {
405
405
  *
406
406
  * The additive POST goes through `withTransientRetry` (Story #4961) on the
407
407
  * same policy as every other call in this file. Story #4952 raised the
408
- * `/plan` write loops that reach this endpoint — the `agent::ready` flips
408
+ * `/mandrel-plan` write loops that reach this endpoint — the `agent::ready` flips
409
409
  * and the checkpoint fan-out — off serial, which is precisely what makes
410
410
  * GitHub's secondary rate limit likelier; `gh-exec` already classifies that
411
411
  * as transient, so the only thing missing was a backoff behind it.
@@ -2,9 +2,9 @@
2
2
 
3
3
  /**
4
4
  * resolve-stories.js — resolve a list of Story ids into the
5
- * `{ stories, dag, done }` envelope `/deliver` sequences from.
5
+ * `{ stories, dag, done }` envelope `/mandrel-deliver` sequences from.
6
6
  *
7
- * This is the ONE resolution step for multi-Story delivery. `/deliver` takes
7
+ * This is the ONE resolution step for multi-Story delivery. `/mandrel-deliver` takes
8
8
  * only Story ids; the graph is discovered here, from live state, rather than
9
9
  * hand-transcribed by the host or implied by a batch label.
10
10
  *
@@ -63,7 +63,7 @@ const HELP = `\
63
63
  Usage:
64
64
  resolve-stories.js --ids <n,n,...> [--pretty] [--no-native]
65
65
 
66
- Resolve Story ids into the { stories, dag, done } envelope /deliver sequences
66
+ Resolve Story ids into the { stories, dag, done } envelope /mandrel-deliver sequences
67
67
  from. Dependencies are discovered from live state: body edges union native
68
68
  blocked_by edges, with every blocker (in-set or foreign) resolved against its
69
69
  real issue state.
@@ -5,7 +5,7 @@
5
5
  * resync-status-column.js — re-assert the GitHub Projects v2 Status
6
6
  * column for a ticket after auto-merge has fired (Story #2845).
7
7
  *
8
- * The `/single-story-deliver` and `/deliver` workflow docs call
8
+ * The `/single-story-deliver` and `/mandrel-deliver` workflow docs call
9
9
  * this CLI after Step 5 confirms `state: "MERGED"` so the orchestrator
10
10
  * wins the race against the GitHub built-in `Pull request merged`
11
11
  * workflow, which would otherwise overwrite Status to whatever value
@@ -84,7 +84,7 @@ const tasks = [
84
84
  nodeGate('lifecycle-lint', '.agents/scripts/check-lifecycle-lint.js'),
85
85
  // Workflow prose surface (Epic #4474 PR5). No workflow may instruct calling
86
86
  // an exported library function that has no CLI entrypoint — the measured
87
- // shim-writing failure mode the /plan collapse killed. See
87
+ // shim-writing failure mode the /mandrel-plan collapse killed. See
88
88
  // check-workflow-cli-lint.js for the paragraph-level heuristic.
89
89
  nodeGate('workflow-cli-lint', '.agents/scripts/check-workflow-cli-lint.js'),
90
90
  // Label-vocabulary citations in `.agents/docs/SDLC.md` and
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * single-story-close.js — Close a Story against `main` (v2 `/deliver` path).
4
+ * single-story-close.js — Close a Story against `main` (v2 `/mandrel-deliver` path).
5
5
  *
6
- * Thin CLI entry for `/deliver` / `helpers/deliver-story`. Opens a PR from
6
+ * Thin CLI entry for `/mandrel-deliver` / `helpers/deliver-story`. Opens a PR from
7
7
  * `story-<id>` to `project.baseBranch`, runs Story-scope review, and arms
8
8
  * auto-merge. There is no Epic parent, epic-merge-lock, or wave merge.
9
9
  *
@@ -2,7 +2,7 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * single-story-init.js — Initialize a Story for v2 `/deliver`.
5
+ * single-story-init.js — Initialize a Story for v2 `/mandrel-deliver`.
6
6
  *
7
7
  * Seeds `story-<id>` from `project.baseBranch` (default `main`), materialises
8
8
  * the per-Story worktree when isolation is enabled, upserts a `story-init`
@@ -122,7 +122,7 @@ export function assertDeliverableStory(story, storyId) {
122
122
  if (!story.labels.includes(TYPE_LABELS.STORY)) {
123
123
  throw new Error(
124
124
  `Issue #${storyId} is not a Story (labels: ${story.labels.join(', ')}). ` +
125
- 'v2 /deliver accepts type::story tickets only.',
125
+ 'v2 /mandrel-deliver accepts type::story tickets only.',
126
126
  );
127
127
  }
128
128
  if (story.state === 'closed') {
@@ -132,7 +132,7 @@ export function assertDeliverableStory(story, storyId) {
132
132
  if (/\b(?:Epic|Parent):\s*#\d+/i.test(body)) {
133
133
  throw new Error(
134
134
  `Story #${storyId} still declares an Epic/Parent footer. ` +
135
- 'v2 delivery is Story-only — re-plan as a standalone Story before /deliver.',
135
+ 'v2 delivery is Story-only — re-plan as a standalone Story before /mandrel-deliver.',
136
136
  );
137
137
  }
138
138
  }
@@ -189,7 +189,7 @@ export async function assertNotForeignExecuting({
189
189
  (lease.previousOwner
190
190
  ? ` (assignee @${lease.previousOwner})`
191
191
  : ' with no assignee') +
192
- '. Another /deliver run may already own it. Confirm that run is dead, ' +
192
+ '. Another /mandrel-deliver run may already own it. Confirm that run is dead, ' +
193
193
  'then re-run with --steal to take it.',
194
194
  );
195
195
  }
@@ -607,7 +607,7 @@ export async function runSingleStoryInit({
607
607
  );
608
608
  progress('INIT', `Initializing standalone Story #${storyId}...`);
609
609
 
610
- // Issue #4483 — deterministic remote evidence at the v2 `/deliver` entry
610
+ // Issue #4483 — deterministic remote evidence at the v2 `/mandrel-deliver` entry
611
611
  // seam (`single-story-init.js`). The
612
612
  // probe is read-only, so it runs under --dry-run too. The CLI records
613
613
  // the fact; the workflow owns the `agent::blocked` transition on
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * stories-wave-tick.js — continuous ready-set planner for the standalone
5
- * `/deliver` story-list path.
5
+ * `/mandrel-deliver` story-list path.
6
6
  *
7
7
  * Thin **adapter** over the path-agnostic ready-set scheduling core
8
8
  * (`lib/wave-runner/ready-set.js#planReadySet`). It emits the set of
@@ -21,7 +21,7 @@
21
21
  * **Two modes, one kernel.**
22
22
  *
23
23
  * - **Probe mode** (`--stories <csv> --probe-live [--dispatched <csv>]`) is
24
- * the canonical `/deliver` beat: the graph, the done set, and the in-flight
24
+ * the canonical `/mandrel-deliver` beat: the graph, the done set, and the in-flight
25
25
  * count are resolved from **live state** via `lib/wave-runner/live-probe.js`.
26
26
  * The caller supplies ids, so there is no accounting to hand-maintain
27
27
  * across beats — the seed-the-first-beat's-`--done` footgun the workflow
@@ -97,14 +97,14 @@
97
97
  * `--done` and `ready` is empty.
98
98
  *
99
99
  * The per-beat concurrency cap is resolved from the same config seam
100
- * `/deliver` uses — `resolveConfig` + `getRunners` reading
100
+ * `/mandrel-deliver` uses — `resolveConfig` + `getRunners` reading
101
101
  * `delivery.deliverRunner.concurrencyCap` (default 3) — so a
102
102
  * `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
103
103
  * overrides the config-resolved value for that run only, and the envelope's
104
104
  * `capPrecedence` names which source won so the override is never silent
105
105
  * (Story #4875). This shares one
106
106
  * deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
107
- * one scheduling kernel with every `/deliver` multi-Story invocation.
107
+ * one scheduling kernel with every `/mandrel-deliver` multi-Story invocation.
108
108
  *
109
109
  * Exit codes: 0 ok · 1 input error · 2 dependency cycle (`cycleError`) ·
110
110
  * 3 wedged (`wedged`) — ready is empty, nothing is in flight, and undone
@@ -170,7 +170,7 @@ and the same file-overlap guard as planReadySet.
170
170
 
171
171
  Two modes:
172
172
  --probe-live Resolve the graph and derive done / in-flight from LIVE state
173
- (the canonical /deliver beat). Nothing is hand-maintained
173
+ (the canonical /mandrel-deliver beat). Nothing is hand-maintained
174
174
  across beats. Mutually exclusive with --dag/--dag-file/--done/
175
175
  --in-flight. Adds "done" and "epilogueDue" to the envelope.
176
176
  --dag Legacy flag mode: the caller supplies the graph and the run
@@ -662,7 +662,7 @@ export function parseConcurrencyOverride(raw) {
662
662
  /**
663
663
  * Resolve the per-beat concurrency cap.
664
664
  *
665
- * Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
665
+ * Mirrors the `/mandrel-deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
666
666
  * project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
667
667
  * then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
668
668
  * 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
@@ -855,7 +855,7 @@ export function buildReadySetEnvelope(
855
855
  return {
856
856
  envelope: {
857
857
  ...base,
858
- cycleError: `Dependency cycle detected: ${cycle.join(' → ')}. Fix the depends_on declarations before running /deliver.`,
858
+ cycleError: `Dependency cycle detected: ${cycle.join(' → ')}. Fix the depends_on declarations before running /mandrel-deliver.`,
859
859
  },
860
860
  exitCode: 2,
861
861
  };
@@ -1087,7 +1087,7 @@ export function runStoriesWaveTick({
1087
1087
  *
1088
1088
  * This is the flag-free beat. The caller supplies only the Story ids it was
1089
1089
  * asked to deliver; `done` and `inFlight` are probed rather than transcribed,
1090
- * which is what makes the `/deliver` loop's old seed-the-first-beat footgun
1090
+ * which is what makes the `/mandrel-deliver` loop's old seed-the-first-beat footgun
1091
1091
  * structurally impossible instead of merely documented.
1092
1092
  *
1093
1093
  * The envelope is the flag mode's, plus three probe-only fields the caller can
@@ -13,7 +13,7 @@ description:
13
13
  - Phase 1 MUST restate the idea as a "How Might We" statement, ask 3–5 sharpening questions via `AskUserQuestion`, and generate 5–8 variations (never 20+ shallow ones) — each carrying a reason it exists, told as a short story, not a bare bullet. Do not proceed until target user and success criteria are explicit.
14
14
  - Phase 2 grill loop poses **one** question at a time, each with a recommended answer + one-line rationale grounded in user input / codebase / first principles; never batch questions and never omit the recommendation.
15
15
  - Re-enumerate open branches after every grill answer; stop only when no unresolved decisions remain. Take the off-ramp directly to Phase 3 when the idea is already crisply scoped. A branch consciously deferred rather than resolved records its deferral reason.
16
- - Phase 3 emits a markdown one-pager with the canonical five planning headings exactly: `## Context`, `## Goal`, `## Non-Goals`, `## Scope`, `## Acceptance Criteria` (plus optional `## Open Questions`). No alternate heading text — the `/plan` clarity gate depends on this verbatim.
16
+ - Phase 3 emits a markdown one-pager with the canonical five planning headings exactly: `## Context`, `## Goal`, `## Non-Goals`, `## Scope`, `## Acceptance Criteria` (plus optional `## Open Questions`). No alternate heading text — the `/mandrel-plan` clarity gate depends on this verbatim.
17
17
  - Surface every key assumption inside `## Context` (or `## Scope`); assumptions do not get their own heading. Unresolved decisions MUST NOT carry into the one-pager.
18
18
  - The `## Non-Goals` list is mandatory and each entry includes a reason — focus is created by explicit exclusion.
19
19
  - Be honest, not supportive: push back on weak ideas with kindness; never function as a yes-machine.
@@ -22,10 +22,10 @@ description:
22
22
 
23
23
  ## Activation
24
24
 
25
- Called from [`/plan`](../../../workflows/plan.md) during ideation when the
25
+ Called from [`/mandrel-plan`](../../../workflows/mandrel-plan.md) during ideation when the
26
26
  operator supplies `--seed "<text>"` (or runs ideation with no seed and the host
27
27
  collects one interactively). The skill sharpens freeform intent into the
28
- canonical planning sections that `/plan` then folds into a Story. There is no
28
+ canonical planning sections that `/mandrel-plan` then folds into a Story. There is no
29
29
  separate Epic Clarity Gate path in v2 — N=1 Story authoring with a folded
30
30
  `## Spec` is the lean default.
31
31
 
@@ -134,9 +134,9 @@ clothes — inside the grill loop, not after the one-pager is written.
134
134
  #### Phase 3: Sharpen & Ship
135
135
 
136
136
  Produce a markdown one-pager that moves work forward. The five canonical
137
- headings below match `.agents/templates/epic-from-idea.md` and the `/plan`
137
+ headings below match `.agents/templates/epic-from-idea.md` and the `/mandrel-plan`
138
138
  clarity gate; emit them verbatim so the renderer can substitute the body into a
139
- `/plan` Story seed without translation.
139
+ `/mandrel-plan` Story seed without translation.
140
140
 
141
141
  ```markdown
142
142
  # [Idea Name]
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: scope-triage
3
3
  description:
4
- Optional split-advisory for `/plan`. Under v2 there is no epic|story routing
5
- verdict — `/plan` always authors Stories. Use this skill only when judging
4
+ Optional split-advisory for `/mandrel-plan`. Under v2 there is no epic|story routing
5
+ verdict — `/mandrel-plan` always authors Stories. Use this skill only when judging
6
6
  whether a draft should stay one Story or legitimately split (near-zero
7
7
  overlap or an architectural seam).
8
8
  ---
@@ -11,7 +11,7 @@ description:
11
11
 
12
12
  ## Policy Capsule
13
13
 
14
- - There is **no** `epic | story | borderline` routing verdict in v2. `/plan`
14
+ - There is **no** `epic | story | borderline` routing verdict in v2. `/mandrel-plan`
15
15
  is a single path that emits **one Story by default**.
16
16
  - This skill is an optional **split advisory**: should the author keep one
17
17
  Story, or does the seed clear the default-single split policy?
@@ -97,7 +97,7 @@
97
97
  "tier": "core",
98
98
  "category": "core",
99
99
  "path": ".agents/skills/core/scope-triage/SKILL.md",
100
- "description": "Optional split-advisory for `/plan`. Under v2 there is no epic|story routing verdict — `/plan` always authors Stories. Use this skill only when judging whether a draft should stay one Story or legitimately split (near-zero overlap or an architectural seam).",
100
+ "description": "Optional split-advisory for `/mandrel-plan`. Under v2 there is no epic|story routing verdict — `/mandrel-plan` always authors Stories. Use this skill only when judging whether a draft should stay one Story or legitimately split (near-zero overlap or an architectural seam).",
101
101
  "policyCapsuleBullets": 5,
102
102
  "allowedTools": null,
103
103
  "vendor": null
@@ -170,7 +170,7 @@ Record each `F#` finding as a `QaLedgerItem` on the shared session ledger under
170
170
  `temp/qa/`, then route the ledger through the shared classify → route →
171
171
  disposition → promote core — both stated once in
172
172
  [`qa-core.md`](../../../../workflows/helpers/qa-core.md). The harness **MUST
173
- NOT** create tickets autonomously: findings are promoted through `/plan` only
173
+ NOT** create tickets autonomously: findings are promoted through `/mandrel-plan` only
174
174
  after the operator confirms each disposition at the HITL write gate. That gate
175
175
  is the safety boundary against spurious filing.
176
176
 
@@ -27,7 +27,7 @@ than empty findings. The applicability probe (`hasPersistenceLayer` in
27
27
  [`lib/audit-suite/selector.js`](../scripts/lib/audit-suite/selector.js), gated
28
28
  by `target: "data-model"` in
29
29
  [`schemas/audit-rules.json`](../schemas/audit-rules.json)) makes this decision
30
- automatically in `/deliver` and plan-run modes; in a manual invocation you MUST
30
+ automatically in `/mandrel-deliver` and plan-run modes; in a manual invocation you MUST
31
31
  make the same determination yourself before reading anything else.
32
32
 
33
33
  ## Scope
@@ -188,7 +188,7 @@ auditable.
188
188
  ## Periodic full-scope sweep
189
189
 
190
190
  Context Economy findings accrete slowly — a doc that is lean today grows a
191
- bloated tail over many deliveries, and no single change-set-scoped `/deliver`
191
+ bloated tail over many deliveries, and no single change-set-scoped `/mandrel-deliver`
192
192
  run sees the whole picture. Run this lens **full-scope** on a
193
193
  recurring cadence so the drift is caught before it compounds:
194
194
 
@@ -202,7 +202,7 @@ recurring cadence so the drift is caught before it compounds:
202
202
  Route the resulting `audit-documentation-results.md` through
203
203
  [`/audit-to-stories`](audit-to-stories.md), which groups the findings,
204
204
  deduplicates them against existing Issues by fingerprint, and opens
205
- remediation Stories (or chains into `/plan --seed`) so the Context-Economy
205
+ remediation Stories (or chains into `/mandrel-plan --seed`) so the Context-Economy
206
206
  findings land as actionable, tracked work rather than a report nobody reads.
207
207
 
208
208
  ## Constraint (lens-specific carve-out)
@@ -3,7 +3,7 @@ description:
3
3
  Convert findings produced by the audit-* workflows into actionable
4
4
  GitHub Stories. Reads temp/audits/audit-*-results.md, groups findings
5
5
  cross-audit, deduplicates against existing Issues by fingerprint, and
6
- either chains into /plan --seed-file or opens standalone Stories.
6
+ either chains into /mandrel-plan --seed-file or opens standalone Stories.
7
7
  ---
8
8
 
9
9
  # /audit-to-stories [audit-file-or-glob]
@@ -111,8 +111,8 @@ Ask:
111
111
 
112
112
  > How would you like these `<M>` Stories created?
113
113
  >
114
- > - **Single plan via `/plan`** **[Recommended]** — chains into
115
- > `/plan --seed-file <emitted.md>` so the standard Story authoring
114
+ > - **Single plan via `/mandrel-plan`** **[Recommended]** — chains into
115
+ > `/mandrel-plan --seed-file <emitted.md>` so the standard Story authoring
116
116
  > handles the seed. Prefer one Story; split only under the
117
117
  > default-single policy.
118
118
  > - **Individual standalone Stories** — opens one GitHub Issue per
@@ -122,7 +122,7 @@ Ask:
122
122
 
123
123
  ## Phase 5a — Single-plan path
124
124
 
125
- Build the `/plan` seed from the filtered plan envelope:
125
+ Build the `/mandrel-plan` seed from the filtered plan envelope:
126
126
 
127
127
  ```bash
128
128
  node .agents/scripts/audit-to-stories.js --emit-plan-seed \
@@ -132,16 +132,16 @@ node .agents/scripts/audit-to-stories.js --emit-plan-seed \
132
132
 
133
133
  The seed renders the canonical one-pager sections — Problem Statement,
134
134
  Recommended Direction, Key Assumptions (with links to every source
135
- report), MVP Scope (the M proposed Stories), Key Files (so `/plan`'s
135
+ report), MVP Scope (the M proposed Stories), Key Files (so `/mandrel-plan`'s
136
136
  authoring step has concrete anchors), Not Doing.
137
137
 
138
138
  Chain into the existing planning entrypoint:
139
139
 
140
140
  ```text
141
- /plan --seed-file <path-to-seed>
141
+ /mandrel-plan --seed-file <path-to-seed>
142
142
  ```
143
143
 
144
- (`/plan --seed "$(cat <path>)"` also works for small seeds). `/plan`
144
+ (`/mandrel-plan --seed "$(cat <path>)"` also works for small seeds). `/mandrel-plan`
145
145
  then runs its author → persist path, as documented in its workflow.
146
146
 
147
147
  **Dedup provenance is carried mechanically — do not hand-copy it.** The seed's
@@ -210,9 +210,9 @@ every Story that has a resolvable blocker with a canonical
210
210
  GitHub `blocked_by` relations. An edge whose target was never opened (deduped,
211
211
  ledger-suppressed) drops rather than becoming a `blocked by #undefined`.
212
212
 
213
- **Do not skip this.** `/deliver` has no other source for this cohort's order:
213
+ **Do not skip this.** `/mandrel-deliver` has no other source for this cohort's order:
214
214
  its footprint guard ignores the shared provenance footers, so an unwired cohort
215
- is genuinely unordered and `/deliver` will co-dispatch Stories the edges say
215
+ is genuinely unordered and `/mandrel-deliver` will co-dispatch Stories the edges say
216
216
  must follow one another.
217
217
 
218
218
  ## Phase 6 — Idempotency (folded into Phase 1 scan)
@@ -288,7 +288,7 @@ summarising the run:
288
288
  · <L> skipped (re-occurring)"`.
289
289
 
290
290
  When the single-plan path ran, link the Story (or plan-run) the chained
291
- `/plan` opened. When the Standalone-Stories path ran, list every Issue URL.
291
+ `/mandrel-plan` opened. When the Standalone-Stories path ran, list every Issue URL.
292
292
 
293
293
  ## Constraints
294
294
 
@@ -345,7 +345,7 @@ scheduler owns the cadence; this workflow owns the routing.
345
345
 
346
346
  ## See also
347
347
 
348
- - [`/plan`](plan.md) — the planning pipeline `/audit-to-stories`
348
+ - [`/mandrel-plan`](mandrel-plan.md) — the planning pipeline `/audit-to-stories`
349
349
  chains into for Story creation.
350
350
  - [`lib/findings/route-finding.js`](../scripts/lib/findings/route-finding.js) —
351
351
  the shared fingerprint/dedup/route helper this workflow and `qa-explore`