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
@@ -23,7 +23,7 @@ export const DEFAULT_DECOMPOSER = Object.freeze({
23
23
  * the GitHub API with concurrent label writes, while still allowing a
24
24
  * small ready-set fan-out. Operators who want strictly sequential delivery
25
25
  * should set `delivery.deliverRunner.concurrencyCap: 1`. Raising the cap
26
- * reduces wall-clock time where dependencies allow. See `deliver.md` and
26
+ * reduces wall-clock time where dependencies allow. See `mandrel-deliver.md` and
27
27
  * `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap`.
28
28
  *
29
29
  * Story #4545 removed the sibling `verifyConcurrencyCap`: the
@@ -46,7 +46,7 @@ const DEFAULT_DELIVER_RUNNER = Object.freeze({
46
46
  });
47
47
 
48
48
  /**
49
- * Default auto-fix loop ceilings for /deliver code-review. Operators
49
+ * Default auto-fix loop ceilings for /mandrel-deliver code-review. Operators
50
50
  * override via `delivery.codeReview.*` in `.agentrc.json` (Story #2611,
51
51
  * Epic #2586; `autoFixSeverity` default `'medium'` per Story #4399).
52
52
  */
@@ -77,7 +77,7 @@ export function resolveWorkingPath({
77
77
 
78
78
  /**
79
79
  * One-shot environment-aware runtime resolution. Returns the trio of runtime
80
- * signals consumed across `/deliver`: whether worktree isolation is on
80
+ * signals consumed across `/mandrel-deliver`: whether worktree isolation is on
81
81
  * for this process, the session id for claim labels, and whether we're in a
82
82
  * Claude Code web session. Each signal also records its **source** so the
83
83
  * `story-init` startup log can name why the value is what it is.
@@ -41,7 +41,7 @@
41
41
  * parent of `git rev-parse --git-common-dir`) rather than `process.cwd()`.
42
42
  * Without this, a story child that `cd`s into `.worktrees/story-<id>/` before
43
43
  * emitting a lifecycle record would append it to
44
- * `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/deliver` host
44
+ * `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/mandrel-deliver` host
45
45
  * (running from the main checkout) reads the main-checkout copy — so the
46
46
  * host never sees the child's records (the audit-#3513 bug class; its
47
47
  * original `story.heartbeat` instance is gone with that emitter, but the
@@ -372,7 +372,7 @@ function storyTerminalEnvelopeName(sid) {
372
372
  * `close-gates-<sid>.log`, and `deliver-recover.js` reads the pair together to
373
373
  * tell a finished close from a live one. Sharing `orchestrationLogDir` also
374
374
  * means it inherits main-checkout anchoring for free — the close runs inside
375
- * `.worktrees/story-<sid>/` while the `/deliver` host reads from the main
375
+ * `.worktrees/story-<sid>/` while the `/mandrel-deliver` host reads from the main
376
376
  * checkout, and an un-anchored path would put the envelope somewhere the
377
377
  * router never looks.
378
378
  *
@@ -66,13 +66,13 @@ const DOCS_FRESHNESS_SCHEMA = {
66
66
  */
67
67
  const DELIVER_RUNNER_SCHEMA = {
68
68
  type: 'object',
69
- description: 'Bounded-concurrency knob for the /deliver fan-out.',
69
+ description: 'Bounded-concurrency knob for the /mandrel-deliver fan-out.',
70
70
  properties: {
71
71
  concurrencyCap: {
72
72
  type: 'integer',
73
73
  minimum: 1,
74
74
  description:
75
- '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.',
75
+ '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.',
76
76
  // getRunners() resolves this from its own DEFAULT_DELIVER_RUNNER
77
77
  // constant, not from this annotation; the parity suite asserts the two
78
78
  // agree.
@@ -637,7 +637,7 @@ const TEMP_RETENTION_SCHEMA = {
637
637
  export const DELIVERY_SCHEMA = {
638
638
  type: 'object',
639
639
  description:
640
- '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.',
640
+ '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.',
641
641
  properties: {
642
642
  execution: EXECUTION_SCHEMA,
643
643
  docsFreshness: DOCS_FRESHNESS_SCHEMA,
@@ -223,7 +223,7 @@ export const QUALITY_SCHEMA = {
223
223
  navigability: {
224
224
  type: 'object',
225
225
  description:
226
- "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.",
226
+ "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.",
227
227
  properties: {
228
228
  routeGlobs: {
229
229
  type: 'array',
@@ -242,7 +242,7 @@ export const QUALITY_SCHEMA = {
242
242
  journeySuite: {
243
243
  type: 'string',
244
244
  description:
245
- "Path or command for the per-persona journey suite /deliver's per-Story ceremony runs.",
245
+ "Path or command for the per-persona journey suite /mandrel-deliver's per-Story ceremony runs.",
246
246
  },
247
247
  },
248
248
  additionalProperties: false,
@@ -253,7 +253,7 @@ export const QUALITY_SCHEMA = {
253
253
 
254
254
  /**
255
255
  * `delivery.codeReview` — review-provider chain + bounded-retry knobs for
256
- * the /deliver code-review ceremony (Story-close and plan-run close).
256
+ * the /mandrel-deliver code-review ceremony (Story-close and plan-run close).
257
257
  *
258
258
  * `autoFixSeverity` (Story #4399) is the threshold that governs which
259
259
  * findings the host-LLM focused-fix routing remediates on-branch —
@@ -263,7 +263,7 @@ export const QUALITY_SCHEMA = {
263
263
  export const CODE_REVIEW_SCHEMA = {
264
264
  type: 'object',
265
265
  description:
266
- 'Review-provider chain plus bounded-retry knobs for the /deliver code-review ceremony.',
266
+ 'Review-provider chain plus bounded-retry knobs for the /mandrel-deliver code-review ceremony.',
267
267
  properties: {
268
268
  // Story #2825 (Epic #2815) seeded the pluggable review backend
269
269
  // with `native`; Story #2830 added `codex` (the
@@ -353,7 +353,7 @@ export const CODE_REVIEW_SCHEMA = {
353
353
  type: 'integer',
354
354
  minimum: 0,
355
355
  description:
356
- 'Maximum auto-fix retry attempts per finding in /deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.',
356
+ 'Maximum auto-fix retry attempts per finding in /mandrel-deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.',
357
357
  default: DEFAULT_CODE_REVIEW.maxFixAttempts,
358
358
  },
359
359
  maxFixScopeFiles: {
@@ -367,7 +367,7 @@ export const CODE_REVIEW_SCHEMA = {
367
367
  type: 'string',
368
368
  enum: ['high', 'medium'],
369
369
  description:
370
- '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.',
370
+ '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.',
371
371
  default: DEFAULT_CODE_REVIEW.autoFixSeverity,
372
372
  },
373
373
  },
@@ -432,7 +432,7 @@ const GITHUB_SCHEMA = {
432
432
  };
433
433
 
434
434
  // ---------------------------------------------------------------------------
435
- // planning.* — inputs to /plan
435
+ // planning.* — inputs to /mandrel-plan
436
436
  // ---------------------------------------------------------------------------
437
437
 
438
438
  // Story #4541: `planning.context.{maxBytes, summaryMode}` was retired. The
@@ -456,7 +456,7 @@ const GITHUB_SCHEMA = {
456
456
  const PLANNING_SCHEMA = {
457
457
  type: 'object',
458
458
  description:
459
- 'Inputs to `/plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.',
459
+ 'Inputs to `/mandrel-plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.',
460
460
  properties: {
461
461
  riskHeuristics: {
462
462
  ...LIST_OR_EXTENDER_OF_STRINGS,
@@ -591,7 +591,7 @@ const PLANNING_SCHEMA = {
591
591
  };
592
592
 
593
593
  // ---------------------------------------------------------------------------
594
- // delivery.* — /deliver + story-deliver consume. The full block of
594
+ // delivery.* — /mandrel-deliver + story-deliver consume. The full block of
595
595
  // per-key sub-schemas lives in `config-settings-schema-delivery.js` (refs
596
596
  // #3457); DELIVERY_SCHEMA is imported above and referenced unchanged below.
597
597
  // ---------------------------------------------------------------------------
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * duplicate-search.js — Cross-Story Duplicate Detection
3
3
  *
4
- * Used by `/plan` to surface open Stories whose scope overlaps with a
4
+ * Used by `/mandrel-plan` to surface open Stories whose scope overlaps with a
5
5
  * seed / seed-file / tickets corpus before new Stories are created.
6
6
  * Returns ranked candidates with an overlap score and URL so the host
7
7
  * LLM can pause for HITL confirmation.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * prior-feedback-fetcher.js — gh-CLI-backed fetcher for open meta feedback
3
- * issues that feed the `/plan` Phase 0 planner context.
3
+ * issues that feed the `/mandrel-plan` Phase 0 planner context.
4
4
  *
5
5
  * Story #2554 / Epic #2547. Tech Spec #2550 specifies that the fetcher MUST
6
6
  * return open issues carrying the `meta::framework-gap` and
@@ -17,8 +17,8 @@
17
17
  * `recurringDefectClasses[]` array derived from the `friction::<class>`
18
18
  * labels the retro routed-proposals composer stamps onto the meta issues it
19
19
  * proposes. That closes the retro→planner loop: a recurring defect class
20
- * caught by review/deliver is filed as a `meta::*` + `friction::<class>`
21
- * issue, and the next `/plan` Phase 0 surfaces the class (with a recurrence
20
+ * caught by review/mandrel-deliver is filed as a `meta::*` + `friction::<class>`
21
+ * issue, and the next `/mandrel-plan` Phase 0 surfaces the class (with a recurrence
22
22
  * count across the open feedback issues) to the decompose-author guidance so
23
23
  * the planning floor ratchets up. The derivation is no-op-safe: issues with
24
24
  * no `friction::*` label contribute nothing and the array is empty.
@@ -297,7 +297,7 @@ export async function fetchPriorFeedback({
297
297
 
298
298
  // Story #4135 (Epic #4131, F11) — close the retro→planner loop: derive the
299
299
  // recurring defect classes from the `friction::<class>` labels carried by
300
- // the deduped feedback issues, so the next /plan Phase 0 surfaces them to
300
+ // the deduped feedback issues, so the next /mandrel-plan Phase 0 surfaces them to
301
301
  // the decompose-author guidance. No-op-safe when no issue carries a
302
302
  // `friction::*` label (empty array, no behavioural change).
303
303
  envelope.recurringDefectClasses = extractRecurringDefectClasses([
@@ -6,7 +6,7 @@
6
6
  * (`retro-proposals.js`) already split the Epic's source-tagged friction
7
7
  * into `framework` / `consumer` actionable items, each carrying a
8
8
  * pre-drafted `gh issue create` command stanza. Historically an operator
9
- * had to copy-paste those stanzas by hand, so `/plan` Phase 0's
9
+ * had to copy-paste those stanzas by hand, so `/mandrel-plan` Phase 0's
10
10
  * `recurringDefectClasses` stayed empty unless someone remembered to run
11
11
  * the commands. This module files them mechanically instead — the retro
12
12
  * body then lists the real filed issue numbers rather than paste-ready
@@ -51,7 +51,7 @@ export const FINDING_CLASSES = Object.freeze([
51
51
  /**
52
52
  * Class → label-set routing table. Each class maps to exactly one label set.
53
53
  * `tooling-dx` is the framework-gap path: it carries `meta::framework-gap` so
54
- * the `/plan` Phase 0 feedback fetcher surfaces it to the planner.
54
+ * the `/mandrel-plan` Phase 0 feedback fetcher surfaces it to the planner.
55
55
  */
56
56
  const CLASS_TO_LABELS = Object.freeze({
57
57
  'product-bug': [FOCUS_LABELS.PRODUCT],
@@ -5,8 +5,8 @@
5
5
  * tail of the exploratory-QA Triage path: once an operator has dispositioned a
6
6
  * session's ledger items (see `.agents/schemas/qa-ledger.schema.json` and
7
7
  * `lib/qa/qa-session.js`), the still-untriaged backlog is clustered and each
8
- * cluster is promoted to a follow-up ticket — a single Story (via `/plan`)
9
- * for a tight, one-deliverable cluster, or a multi-Story plan-seed (via `/plan --seed`) for
8
+ * cluster is promoted to a follow-up ticket — a single Story (via `/mandrel-plan`)
9
+ * for a tight, one-deliverable cluster, or a multi-Story plan-seed (via `/mandrel-plan --seed`) for
10
10
  * a broad cluster that spans multiple coverage surfaces. Each contributing
11
11
  * ledger item then has the resulting `routedTo` issue link written back onto it
12
12
  * so a resume run sees the item as filed rather than re-promoting it.
@@ -23,7 +23,7 @@
23
23
  * Pure orchestration: **no network I/O lives here.** Every GitHub side-effect
24
24
  * (issue search, ticket creation) flows through INJECTED PORTS so the unit test
25
25
  * runs with no network. Production wires the ports to the GitHub provider /
26
- * `/plan` / `/plan` surfaces; tests pass in-memory stubs.
26
+ * `/mandrel-plan` / `/mandrel-plan` surfaces; tests pass in-memory stubs.
27
27
  */
28
28
 
29
29
  import { fingerprintFinding, routeFinding } from './route-finding.js';
@@ -35,8 +35,8 @@ const TRIAGED_DISPOSITIONS = Object.freeze(['file', 'defer', 'dismiss']);
35
35
  /**
36
36
  * The two promotion targets a cluster routes to.
37
37
  *
38
- * `PLAN_SEED` promotes a broad cluster by seeding a multi-Story `/plan`
39
- * run (`/plan --seed`). Its persisted wire token is the legacy string
38
+ * `PLAN_SEED` promotes a broad cluster by seeding a multi-Story `/mandrel-plan`
39
+ * run (`/mandrel-plan --seed`). Its persisted wire token is the legacy string
40
40
  * `'epic'`: archived qa-ledger records (and the distributed
41
41
  * `qa-ledger.schema.json` `routedTo.kind` enum) still carry `'epic'`, so
42
42
  * the value is kept read-compatible while the write-side constant name is
@@ -49,8 +49,8 @@ export const PROMOTION_TARGETS = Object.freeze({
49
49
 
50
50
  /**
51
51
  * A cluster of more than this many distinct coverage surfaces is broad enough
52
- * to warrant a plan-seed (`/plan --seed`) rather than a single Story
53
- * (`/plan`). One or two surfaces is a tight, single-deliverable cluster.
52
+ * to warrant a plan-seed (`/mandrel-plan --seed`) rather than a single Story
53
+ * (`/mandrel-plan`). One or two surfaces is a tight, single-deliverable cluster.
54
54
  */
55
55
  const EPIC_COVERAGE_THRESHOLD = 2;
56
56
 
@@ -168,8 +168,8 @@ export function clusterLedgerItems(items) {
168
168
  /**
169
169
  * Decide a cluster's promotion target. A cluster that spans more than
170
170
  * {@link EPIC_COVERAGE_THRESHOLD} distinct coverage surfaces is broad enough to
171
- * warrant a plan-seed (`/plan --seed`); otherwise it is a single-deliverable
172
- * Story (`/plan`).
171
+ * warrant a plan-seed (`/mandrel-plan --seed`); otherwise it is a single-deliverable
172
+ * Story (`/mandrel-plan`).
173
173
  *
174
174
  * @param {{ coverages: string[] }} cluster
175
175
  * @returns {'story'|'epic'}
@@ -242,7 +242,7 @@ function routedToLink(issue, kind) {
242
242
  * shared `routeFinding` against existing Issues (via the injected search
243
243
  * port). This dedups against work already filed.
244
244
  * 2. On a `new` decision, open the follow-up ticket through the injected
245
- * `createStory` (`/plan`) or `createPlanSeed` (`/plan --seed`) port,
245
+ * `createStory` (`/mandrel-plan`) or `createPlanSeed` (`/mandrel-plan --seed`) port,
246
246
  * chosen by {@link targetForCluster}. On any other decision, link back to
247
247
  * the matched Issue rather than creating a duplicate.
248
248
  * 3. Stamp the resolved `routedTo` link onto every contributing ledger item
@@ -259,9 +259,9 @@ function routedToLink(issue, kind) {
259
259
  * @param {(finding: object) => Promise<Array<{ number: number, state: string, title?: string, body?: string }>>} [ports.searchCandidates]
260
260
  * Optional semantic candidate search, forwarded to `routeFinding`.
261
261
  * @param {(cluster: object) => Promise<{ number: number, url?: string }>} ports.createStory
262
- * Opens a single Story (`/plan`) for a tight cluster.
262
+ * Opens a single Story (`/mandrel-plan`) for a tight cluster.
263
263
  * @param {(cluster: object) => Promise<{ number: number, url?: string }>} ports.createPlanSeed
264
- * Opens a plan-seed (`/plan --seed`) run for a broad cluster.
264
+ * Opens a plan-seed (`/mandrel-plan --seed`) run for a broad cluster.
265
265
  * @returns {Promise<{
266
266
  * promotions: Array<{
267
267
  * clusterKey: string,
@@ -249,9 +249,9 @@ function parseAllFooterValues(text, pattern, isValid) {
249
249
  * Carry audit dedup provenance from a source document into a target body
250
250
  * (Story #4877).
251
251
  *
252
- * The audit sweep's Single-plan path emits a `/plan` seed whose MVP Scope
252
+ * The audit sweep's Single-plan path emits a `/mandrel-plan` seed whose MVP Scope
253
253
  * bullets already carry the `audit-fingerprints` / `audit-semantic-keys`
254
- * footers (Story #4626). Nothing then copied them into the Story `/plan`
254
+ * footers (Story #4626). Nothing then copied them into the Story `/mandrel-plan`
255
255
  * actually persisted, so the recommended path filed Stories that the next
256
256
  * sweep could not recognise and re-filed as new. It was left to the authoring
257
257
  * agent to notice HTML comments in a one-pager and hand-carry them — a