mandrel 2.59.0 → 2.61.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 (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. 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
- Ceremony depth is selected by `delivery.routing.ceremonyProfile`
268
- (`minimal` | `standard` | `strict`, default `standard`) and the Story's
269
- own planning risk. Hard gates (lint / test / format / coverage / CRAP /
270
- maintainability) always run at close — risk never disables them; it only
271
- tunes acceptance-critic mode, review depth, and audit-lens selection. The
272
- 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). |