mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,590 +0,0 @@
1
- # Software Development Life Cycle (SDLC) Workflow
2
-
3
- Mandrel uses **Story-centric GitHub orchestration** — GitHub Issues,
4
- Labels, and Projects V2 are the Single Source of Truth. Plans persist as
5
- `type::story` tickets ordered by `depends_on` edges;
6
- each Story is delivered on its own `story-<id>` branch and reaches `main`
7
- through its own PR.
8
-
9
- An Epic may still exist as an **optional untyped human umbrella issue**
10
- (the only shipped issue form is `.github/ISSUE_TEMPLATE/story.yml`), and
11
- **delivery and planning orchestration are Story-only**: there is no Epic
12
- wave loop, no `epic/<id>` integration branch, no `epic.yaml` reconciler,
13
- and any ticket that still carries an `Epic: #N` footer is **refused** by
14
- `/mandrel-deliver` (close it or re-plan it as a v2 Story). `type::epic`
15
- exists as a **container only** — a grouping ticket with no execution
16
- payload, expanded to its children at delivery (ADR `20260905-5139`).
17
-
18
- The framework is **Claude Code-first**: `.claude/`, hooks, skills, and
19
- the slash-command surface lean in on Claude Code as the reference
20
- runtime, and the dispatcher (`.agents/scripts/`) treats the dispatch
21
- manifest (md + structured comment) as the cross-runtime contract. See
22
- ADR 20260512-coupling-stance in [`../docs/decisions.md`](../../docs/decisions.md).
23
-
24
- ---
25
-
26
- ## The simple flow
27
-
28
- From zero to shipped:
29
-
30
- 1. **Plan the work.** Run [`/mandrel-plan`](../workflows/mandrel-plan.md) in your agentic IDE.
31
- The framework authors **one Story by default** (folded Tech Spec in
32
- `## Spec`), splitting into N>1 only under the default-single split policy.
33
- Three operator modes are the **only** accepted entries — `/mandrel-plan --seed
34
- "<text>"` (ideate from chat text), `/mandrel-plan --seed-file <path>` (author from
35
- on-disk notes / a plan seed — the [`/audit-to-stories`](../workflows/audit-to-stories.md)
36
- handoff via `--emit-plan-seed`), and `/mandrel-plan --tickets 123[,456…]` (analyze
37
- existing issue(s), preferring an N=1 rewrite). `/mandrel-plan` is a **single path**
38
- — interrogate → author → persist, bracketed by two HITL gates and a single
39
- critic gate — with no Epic/Story router, split-routing verdict, or
40
- `deliveryShape`. Duplicate search targets open **Stories**, never Epics. The
41
- step-by-step lives in [`mandrel-plan.md`](../workflows/mandrel-plan.md).
42
-
43
- 2. **Deliver the Story.** Run [`/mandrel-deliver <storyId>`](../workflows/mandrel-deliver.md)
44
- (or `/mandrel-deliver <a> <b> …` for several). `/mandrel-deliver` takes only Story ids and
45
- resolves their dependency graph from live state — body edges union native
46
- GitHub `blocked_by` edges, every blocker checked against its real issue
47
- state, so a Story whose blocker landed in an earlier plan run is simply
48
- ready. `/mandrel-deliver` owns input resolution and dispatch order — the declared
49
- `depends_on` edges plus a delivery-time file-overlap guard that withholds
50
- two Stories whose footprints would race the same path (see
51
- [`architecture.md` § Scheduler safety mechanics](../../docs/architecture.md));
52
- every Story runs through the single v2 delivery engine
53
- [`helpers/deliver-story`](../workflows/helpers/deliver-story.md) —
54
- init → implement → acceptance self-eval → ceremony → close → CI watch →
55
- confirm-merge — which owns its own per-step detail. For a multi-Story run,
56
- `/mandrel-deliver` sequences ready Stories by `depends_on` — plus that footprint
57
- guard — and runs the per-run epilogue (audit roster · follow-up roll-up ·
58
- sibling coherence) once after the last Story lands.
59
-
60
- That is the whole happy path. Everything below is **detail** — branching
61
- conventions, HITL escalation, audit lenses — that you only need when the
62
- default flow requires adjustment. It intentionally **links** to
63
- [`mandrel-plan.md`](../workflows/mandrel-plan.md) and [`mandrel-deliver.md`](../workflows/mandrel-deliver.md)
64
- rather than re-documenting the ceremony they own.
65
-
66
- ## Core Principles
67
-
68
- - **Layered state stores with explicit precedence.** Ticket status lives
69
- in GitHub Issues and Labels; the lifecycle ledger
70
- (`lifecycle.ndjson`) records merge-terminal outcomes for post-hoc
71
- attribution; structured comments (`verification-results`, retro) are
72
- the operator-visible rollup. The
73
- stores, their owners, and their conflict-resolution rules are listed in
74
- [§ State stores](#state-stores) — that matrix is the single source of
75
- truth for "who owns which write."
76
- - **Provider Abstraction.** Orchestration flows through
77
- `ITicketingProvider`, an abstract interface with a shipped GitHub
78
- implementation.
79
- - **Story-level branching.** All work for a Story lands on the shared
80
- `story-<id>` branch. Each Story reaches `main` through its own PR
81
- (squash + required checks); there is **no** `epic/<id>` integration
82
- branch and **no** `--no-ff` wave merge.
83
- - **One delivery engine.** `/mandrel-deliver` resolves and sequences a Story set;
84
- `helpers/deliver-story` executes each Story identically (trivial or
85
- large). Story sub-agents run inside the operator's Claude session via
86
- the Agent tool — worktree filesystem isolation is preserved; only the
87
- subprocess boundary is gone.
88
- - **PR is the sole promotion gate.** Delivery ends with a PR open against
89
- `main` and (by default) GitHub native auto-merge armed; the workflow
90
- itself never executes `git merge` against `main`. Branch protection on
91
- `main` enforces required checks before the merge button (auto or
92
- manual) fires.
93
- - **HITL-minimal by default.** Exactly one mandatory operator touchpoint
94
- on the happy path — blocker resolution mid-run. PR merge is autonomous
95
- via the armed auto-merge; the operator becomes a second touchpoint only
96
- when they disarm auto-merge (`--no-auto-merge` / `delivery.ci.autoMerge:
97
- "strict"`) or when required checks fail and need remediation.
98
-
99
- ---
100
-
101
- ## State stores
102
-
103
- Mandrel writes orchestration state across several distinct stores. Each
104
- store has one canonical writer and one well-defined idempotency key;
105
- conflicts are resolved in the **Conflict resolution** column. Run-scoped
106
- artifacts live under `temp/run-<id>/` (standalone Stories under
107
- `temp/standalone/stories/story-<id>/`); the `run-<id>` directory naming is
108
- historical (it predates the Story-centric cutover) but remains the live
109
- on-disk layout resolved by
110
- [`lib/config/temp-paths.js`](../scripts/lib/config/temp-paths.js).
111
-
112
- | State Store | Owner (canonical writer) | Mutation API | Idempotency key | Conflict resolution |
113
- | --- | --- | --- | --- | --- |
114
- | GitHub labels | `transitionTicketState` via `ticketing.js` | `gh issue edit --add-label / --remove-label`, wrapped in `update-ticket-state.js` | `(ticketId, label-set)` — set-equality before write | Authoritative for current ticket lifecycle state; if a label disagrees with the lifecycle ledger, the **ledger wins on resume** and the label is re-derived. |
115
- | `verification-results` comment | `lib/orchestration/code-review.js` | `post-structured-comment.js` (upsert by `kind`) | `(storyId, kind='verification-results')` | Authoritative for the Story-scope review + lens findings; critical findings block close. |
116
- | Lifecycle ledger NDJSON | `appendLedgerEvent` (`lib/orchestration/lifecycle/emit-ledger-event.js`) — a bare `appendFileSync` from the close path; Story #5024 retired the `LedgerWriter` listener that preceded it | Append-only line write to the scope-resolved `lifecycle.ndjson` | `(storyId, event)` — one record per merge-terminal outcome | Records the two merge-terminal outcomes (`merge.unlanded`, `merge.flip-failed`) for post-hoc attribution. Labels remain authoritative for current ticket state. |
117
- | Validation evidence cache | `evidence-gate.js` | JSON cache file under the run temp tree, keyed by HEAD SHA | `(gate, git rev-parse HEAD)` | Pure cache: a missing entry triggers a re-run; presence is a fast-path skip. Cache eviction is safe. |
118
- | PR / auto-merge state | `single-story-close.js` (sole authorized caller of `gh pr merge`) | `gh pr merge --auto --squash --delete-branch`; PR open via the close pipeline's `gh pr create` | `(prNumber, head-branch SHA)` — `gh pr list --head` probes before create | GitHub is authoritative for PR + auto-merge arming state; the ledger records the *intent* to arm, GitHub records the outcome. |
119
- | Worktree cleanup state | `WorktreeManager.reap` (via `single-story-close.js` / `git-cleanup.js`) | `git worktree remove` + on-disk pending-cleanup JSON under the run temp tree | `(storyId, worktree-path)` | Filesystem is authoritative for "is the worktree gone?"; the pending-cleanup JSON only tracks stale-registry entries needing a follow-up sweep. |
120
-
121
- > The `gh pr merge` merge-lockout lint rule keeps the merge command
122
- > confined to the sanctioned close path; no other production caller may
123
- > shell it.
124
-
125
- ---
126
-
127
- ## End-to-End Process
128
-
129
- ```mermaid
130
- graph LR
131
- classDef manual fill:#f9d0c4,stroke:#333,stroke-width:2px,color:#000;
132
- classDef agentic fill:#c4f9d0,stroke:#333,stroke-width:2px,color:#000;
133
- classDef artifact fill:#ececec,stroke:#333,stroke-width:1px,stroke-dasharray: 5 5,color:#000;
134
-
135
- subgraph Phase0 ["Phase 0: Bootstrap"]
136
- direction TB
137
- Z["👤 npx mandrel init<br/>(install → sync → bootstrap.js → onboarding tail → /mandrel-plan handoff)"]:::manual
138
- end
139
-
140
- subgraph Phase1 ["Phase 1: Plan"]
141
- direction TB
142
- A["👤 /mandrel-plan --seed | --seed-file | --tickets"]:::manual
143
- B["🤖 interrogate → author → persist"]:::agentic
144
- A --> B
145
- B -.-> B_Art["📄 type::story issue(s)<br/>(+ depends_on edges)"]:::artifact
146
- end
147
-
148
- subgraph Phase2 ["Phase 2: Deliver"]
149
- direction TB
150
- E["👤 /mandrel-deliver &lt;storyId&gt; [&lt;storyId&gt;…]"]:::manual
151
- F["🤖 deliver-story: story-&lt;id&gt; from main<br/>implement → self-eval → ceremony → close"]:::agentic
152
- G["🤖 close-validation → code-review → open PR"]:::agentic
153
- E --> F --> G
154
- G -.-> G_Art["📄 PR open against main"]:::artifact
155
- end
156
-
157
- subgraph Phase3 ["Phase 3: PR merge (auto by default)"]
158
- direction TB
159
- H["🤖 Auto-merge armed → PR lands when checks pass<br/>(👤 operator may disarm to merge manually)"]:::agentic
160
- end
161
-
162
- Z --> A
163
- B --> E
164
- G --> H
165
- ```
166
-
167
- ---
168
-
169
- ## Phase 0: Bootstrap (one-time setup)
170
-
171
- Before any workflow, bootstrap your project to seed `.agentrc.json`, wire the
172
- framework system prompt, and create the GitHub labels, Projects V2 fields, and
173
- (when enabled) main-branch protection the orchestration engine depends on. The
174
- canonical cold-start path is a single command:
175
-
176
- ```bash
177
- npx mandrel init
178
- ```
179
-
180
- `mandrel init` installs `mandrel` (when `./.agents/` is absent), materializes
181
- `./.agents/` via `mandrel sync`, then presents a two-option prompt: **configure
182
- now** (runs `node .agents/scripts/bootstrap.js`) or **just the files** (re-run
183
- `mandrel init` later). `--assume-yes` skips the prompt; a non-TTY run without
184
- it defaults to files-only so GitHub provisioning never runs unattended. The
185
- `bootstrap.js` pipeline (cold-start repo/board provisioning, the `.agentrc.json`
186
- seed, the label taxonomy + Projects V2 fields + branch protection) and the
187
- onboarding tail are documented in
188
- [`README.md` § Activation](../README.md#activation). Bootstrap runs once per
189
- repository and is safe to re-run — existing labels, fields, and
190
- branch-protection entries are preserved; missing ones are added.
191
-
192
- ---
193
-
194
- ## Phase 1: Planning
195
-
196
- Planning is owned end-to-end by [`/mandrel-plan`](../workflows/mandrel-plan.md). Rather than
197
- re-document the ceremony here, this section states the contract the rest of
198
- the SDLC depends on:
199
-
200
- - **Entry is text or tickets, never Epic.** The only accepted invocations
201
- are `--seed`, `--seed-file`, and `--tickets`. There is no `--idea`, no
202
- `--one-pager`, no `--from-notes`, and no positional `/mandrel-plan <epicId>`.
203
- - **One Story by default.** `/mandrel-plan` authors a single `type::story` issue
204
- whose body carries a folded `## Spec` (inline only — never spilled to
205
- `docs/`) plus top-level `acceptance[]` / `verify[]`. It splits into N>1
206
- siblings (ordered by `depends_on` edges) **only**
207
- under the default-single split policy: near-zero overlap or a genuine
208
- architectural seam. Coupled work stays one Story and is decomposed inside
209
- `## Slicing` as intra-session checkpoints, not sibling tickets.
210
- - **No Epic-scale ceremony on the default path.** N=1 skips the
211
- Epic-era Tech Spec / Acceptance Table / clarity-gate / decompose /
212
- reconciler machinery. `plan-persist.js` runs the deterministic gates
213
- (ticket validator, split policy, reachability, budget) and — for N>1 —
214
- the same-wave collision refusal, so a split whose siblings the dispatcher
215
- would serialize anyway is rejected before the first `createIssue`.
216
- - **Handoff.** Persist creates the Story issue(s) at `agent::ready` and
217
- names the delivery command: `/mandrel-deliver <storyId> [<storyId> ...]`.
218
-
219
- There is no `epic|story` routing verdict, scorer, schema field, or label
220
- transition anywhere on the path: sizing is the authoring model's cohesion
221
- judgment, and the one deterministic split gate is the collision refusal.
222
-
223
- Audit findings enter planning through
224
- [`/audit-to-stories`](../workflows/audit-to-stories.md), which groups and
225
- deduplicates findings and hands off via `--emit-plan-seed` →
226
- `/mandrel-plan --seed-file <path>`.
227
-
228
- ---
229
-
230
- ## Phase 2: Delivery
231
-
232
- Delivery is owned end-to-end by [`/mandrel-deliver`](../workflows/mandrel-deliver.md), which
233
- delegates every Story to
234
- [`helpers/deliver-story`](../workflows/helpers/deliver-story.md). This
235
- section states the contract; the per-Story step detail (init, implement,
236
- self-eval, ceremony, close, CI watch, confirm-merge, cleanup) lives in the
237
- `deliver-story` workflow and its
238
- [reference](../workflows/helpers/deliver-story-reference.md).
239
-
240
- ### Invocation modes
241
-
242
- | Mode | Entry point | When to use |
243
- | --- | --- | --- |
244
- | **Single Story** | `/mandrel-deliver <storyId>` | Deliver one Story end-to-end; ends with a PR open to `main`. |
245
- | **Story set** | `/mandrel-deliver <storyId> [<storyId>…]` | Deliver multiple Stories in `depends_on` order (default concurrency **3**), resolved from live state so edges may point at Stories from earlier plan runs; a delivery-time file-overlap guard additionally withholds two Stories whose footprints would race the same path (`delivery.deliverRunner.footprintGuard`). Each lands through its own PR, and the per-run epilogue runs after the set lands. |
246
- | **Story worker (internal)** | *helper* `helpers/deliver-story <storyId>` | Per-Story engine invoked internally by `/mandrel-deliver`; not an operator slash command. |
247
-
248
- The single operator-facing entry point is `/mandrel-deliver`. It performs no
249
- git/label mutations itself — `deliver-story` owns every script invocation
250
- per Story. A `type::epic` id expands to its open child Stories before
251
- resolution. Any ticket that is neither of those two types, or that still
252
- carries an `Epic: #N` reference, is a hard error naming the ID and the fix
253
- (close or re-plan as a v2 Story).
254
-
255
- ### Branch model (authoritative)
256
-
257
- ```text
258
- story-<id> → PR → main (squash + required checks)
259
- ```
260
-
261
- There is no `epic/<id>` integration branch and no `--no-ff` wave merge.
262
- Dependent Stories land sequentially so each builds on the previous merge to
263
- `main`.
264
-
265
- ### Ceremony
266
-
267
- Who authors a Story's acceptance verdict is selected by
268
- `delivery.routing.ceremonyProfile` (`minimal` | `standard` | `strict`, default
269
- `standard`) and by nothing else. The **derived change level** is a separate
270
- decision and tunes review depth and audit-lens selection. Hard gates (lint /
271
- test / format / coverage / CRAP / maintainability) always run at close —
272
- neither decision disables them. The full profile × scope matrix lives in
273
- [`mandrel-deliver.md` § Ceremony](../workflows/mandrel-deliver.md).
274
-
275
- ### State sync
276
-
277
- Agents update their state in real time on GitHub, always through
278
- `update-ticket-state.js`:
279
-
280
- - **Labels**: `agent::ready` → `agent::executing` → `agent::closing` →
281
- `agent::done`. The `agent::done` flip happens only after
282
- `single-story-confirm-merge.js` confirms the PR merged. When a
283
- `projectNumber` is configured, the Projects v2 Status column is synced on
284
- each transition (and re-asserted after merge to beat the board's late
285
- built-in write).
286
- - **Acceptance/verify**: the agent works the Story's inline `acceptance[]`
287
- / `verify[]` arrays; `verify[]` commands are consumed as required
288
- evidence by the acceptance self-eval loop.
289
- - **Friction**: friction is posted as a structured comment on the **Story**
290
- (`diagnose-friction.js`), and rolls up into the retro and, for N>1, the
291
- per-run follow-up roll-up.
292
-
293
- ### Cross-clone coordination
294
-
295
- Concurrent runs are serialised by **two distinct layers**:
296
-
297
- - **Filesystem locks are same-machine-only.** The single-story sweep lock
298
- (`sweep-lock.js`) is a single-file rendezvous keyed on a local process
299
- PID + mtime TTL. Because a PID is only meaningful on its own machine and
300
- `.git/` is never committed, these locks coordinate only the worktrees and
301
- sessions on **one** clone.
302
- - **The assignee-as-lease is the cross-clone layer.** To stop two clones
303
- from both *starting* the same Story, `deliver-story` takes an exclusive,
304
- time-bounded claim on the ticket via
305
- [`ticket-lease.js`](../scripts/lib/orchestration/ticket-lease.js), riding
306
- the ticket's GitHub `assignees` field so a live foreign claim is visible
307
- to every clone. The standalone lease **fails closed** on a foreign
308
- assignee; `--steal` is the only override. See
309
- [`README.md` § Multi-developer coordination](../README.md#multi-developer-coordination).
310
-
311
- ### Concurrent close
312
-
313
- `single-story-close.js` syncs the Story branch from `origin/main` before
314
- pushing and opening/locating the PR, so concurrent closes serialize through
315
- their own worktrees rather than racing one shared branch. The push does not
316
- retry: a rejected push, or a real content conflict at base-sync, aborts with
317
- a clear error, leaves the tree clean, and exits non-zero for manual
318
- resolution.
319
-
320
- ---
321
-
322
- ## HITL (Human-in-the-Loop) model
323
-
324
- On the happy path there is exactly **one** mandatory operator touchpoint
325
- after `/mandrel-deliver` fires (blocker resolution). PR merge is autonomous via
326
- armed auto-merge; the operator becomes a second touchpoint only by
327
- exception.
328
-
329
- 1. **Blocker resolution (mandatory when triggered).** If a Story hits an
330
- unresolvable condition, it flips to `agent::blocked`, posts a structured
331
- friction comment, and fires the notification webhook (fire-and-forget).
332
- The operator resolves the underlying issue (a hand-fix commit on the
333
- Story branch, or a scope edit on the ticket) and flips the Story back to
334
- `agent::executing` to resume.
335
- 2. **PR merge (autonomous by default; operator-gated by exception).** At
336
- close, `deliver-story` opens a PR to `main` and arms GitHub native
337
- auto-merge. When required checks pass, the PR lands without a second
338
- operator visit and the standard label transition flips the Story to
339
- `agent::done`. The operator becomes a touchpoint only when they (a)
340
- disarm auto-merge (`--no-auto-merge` per run, or
341
- `delivery.ci.autoMerge: "strict"`) to inspect checks / the
342
- `verification-results` comment / the retro before merging by hand, or
343
- (b) checks fail and need remediation.
344
-
345
- ### What triggers `agent::blocked`
346
-
347
- - Unresolvable merge conflict automated strategies cannot reconcile.
348
- - Test failures that persist after automated remediation.
349
- - Ambiguity requiring a product/scope decision the agent cannot make from
350
- ticket context alone.
351
- - A destructive action not pre-authorized by the ticket body.
352
- - External-service failure preventing progress (GitHub API 5xx loop, npm
353
- registry down).
354
- - Acceptance self-eval exhausting its bounded round cap with criteria still
355
- unmet.
356
-
357
- ### What is *not* gated at runtime
358
-
359
- - `risk::high` Stories **run without pause.** The label is planning/audit
360
- metadata and retro telemetry only; the sole runtime pause point is
361
- `agent::blocked`. Branch protection on `main` and blocker escalation are
362
- the runtime defenses for destructive actions.
363
- - Individual Story completion — no per-Story approval prompt beyond the PR
364
- merge gate.
365
-
366
- ---
367
-
368
- ## Testing strategy
369
-
370
- Tests are **pyramid-aware**. Every test written during Story delivery
371
- belongs to exactly one tier — **unit**, **contract**, or **e2e /
372
- acceptance**. The canonical tier definitions, assertion-placement rules,
373
- and coverage thresholds live in
374
- [`rules/testing-standards.md`](../rules/testing-standards.md); Gherkin
375
- authoring for the acceptance tier is governed by
376
- [`rules/gherkin-standards.md`](../rules/gherkin-standards.md).
377
-
378
- Write a Story's acceptance criteria in Gherkin-compatible `Given / When /
379
- Then` form so the acceptance suite can lift them into executable `.feature`
380
- files.
381
-
382
- ### QA workflows: explore, assist, and run-harness
383
-
384
- Three complementary QA workflows sit alongside the automated pyramid, all
385
- reading the consumer's `qa.*` contract through
386
- [`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js) (which
387
- fails loudly when no `qa` block is bound):
388
-
389
- - **[`/qa-explore`](../workflows/qa-explore.md)** — **agent-led** open-ended
390
- Plan → Capture → Triage sweep of a named surface (read-only capture; every
391
- state-changing action lands in Triage after operator confirmation).
392
- - **[`/qa-assist`](../workflows/qa-assist.md)** — the **human-led** sibling: a
393
- single-observation Intake → Enrich → Record loop, same ledger contract.
394
- - **[`/qa-run`](../workflows/qa-run.md)** — the **automated complement**: steps
395
- a *known* set of Gherkin `.feature` scenarios through a real browser into
396
- structured `F#` findings.
397
-
398
- Consumer adoption steps are in
399
- [`README.md` § Adopting the QA harness](../README.md#adopting-the-qa-harness).
400
-
401
- ---
402
-
403
- ## Static analysis & audit orchestration
404
-
405
- Audit lenses are woven into delivery as a **shift-left, three-tier**
406
- verification model in which each lens concern is verified at exactly one
407
- tier, chosen by the lens's `scope` field in `audit-rules.json` (resolved by
408
- `resolveLensTier`). There is **no** separate Epic-lifecycle-gate delivery
409
- pass — the tiers below *are* the audit machinery.
410
-
411
- | Tier | When | What runs | Blocking? |
412
- | --- | --- | --- | --- |
413
- | Tier 1 — write-time | During Story implementation | Footprint-matched **local**-lens authoring checklists threaded into the Story prompt (`checklistPath`) | advisory |
414
- | Tier 2 — Story-scope | `single-story-close.js` (maker-blind subprocess) | Local-tier lens roster over the Story diff (`selectLocalLenses`) + review pillars, posted as `verification-results` | blocking on 🔴 |
415
- | Tier 3 — run closeout | `/mandrel-deliver` per-run epilogue (`plan-run-epilogue.js`, N>1 only) | Cumulative + global lenses (`selectAudits`) over the combined landed tip | blocking |
416
-
417
- - **`local`** lenses (decidable from a single Story's diff) are verified at
418
- Tiers 1–2 and are **not** re-run at run closeout.
419
- - **`cumulative`** lenses (only decidable across a run's combined diff)
420
- and **`global`** lenses (whole-product properties) are verified at Tier 3.
421
-
422
- There is no risk-routed lens tier. Story #4542 deleted the risk→lens router:
423
- it had zero callers while this document claimed it ran inside close. Lens
424
- selection is change-set-matched (`selectAudits` / `selectLocalLenses`); the
425
- `sensitivePaths` classes in `audit-rules.json` route review **depth**, not
426
- lenses.
427
-
428
- The run-closeout roster is deliberately **slim**: it excludes every
429
- local-tier change-set lens so the outermost tier — where a fix is most
430
- expensive — does not re-verify a concern already covered shift-left.
431
-
432
- ### Code review
433
-
434
- The Story-scope code review runs **outside the maker's context**, inside the
435
- `single-story-close.js` close subprocess, over `main...story-<id>`: it walks
436
- the Story diff once (change-set-matched local lenses as review dimensions
437
- alongside the review pillars) and posts the unified `verification-results`
438
- comment, halting on surviving 🔴 Critical findings. The provider chain and
439
- remediation knobs are owned by
440
- [`README.md` § Code review providers](../README.md#code-review-providers-pluggable-chain);
441
- the walk-through is in [`helpers/code-review.md`](../workflows/helpers/code-review.md).
442
-
443
- ### Quality ratchets
444
-
445
- The maintainability and CRAP ratchets — and the other baseline gates — run
446
- through `check-baselines.js` at close-validation, `ci.yml`, and
447
- `.husky/pre-push`; the `baseline-refresh:` commit-trailer convention governs
448
- baseline edits. The runbooks (bootstrap, refresh, floor policy) are owned by
449
- [`quality-gates.md`](quality-gates.md).
450
-
451
- ### Audits → Stories
452
-
453
- The standalone `/audit-<dimension>` workflows write
454
- `audit-<dimension>-results.md` under `temp/audits/`;
455
- [`/audit-to-stories`](../workflows/audit-to-stories.md) groups and deduplicates
456
- those findings and hands off to `/mandrel-plan --seed-file` (or opens standalone
457
- Stories), closing the loop back into planning.
458
-
459
- ---
460
-
461
- ## Notification system
462
-
463
- Two independent notification surfaces, both living in `.agents/` so they
464
- ship to consuming projects.
465
-
466
- ### 1. Unified `notify()` dispatcher
467
-
468
- Every notification — whether a manual orchestration milestone (Story
469
- merged, HITL gate triggered) or an auto-fired ticket-state transition —
470
- routes through [`notify.js`](../scripts/notify.js). Two delivery channels:
471
-
472
- | Channel | What it does |
473
- | --- | --- |
474
- | GitHub comment | Posts to the targeted ticket; @mentions the operator for `medium`/`high`. |
475
- | Webhook | Fire-and-forget POST to the configured URL (Make.com / Slack / Discord). |
476
-
477
- Severity vocabulary (`eventSeverity()` derives it for state transitions):
478
-
479
- | Severity | Used for | Webhook prefix |
480
- | --- | --- | --- |
481
- | `low` | Intermediate transitions, audit reports. | `[low]` |
482
- | `medium` | Operator-visible milestones: Story state transitions, story merged, run complete. | `[medium]` |
483
- | `high` | Operator must act (HITL gates, Story blockers, autonomous-chain failures); body leads with `🚨 Action Required:`. | `[Action Required]` |
484
-
485
- Two independent event-allowlist knobs in `github.notifications` (both
486
- mandatory) filter each channel independently — there is no fallback chain:
487
-
488
- - `commentEvents` — allowlist for GitHub-ticket comment posting. Default:
489
- `["state-transition", "story-merged", "operator-message"]`.
490
- - `webhookEvents` — allowlist for `NOTIFICATION_WEBHOOK_URL` deliveries.
491
-
492
- `transitionTicketState` suppresses the `notify()` dispatch for low-severity
493
- transitions so the comment channel sees only the medium-severity
494
- Story-level events operators expect. To suppress a channel entirely, set
495
- its array to `[]`.
496
-
497
- **Webhook URL resolution.** `NOTIFICATION_WEBHOOK_URL` process env var only
498
- — loaded from `.env` at the project root. It is **not** sourced from
499
- `.agentrc.json` or `.mcp.json`.
500
-
501
- Because `notify()` is called in-band from the orchestration SDK, it
502
- captures state changes from `deliver-story`, the per-Story scripts
503
- (`single-story-init.js`, `single-story-close.js`,
504
- `single-story-confirm-merge.js`), and any script that routes through
505
- `transitionTicketState`. It does **not** capture manual label clicks in the
506
- GitHub UI.
507
-
508
- ### 2. Blocker / HITL notifications
509
-
510
- Fire-and-forget webhooks fire on blocker-escalation events
511
- (`agent::blocked`) and operator-attention events (PR-open hand-off, run
512
- cancellation). Webhook failures never block execution.
513
-
514
- ---
515
-
516
- ## Troubleshooting
517
-
518
- ### Sub-agent CI workflow editing
519
-
520
- Sub-agents operating under the framework's default `GITHUB_TOKEN` **cannot
521
- edit files under `.github/workflows/**`** — the token does not carry the
522
- `workflows` permission scope, so a push touching a workflow file is
523
- rejected with:
524
-
525
- > refusing to allow a GitHub App to create or update workflow
526
- > `.github/workflows/<file>.yml` without `workflows` permission
527
-
528
- This is a hard constraint, not a transient failure. **When a Story plans a
529
- new CI gate**, route the check through a `package.json` script (add it to
530
- `npm run lint` / `npm run docs:check` / `npm test`, or wire a new
531
- `npm run check:<name>` script) so an existing CI job picks it up by
532
- transitivity. **When a workflow file genuinely must change** (a new job, a
533
- trigger change, a runner bump), the edit must be made by an operator with
534
- `Workflows: Read and write` PAT permissions — see
535
- [`docs/release-operations.md` § One-time PAT setup](https://github.com/dsj1984/mandrel/blob/main/docs/release-operations.md#one-time-pat-setup).
536
-
537
- ### Worktree config shadow
538
-
539
- `helpers/deliver-story` runs inside per-Story worktrees under
540
- `.worktrees/story-<id>/`. A worktree checks out the **Story branch's own
541
- copy** of every repo-tracked file — including `.agentrc.json`. **Operator
542
- edits made in the main checkout do NOT propagate to an already-active
543
- worktree.** Symptom: you bump a runtime knob in `<main-repo>/.agentrc.json`,
544
- re-run `single-story-close.js --cwd <worktree>`, and the script still uses
545
- the old value. When tuning knobs mid-Story:
546
-
547
- 1. **Prefer an env-var override** when the knob exposes one (timeouts,
548
- `AGENT_LOG_LEVEL`, concurrency caps) — env vars are read from your shell,
549
- bypassing worktree shadow entirely.
550
- 2. **Edit the file inside the worktree** (`.worktrees/story-<id>/.agentrc.json`)
551
- so the script sees the bump on its next read.
552
- 3. **Use `.agentrc.local.json`** for per-machine tuning you never commit
553
- (see
554
- [`configuration.md`](configuration.md#per-machine-local-overrides)) —
555
- place it inside the worktree, or invoke the script with
556
- `--cwd <main-repo>` so the resolver reads the main checkout's override.
557
-
558
- Editing the main checkout's `.agentrc.json` only affects **the next**
559
- `single-story-init.js` invocation, because new Story branches fork from
560
- `main`'s current tip.
561
-
562
- ### `Epic: #N` refusal
563
-
564
- `/mandrel-deliver` refuses any ticket that still carries an `Epic: #N` footer,
565
- or that is neither `type::story` nor `type::epic`. This is expected — v2 has
566
- no Epic *delivery* path. Close the ticket or re-plan the work as a v2 Story
567
- via `/mandrel-plan --tickets <id>`.
568
-
569
- The container Epic (ADR `20260905-5139`) does **not** soften this. Its linkage
570
- runs parent→child only — the Epic body lists its children, and no Story body
571
- ever gains a footer pointing back — so a ticket carrying `Epic: #N` is still a
572
- v1 ticket and still refused.
573
-
574
- ---
575
-
576
- ## Quick reference
577
-
578
- | Command | Purpose |
579
- | --- | --- |
580
- | `npx mandrel init` | Cold-start — install `mandrel` (if absent), `mandrel sync`, `bootstrap.js` (provisions repo + Projects V2 board, labels, branch protection), then the onboarding tail (stack detection, docs scaffolding, doctor gate, `/mandrel-plan` handoff). |
581
- | `/mandrel-plan --seed "<text>"` | Plan from chat text — interrogate → author **one Story by default** → persist `type::story`. |
582
- | `/mandrel-plan --seed-file <path>` | Plan from on-disk notes / a plan seed (the `/audit-to-stories` handoff). |
583
- | `/mandrel-deliver <epicId>` | Deliver every open Story under a container Epic — the id expands before resolution. |
584
- | `/mandrel-plan --tickets <ids>` | Analyze existing issue(s) into proper Stories (prefer an N=1 rewrite). |
585
- | `/mandrel-deliver <storyId>` | Deliver one Story via `helpers/deliver-story` — `story-<id>` → PR → `main`. |
586
- | `/mandrel-deliver <storyId> [<storyId>…]` | Deliver multiple Stories in `depends_on` order (resolved from live state), then run the per-run epilogue. |
587
- | *helper* `helpers/deliver-story` | Per-Story engine invoked by `/mandrel-deliver`; not an operator slash command. See [`deliver-story.md`](../workflows/helpers/deliver-story.md). |
588
- | `/audit-to-stories` | Convert audit findings into a plan seed / Stories → `/mandrel-plan --seed-file`. |
589
- | `/qa-explore` · `/qa-assist` · `/qa-run` | Agent-led / human-led exploratory QA and the automated Gherkin harness. |
590
- | `/git-deliver` | Ad-hoc delivery of working-tree changes — detects the git setup and escalates to commit, commit + push, or commit + push + PR (auto-merge armed). |