mandrel 2.60.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 (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. 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). |