mandrel 1.57.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 (843) hide show
  1. package/.agents/README.md +954 -0
  2. package/.agents/docs/SDLC.md +1420 -0
  3. package/.agents/docs/agentrc-reference.json +278 -0
  4. package/.agents/docs/configuration.md +1040 -0
  5. package/.agents/docs/workflows.md +59 -0
  6. package/.agents/instructions.md +384 -0
  7. package/.agents/personas/architect.md +107 -0
  8. package/.agents/personas/devops-engineer.md +36 -0
  9. package/.agents/personas/engineer-mobile.md +119 -0
  10. package/.agents/personas/engineer-web.md +110 -0
  11. package/.agents/personas/engineer.md +90 -0
  12. package/.agents/personas/product.md +88 -0
  13. package/.agents/personas/project-manager.md +110 -0
  14. package/.agents/personas/qa-engineer.md +91 -0
  15. package/.agents/personas/refactorer.md +110 -0
  16. package/.agents/personas/security-engineer.md +112 -0
  17. package/.agents/personas/sre.md +86 -0
  18. package/.agents/personas/technical-writer.md +100 -0
  19. package/.agents/personas/ux-designer.md +95 -0
  20. package/.agents/rules/api-conventions.md +75 -0
  21. package/.agents/rules/changelog-style.md +238 -0
  22. package/.agents/rules/gherkin-standards.md +146 -0
  23. package/.agents/rules/git-conventions.md +146 -0
  24. package/.agents/rules/orchestration-error-handling.md +35 -0
  25. package/.agents/rules/security-baseline.md +92 -0
  26. package/.agents/rules/shell-conventions.md +70 -0
  27. package/.agents/rules/test-seams.md +59 -0
  28. package/.agents/rules/testing-standards.md +177 -0
  29. package/.agents/runtime-deps.json +18 -0
  30. package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
  31. package/.agents/schemas/agentrc.schema.json +1583 -0
  32. package/.agents/schemas/audit-results.schema.json +69 -0
  33. package/.agents/schemas/audit-rules.json +134 -0
  34. package/.agents/schemas/audit-rules.schema.json +69 -0
  35. package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
  36. package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
  37. package/.agents/schemas/baselines/coverage.schema.json +50 -0
  38. package/.agents/schemas/baselines/crap.schema.json +52 -0
  39. package/.agents/schemas/baselines/duplication.schema.json +62 -0
  40. package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
  41. package/.agents/schemas/baselines/lint.schema.json +47 -0
  42. package/.agents/schemas/baselines/maintainability.schema.json +71 -0
  43. package/.agents/schemas/baselines/mutation.schema.json +52 -0
  44. package/.agents/schemas/crap-baseline.schema.json +57 -0
  45. package/.agents/schemas/crap-report.schema.json +102 -0
  46. package/.agents/schemas/dispatch-manifest.json +232 -0
  47. package/.agents/schemas/epic-perf-report.schema.json +89 -0
  48. package/.agents/schemas/epic-spec.schema.json +183 -0
  49. package/.agents/schemas/friction-event.schema.json +56 -0
  50. package/.agents/schemas/lifecycle/README.md +18 -0
  51. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
  52. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
  53. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
  54. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
  55. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
  56. package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
  57. package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
  58. package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
  59. package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
  60. package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
  61. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
  62. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
  63. package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
  64. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
  65. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
  66. package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
  67. package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
  68. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
  69. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
  70. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
  71. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
  72. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
  73. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
  74. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
  75. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
  76. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
  77. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
  78. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
  79. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
  80. package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
  81. package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
  82. package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
  83. package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
  84. package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
  85. package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
  86. package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
  87. package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
  88. package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
  89. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
  90. package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
  91. package/.agents/schemas/mi-report.schema.json +58 -0
  92. package/.agents/schemas/model-attribution.schema.json +49 -0
  93. package/.agents/schemas/qa-finding.schema.json +133 -0
  94. package/.agents/schemas/qa-ledger.schema.json +89 -0
  95. package/.agents/schemas/risk-verdict.schema.json +53 -0
  96. package/.agents/schemas/signal-event.schema.json +58 -0
  97. package/.agents/schemas/skill.schema.json +31 -0
  98. package/.agents/schemas/skills-index.schema.json +81 -0
  99. package/.agents/schemas/story-perf-summary.schema.json +73 -0
  100. package/.agents/schemas/validation-evidence.schema.json +78 -0
  101. package/.agents/scripts/README.md +93 -0
  102. package/.agents/scripts/acceptance-eval.js +284 -0
  103. package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
  104. package/.agents/scripts/agents-bootstrap-github.js +634 -0
  105. package/.agents/scripts/analyze-execution.js +369 -0
  106. package/.agents/scripts/assert-branch.js +83 -0
  107. package/.agents/scripts/audit-labels-bootstrap.js +253 -0
  108. package/.agents/scripts/audit-to-stories.js +257 -0
  109. package/.agents/scripts/bootstrap.js +1378 -0
  110. package/.agents/scripts/check-baselines.js +81 -0
  111. package/.agents/scripts/check-dead-exports.js +311 -0
  112. package/.agents/scripts/check-doc-links.js +401 -0
  113. package/.agents/scripts/check-gherkin-placeholders.js +663 -0
  114. package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
  115. package/.agents/scripts/check-lifecycle-lint.js +379 -0
  116. package/.agents/scripts/check-prepush-recovery.js +90 -0
  117. package/.agents/scripts/check-windows-git-perf.js +138 -0
  118. package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
  119. package/.agents/scripts/coverage-capture.js +112 -0
  120. package/.agents/scripts/detect-merges.js +111 -0
  121. package/.agents/scripts/diagnose-friction.js +257 -0
  122. package/.agents/scripts/diagnose.js +240 -0
  123. package/.agents/scripts/dispatcher.js +295 -0
  124. package/.agents/scripts/drain-pending-cleanup.js +147 -0
  125. package/.agents/scripts/epic-audit-prepare.js +419 -0
  126. package/.agents/scripts/epic-audit-recheck.js +241 -0
  127. package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
  128. package/.agents/scripts/epic-deliver-preflight.js +407 -0
  129. package/.agents/scripts/epic-deliver-prepare.js +383 -0
  130. package/.agents/scripts/epic-execute-record-wave.js +463 -0
  131. package/.agents/scripts/epic-plan-clarity.js +201 -0
  132. package/.agents/scripts/epic-plan-decompose.js +79 -0
  133. package/.agents/scripts/epic-plan-healthcheck.js +363 -0
  134. package/.agents/scripts/epic-plan-spec-validate.js +111 -0
  135. package/.agents/scripts/epic-plan-spec.js +198 -0
  136. package/.agents/scripts/epic-reconcile.js +637 -0
  137. package/.agents/scripts/evidence-gate.js +235 -0
  138. package/.agents/scripts/generate-config-docs.js +516 -0
  139. package/.agents/scripts/generate-lifecycle-docs.js +224 -0
  140. package/.agents/scripts/generate-skills-index.js +252 -0
  141. package/.agents/scripts/generate-workflows-doc.js +168 -0
  142. package/.agents/scripts/git-cleanup.js +124 -0
  143. package/.agents/scripts/git-pr-quality-gate.js +203 -0
  144. package/.agents/scripts/git-rebase-and-resolve.js +234 -0
  145. package/.agents/scripts/hierarchy-gate.js +176 -0
  146. package/.agents/scripts/hydrate-context.js +179 -0
  147. package/.agents/scripts/install-matrix-assert.js +282 -0
  148. package/.agents/scripts/lib/Graph.js +326 -0
  149. package/.agents/scripts/lib/ITicketingProvider.js +349 -0
  150. package/.agents/scripts/lib/Logger.js +194 -0
  151. package/.agents/scripts/lib/audit-suite/cli.js +64 -0
  152. package/.agents/scripts/lib/audit-suite/findings.js +164 -0
  153. package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
  154. package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
  155. package/.agents/scripts/lib/audit-suite/index.js +22 -0
  156. package/.agents/scripts/lib/audit-suite/runner.js +233 -0
  157. package/.agents/scripts/lib/audit-suite/selector.js +235 -0
  158. package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
  159. package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
  160. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
  161. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
  162. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
  163. package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
  164. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
  165. package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
  166. package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
  167. package/.agents/scripts/lib/baseline-loader.js +0 -0
  168. package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
  169. package/.agents/scripts/lib/baseline-snapshot.js +716 -0
  170. package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
  171. package/.agents/scripts/lib/baselines/components.js +126 -0
  172. package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
  173. package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
  174. package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
  175. package/.agents/scripts/lib/baselines/envelope.js +368 -0
  176. package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
  177. package/.agents/scripts/lib/baselines/git-base.js +0 -0
  178. package/.agents/scripts/lib/baselines/kernel.js +111 -0
  179. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
  180. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
  181. package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
  182. package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
  183. package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
  184. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
  185. package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
  186. package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
  187. package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
  188. package/.agents/scripts/lib/baselines/path-canon.js +279 -0
  189. package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
  190. package/.agents/scripts/lib/baselines/reader.js +321 -0
  191. package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
  192. package/.agents/scripts/lib/baselines/scope.js +291 -0
  193. package/.agents/scripts/lib/baselines/writer.js +312 -0
  194. package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
  195. package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
  196. package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
  197. package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
  198. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
  199. package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
  200. package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
  201. package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
  202. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
  203. package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
  204. package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
  205. package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
  206. package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
  207. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
  208. package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
  209. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
  210. package/.agents/scripts/lib/bootstrap/summary.js +75 -0
  211. package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
  212. package/.agents/scripts/lib/branch-name-guard.js +98 -0
  213. package/.agents/scripts/lib/c8-cli-path.js +21 -0
  214. package/.agents/scripts/lib/changed-files.js +184 -0
  215. package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
  216. package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
  217. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
  218. package/.agents/scripts/lib/checks/index.js +288 -0
  219. package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
  220. package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
  221. package/.agents/scripts/lib/checks/state.js +558 -0
  222. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
  223. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
  224. package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
  225. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
  226. package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
  227. package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
  228. package/.agents/scripts/lib/cli/standard-args.js +351 -0
  229. package/.agents/scripts/lib/cli-args.js +286 -0
  230. package/.agents/scripts/lib/cli-utils.js +69 -0
  231. package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
  232. package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
  233. package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
  234. package/.agents/scripts/lib/close-validation.js +897 -0
  235. package/.agents/scripts/lib/codebase-snapshot.js +513 -0
  236. package/.agents/scripts/lib/command-header.js +33 -0
  237. package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
  238. package/.agents/scripts/lib/config/baselines.js +60 -0
  239. package/.agents/scripts/lib/config/ci.js +30 -0
  240. package/.agents/scripts/lib/config/commands.js +36 -0
  241. package/.agents/scripts/lib/config/defaults.js +119 -0
  242. package/.agents/scripts/lib/config/explain.js +348 -0
  243. package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
  244. package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
  245. package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
  246. package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
  247. package/.agents/scripts/lib/config/gates/index.js +36 -0
  248. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
  249. package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
  250. package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
  251. package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
  252. package/.agents/scripts/lib/config/gates/shared.js +117 -0
  253. package/.agents/scripts/lib/config/github.js +122 -0
  254. package/.agents/scripts/lib/config/lifecycle.js +40 -0
  255. package/.agents/scripts/lib/config/limits.js +211 -0
  256. package/.agents/scripts/lib/config/paths.js +73 -0
  257. package/.agents/scripts/lib/config/preflight.js +58 -0
  258. package/.agents/scripts/lib/config/quality.js +665 -0
  259. package/.agents/scripts/lib/config/retro.js +77 -0
  260. package/.agents/scripts/lib/config/runners.js +105 -0
  261. package/.agents/scripts/lib/config/runtime.js +167 -0
  262. package/.agents/scripts/lib/config/shared.js +46 -0
  263. package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
  264. package/.agents/scripts/lib/config/temp-paths.js +373 -0
  265. package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
  266. package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
  267. package/.agents/scripts/lib/config-resolver.js +298 -0
  268. package/.agents/scripts/lib/config-schema-shared.js +32 -0
  269. package/.agents/scripts/lib/config-schema.js +20 -0
  270. package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
  271. package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
  272. package/.agents/scripts/lib/config-settings-schema.js +420 -0
  273. package/.agents/scripts/lib/coverage-baseline.js +352 -0
  274. package/.agents/scripts/lib/coverage-capture.js +195 -0
  275. package/.agents/scripts/lib/coverage-utils.js +239 -0
  276. package/.agents/scripts/lib/cpu-pool.js +223 -0
  277. package/.agents/scripts/lib/crap-engine.js +119 -0
  278. package/.agents/scripts/lib/crap-utils.js +479 -0
  279. package/.agents/scripts/lib/degraded-mode.js +69 -0
  280. package/.agents/scripts/lib/dependency-parser.js +129 -0
  281. package/.agents/scripts/lib/duplicate-search.js +189 -0
  282. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
  283. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
  284. package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
  285. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
  286. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
  287. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
  288. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
  289. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
  290. package/.agents/scripts/lib/env-loader.js +52 -0
  291. package/.agents/scripts/lib/epic-merge-lock.js +239 -0
  292. package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
  293. package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
  294. package/.agents/scripts/lib/error-redactor.js +125 -0
  295. package/.agents/scripts/lib/errors/index.js +67 -0
  296. package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
  297. package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
  298. package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
  299. package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
  300. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
  301. package/.agents/scripts/lib/findings/classify-finding.js +195 -0
  302. package/.agents/scripts/lib/findings/promote-finding.js +353 -0
  303. package/.agents/scripts/lib/findings/route-finding.js +283 -0
  304. package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
  305. package/.agents/scripts/lib/findings/severity.js +102 -0
  306. package/.agents/scripts/lib/gates/baseline-store.js +106 -0
  307. package/.agents/scripts/lib/gates/friction.js +43 -0
  308. package/.agents/scripts/lib/gh-exec.js +553 -0
  309. package/.agents/scripts/lib/git/cached-fetch.js +0 -0
  310. package/.agents/scripts/lib/git/sync-from-base.js +162 -0
  311. package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
  312. package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
  313. package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
  314. package/.agents/scripts/lib/git-utils.js +363 -0
  315. package/.agents/scripts/lib/github-url.js +29 -0
  316. package/.agents/scripts/lib/install-cmd-parser.js +51 -0
  317. package/.agents/scripts/lib/issue-link-parser.js +74 -0
  318. package/.agents/scripts/lib/json-utils.js +60 -0
  319. package/.agents/scripts/lib/label-constants.js +169 -0
  320. package/.agents/scripts/lib/label-taxonomy.js +200 -0
  321. package/.agents/scripts/lib/maintainability-engine.js +164 -0
  322. package/.agents/scripts/lib/maintainability-utils.js +343 -0
  323. package/.agents/scripts/lib/mandrel-catalog.js +170 -0
  324. package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
  325. package/.agents/scripts/lib/mutation/config-detector.js +119 -0
  326. package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
  327. package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
  328. package/.agents/scripts/lib/notifications/notifier.js +75 -0
  329. package/.agents/scripts/lib/observability/active-story-env.js +182 -0
  330. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
  331. package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
  332. package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
  333. package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
  334. package/.agents/scripts/lib/observability/signals-writer.js +296 -0
  335. package/.agents/scripts/lib/observability/source-classifier.js +103 -0
  336. package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
  337. package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
  338. package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
  339. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
  340. package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
  341. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
  342. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
  343. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
  344. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
  345. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
  346. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
  347. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
  348. package/.agents/scripts/lib/orchestration/code-review.js +652 -0
  349. package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
  350. package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
  351. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
  352. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
  353. package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
  354. package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
  355. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
  356. package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
  357. package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
  358. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
  359. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
  360. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
  361. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
  362. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
  363. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
  364. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
  365. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
  366. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
  367. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
  368. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
  369. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
  370. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
  371. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
  372. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
  373. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
  374. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
  375. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
  376. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
  377. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
  378. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
  379. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
  380. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
  381. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
  382. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
  383. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
  384. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
  385. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
  386. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
  387. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
  388. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
  389. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
  390. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
  391. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
  392. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
  393. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
  394. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
  395. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
  396. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
  397. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
  398. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
  399. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
  400. package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
  401. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
  402. package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
  403. package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
  404. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
  405. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
  406. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
  407. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
  408. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
  409. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
  410. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
  411. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
  412. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
  413. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
  414. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
  415. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
  416. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
  417. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
  418. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
  419. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
  420. package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
  421. package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
  422. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
  423. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
  424. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
  425. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
  426. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
  427. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
  428. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
  429. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
  430. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
  431. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
  432. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
  433. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
  434. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
  435. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
  436. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
  437. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
  438. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
  439. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
  440. package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
  441. package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
  442. package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
  443. package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
  444. package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
  445. package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
  446. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
  447. package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
  448. package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
  449. package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
  450. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
  451. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
  452. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
  453. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
  454. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
  455. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
  456. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
  457. package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
  458. package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
  459. package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
  460. package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
  461. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
  462. package/.agents/scripts/lib/orchestration/recut.js +56 -0
  463. package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
  464. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
  465. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
  466. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
  467. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
  468. package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
  469. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
  470. package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
  471. package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
  472. package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
  473. package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
  474. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
  475. package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
  476. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
  477. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
  478. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
  479. package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
  480. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
  481. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
  482. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
  483. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
  484. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
  485. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
  486. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
  487. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
  488. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
  489. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
  490. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
  491. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
  492. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
  493. package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
  494. package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
  495. package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
  496. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
  497. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
  498. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
  499. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
  500. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
  501. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
  502. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
  503. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
  504. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
  505. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
  506. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
  507. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
  508. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
  509. package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
  510. package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
  511. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
  512. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
  513. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
  514. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
  515. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
  516. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
  517. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
  518. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
  519. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
  520. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
  521. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
  522. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
  523. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
  524. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
  525. package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
  526. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
  527. package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
  528. package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
  529. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
  530. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
  531. package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
  532. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
  533. package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
  534. package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
  535. package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
  536. package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
  537. package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
  538. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
  539. package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
  540. package/.agents/scripts/lib/path-security.js +25 -0
  541. package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
  542. package/.agents/scripts/lib/preflight-runner.js +196 -0
  543. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
  544. package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
  545. package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
  546. package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
  547. package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
  548. package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
  549. package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
  550. package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
  551. package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
  552. package/.agents/scripts/lib/provider-factory.js +80 -0
  553. package/.agents/scripts/lib/push-epic-retry.js +209 -0
  554. package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
  555. package/.agents/scripts/lib/qa/coverage-report.js +181 -0
  556. package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
  557. package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
  558. package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
  559. package/.agents/scripts/lib/qa/qa-session.js +197 -0
  560. package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
  561. package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
  562. package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
  563. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
  564. package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
  565. package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
  566. package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
  567. package/.agents/scripts/lib/signals/detectors/common.js +36 -0
  568. package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
  569. package/.agents/scripts/lib/signals/detectors/index.js +14 -0
  570. package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
  571. package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
  572. package/.agents/scripts/lib/signals/index.js +39 -0
  573. package/.agents/scripts/lib/signals/read.js +268 -0
  574. package/.agents/scripts/lib/signals/schema.js +225 -0
  575. package/.agents/scripts/lib/signals/span-tree.js +290 -0
  576. package/.agents/scripts/lib/signals/write.js +19 -0
  577. package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
  578. package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
  579. package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
  580. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
  581. package/.agents/scripts/lib/single-story-sweep.js +329 -0
  582. package/.agents/scripts/lib/skills/parse-skill.js +202 -0
  583. package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
  584. package/.agents/scripts/lib/spec/index.js +36 -0
  585. package/.agents/scripts/lib/spec/loader.js +425 -0
  586. package/.agents/scripts/lib/spec/state.js +217 -0
  587. package/.agents/scripts/lib/story-body/story-body.js +743 -0
  588. package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
  589. package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
  590. package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
  591. package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
  592. package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
  593. package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
  594. package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
  595. package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
  596. package/.agents/scripts/lib/story-lifecycle.js +186 -0
  597. package/.agents/scripts/lib/story-plan.js +246 -0
  598. package/.agents/scripts/lib/task-utils.js +26 -0
  599. package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
  600. package/.agents/scripts/lib/test-env.js +30 -0
  601. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
  602. package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
  603. package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
  604. package/.agents/scripts/lib/test-isolate/runner.js +483 -0
  605. package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
  606. package/.agents/scripts/lib/test-profile/render-report.js +45 -0
  607. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
  608. package/.agents/scripts/lib/test-tiers.js +94 -0
  609. package/.agents/scripts/lib/util/concurrent-map.js +59 -0
  610. package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
  611. package/.agents/scripts/lib/util/phase-timer.js +163 -0
  612. package/.agents/scripts/lib/util/poll-loop.js +86 -0
  613. package/.agents/scripts/lib/util/with-timeout.js +32 -0
  614. package/.agents/scripts/lib/validation-evidence.js +323 -0
  615. package/.agents/scripts/lib/wave-runner/tick.js +665 -0
  616. package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
  617. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
  618. package/.agents/scripts/lib/workers/crap-worker.js +197 -0
  619. package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
  620. package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
  621. package/.agents/scripts/lib/workspace-provisioner.js +189 -0
  622. package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
  623. package/.agents/scripts/lib/worktree/inspector.js +140 -0
  624. package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
  625. package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
  626. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
  627. package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
  628. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
  629. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
  630. package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
  631. package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
  632. package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
  633. package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
  634. package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
  635. package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
  636. package/.agents/scripts/lib/worktree-manager.js +243 -0
  637. package/.agents/scripts/lifecycle-diff.js +206 -0
  638. package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
  639. package/.agents/scripts/lifecycle-emit.js +479 -0
  640. package/.agents/scripts/lint-baseline.js +507 -0
  641. package/.agents/scripts/lint-label-vocabulary.js +237 -0
  642. package/.agents/scripts/loc-delta.js +205 -0
  643. package/.agents/scripts/notify.js +307 -0
  644. package/.agents/scripts/package.json +3 -0
  645. package/.agents/scripts/post-structured-comment.js +127 -0
  646. package/.agents/scripts/pr-watch-with-update.js +152 -0
  647. package/.agents/scripts/providers/github/auth.js +65 -0
  648. package/.agents/scripts/providers/github/board-add.js +63 -0
  649. package/.agents/scripts/providers/github/branch-protection.js +186 -0
  650. package/.agents/scripts/providers/github/cache.js +72 -0
  651. package/.agents/scripts/providers/github/comments.js +131 -0
  652. package/.agents/scripts/providers/github/compose.js +111 -0
  653. package/.agents/scripts/providers/github/errors.js +242 -0
  654. package/.agents/scripts/providers/github/issues.js +242 -0
  655. package/.agents/scripts/providers/github/labels.js +179 -0
  656. package/.agents/scripts/providers/github/mappers.js +126 -0
  657. package/.agents/scripts/providers/github/merge-methods.js +82 -0
  658. package/.agents/scripts/providers/github/project-board.js +47 -0
  659. package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
  660. package/.agents/scripts/providers/github/prs.js +103 -0
  661. package/.agents/scripts/providers/github/request-helpers.js +110 -0
  662. package/.agents/scripts/providers/github/sub-issues.js +369 -0
  663. package/.agents/scripts/providers/github/tickets.js +381 -0
  664. package/.agents/scripts/providers/github/transient-retry.js +62 -0
  665. package/.agents/scripts/providers/github.js +157 -0
  666. package/.agents/scripts/quality-preview.js +327 -0
  667. package/.agents/scripts/quality-watch.js +223 -0
  668. package/.agents/scripts/render-manifest.js +143 -0
  669. package/.agents/scripts/resync-status-column.js +176 -0
  670. package/.agents/scripts/retro-run.js +167 -0
  671. package/.agents/scripts/run-audit-suite.js +97 -0
  672. package/.agents/scripts/run-coverage.js +103 -0
  673. package/.agents/scripts/run-lint.js +94 -0
  674. package/.agents/scripts/run-test-profile.js +126 -0
  675. package/.agents/scripts/run-tests.js +185 -0
  676. package/.agents/scripts/run-verify.js +56 -0
  677. package/.agents/scripts/select-audits.js +155 -0
  678. package/.agents/scripts/signals-view.js +294 -0
  679. package/.agents/scripts/single-story-close.js +83 -0
  680. package/.agents/scripts/single-story-confirm-merge.js +183 -0
  681. package/.agents/scripts/single-story-init.js +692 -0
  682. package/.agents/scripts/stories-wave-tick.js +415 -0
  683. package/.agents/scripts/story-close.js +246 -0
  684. package/.agents/scripts/story-deliver-prepare.js +267 -0
  685. package/.agents/scripts/story-init.js +516 -0
  686. package/.agents/scripts/story-phase.js +327 -0
  687. package/.agents/scripts/story-plan.js +284 -0
  688. package/.agents/scripts/sync-agentrc.js +71 -0
  689. package/.agents/scripts/sync-branch-from-base.js +138 -0
  690. package/.agents/scripts/sync-claude-commands.js +151 -0
  691. package/.agents/scripts/test-isolate.js +222 -0
  692. package/.agents/scripts/test-wrapper.js +108 -0
  693. package/.agents/scripts/update-coverage-baseline.js +129 -0
  694. package/.agents/scripts/update-crap-baseline.js +177 -0
  695. package/.agents/scripts/update-duplication-baseline.js +134 -0
  696. package/.agents/scripts/update-maintainability-baseline.js +183 -0
  697. package/.agents/scripts/update-mutation-baseline.js +189 -0
  698. package/.agents/scripts/update-ticket-state.js +107 -0
  699. package/.agents/scripts/validate-docs-freshness.js +259 -0
  700. package/.agents/scripts/validate-skills.js +278 -0
  701. package/.agents/scripts/wave-tick.js +335 -0
  702. package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
  703. package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
  704. package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
  705. package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
  706. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
  707. package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
  708. package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
  709. package/.agents/skills/core/code-simplification/SKILL.md +389 -0
  710. package/.agents/skills/core/context-engineering/SKILL.md +309 -0
  711. package/.agents/skills/core/context-engineering/examples.md +58 -0
  712. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
  713. package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
  714. package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
  715. package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
  716. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
  717. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
  718. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
  719. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
  720. package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
  721. package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
  722. package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
  723. package/.agents/skills/core/idea-refinement/examples.md +437 -0
  724. package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
  725. package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
  726. package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
  727. package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
  728. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
  729. package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
  730. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
  731. package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
  732. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
  733. package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
  734. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
  735. package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
  736. package/.agents/skills/core/scope-triage/SKILL.md +127 -0
  737. package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
  738. package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
  739. package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
  740. package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
  741. package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
  742. package/.agents/skills/skills.index.json +596 -0
  743. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
  744. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
  745. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
  746. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
  747. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
  748. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
  749. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
  750. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
  751. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
  752. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
  753. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
  754. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
  755. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
  756. package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
  757. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
  758. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
  759. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
  760. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
  761. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
  762. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
  763. package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
  764. package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
  765. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
  766. package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
  767. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
  768. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
  769. package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
  770. package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
  771. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
  772. package/.agents/starter-agentrc.json +22 -0
  773. package/.agents/templates/agent-protocol.md +72 -0
  774. package/.agents/templates/docs/architecture.md +30 -0
  775. package/.agents/templates/docs/decisions.md +24 -0
  776. package/.agents/templates/epic-from-idea.md +21 -0
  777. package/.agents/templates/single-story-body.md +17 -0
  778. package/.agents/workflows/agents-update.md +415 -0
  779. package/.agents/workflows/audit-architecture.md +312 -0
  780. package/.agents/workflows/audit-clean-code.md +179 -0
  781. package/.agents/workflows/audit-dependencies.md +91 -0
  782. package/.agents/workflows/audit-devops.md +110 -0
  783. package/.agents/workflows/audit-lighthouse.md +260 -0
  784. package/.agents/workflows/audit-performance.md +161 -0
  785. package/.agents/workflows/audit-privacy.md +104 -0
  786. package/.agents/workflows/audit-quality.md +191 -0
  787. package/.agents/workflows/audit-security.md +156 -0
  788. package/.agents/workflows/audit-seo.md +118 -0
  789. package/.agents/workflows/audit-sre.md +139 -0
  790. package/.agents/workflows/audit-to-stories.md +257 -0
  791. package/.agents/workflows/audit-ux-ui.md +102 -0
  792. package/.agents/workflows/epic-deliver.md +864 -0
  793. package/.agents/workflows/epic-plan.md +998 -0
  794. package/.agents/workflows/explain.md +118 -0
  795. package/.agents/workflows/git-cleanup.md +250 -0
  796. package/.agents/workflows/git-commit-all.md +15 -0
  797. package/.agents/workflows/git-merge-pr.md +377 -0
  798. package/.agents/workflows/git-pr-all.md +278 -0
  799. package/.agents/workflows/git-push.md +60 -0
  800. package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
  801. package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
  802. package/.agents/workflows/helpers/agents-sync-config.md +129 -0
  803. package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
  804. package/.agents/workflows/helpers/code-review.md +370 -0
  805. package/.agents/workflows/helpers/diagnose.md +117 -0
  806. package/.agents/workflows/helpers/epic-audit.md +295 -0
  807. package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
  808. package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
  809. package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
  810. package/.agents/workflows/helpers/epic-testing.md +125 -0
  811. package/.agents/workflows/helpers/parallel-tooling.md +88 -0
  812. package/.agents/workflows/helpers/signals.md +112 -0
  813. package/.agents/workflows/helpers/single-story-deliver.md +636 -0
  814. package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
  815. package/.agents/workflows/onboard.md +207 -0
  816. package/.agents/workflows/qa-assist.md +293 -0
  817. package/.agents/workflows/qa-explore.md +350 -0
  818. package/.agents/workflows/qa-run-harness.md +288 -0
  819. package/.agents/workflows/story-deliver.md +327 -0
  820. package/.agents/workflows/story-plan.md +233 -0
  821. package/LICENSE +21 -0
  822. package/README.md +193 -0
  823. package/bin/mandrel.js +56 -0
  824. package/bin/postinstall.js +195 -0
  825. package/lib/cli/__tests__/migrate.test.js +268 -0
  826. package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
  827. package/lib/cli/__tests__/sync.test.js +372 -0
  828. package/lib/cli/__tests__/update-major.test.js +217 -0
  829. package/lib/cli/__tests__/update.test.js +696 -0
  830. package/lib/cli/__tests__/version-check.test.js +398 -0
  831. package/lib/cli/doctor.js +124 -0
  832. package/lib/cli/explain.js +107 -0
  833. package/lib/cli/migrate.js +260 -0
  834. package/lib/cli/registry.js +830 -0
  835. package/lib/cli/sync-commands.js +50 -0
  836. package/lib/cli/sync.js +200 -0
  837. package/lib/cli/uninstall.js +795 -0
  838. package/lib/cli/update.js +854 -0
  839. package/lib/cli/version-check.js +206 -0
  840. package/lib/migrations/README.md +69 -0
  841. package/lib/migrations/__tests__/index.test.js +216 -0
  842. package/lib/migrations/index.js +164 -0
  843. package/package.json +105 -0
@@ -0,0 +1,954 @@
1
+ # Mandrel — `.agents/`
2
+
3
+ This is the framework payload (`.agents/`) consumed by host repos. It ships
4
+ inside the [`mandrel`](https://www.npmjs.com/package/mandrel)
5
+ npm package and is materialized into a consumer's `./.agents/` directory by
6
+ `mandrel sync`. It carries a system prompt, a baseline rule pack, a
7
+ two-tier skill library, a slash-command workflow set, and the
8
+ orchestration engine that runs Epic → Feature → Story plans on
9
+ GitHub. The framework version is the version of the installed
10
+ [`mandrel`](https://www.npmjs.com/package/mandrel) npm
11
+ package — run `npm ls mandrel` (or read `package.json`), not a
12
+ count here.
13
+
14
+ > **Ticket hierarchy.** Mandrel uses a **3-tier hierarchy**
15
+ > (Epic → Feature → Story) with inline `acceptance[]` / `verify[]` on
16
+ > Story bodies. See [`docs/SDLC.md` § Ticket hierarchy](docs/SDLC.md) for the
17
+ > diagram and execution-model implications.
18
+
19
+ This is the only README inside the distributed `.agents/` bundle. It
20
+ explains what each part of the bundle is for and captures the
21
+ cross-directory authoring conventions. The process narrative for
22
+ `/epic-plan` and `/epic-deliver` stays in [`docs/SDLC.md`](docs/SDLC.md).
23
+
24
+ ---
25
+
26
+ ## Activation
27
+
28
+ ### Cold start — `npx create-mandrel`
29
+
30
+ The canonical cold-start path is a single launcher command, run from the
31
+ root of your project (the folder does **not** need to be a git repo yet):
32
+
33
+ ```bash
34
+ npx create-mandrel # install mandrel → mandrel sync → bootstrap.js
35
+ ```
36
+
37
+ `create-mandrel` installs `mandrel`, materializes `./.agents/` via
38
+ `mandrel sync` (skipping the install when `.agents/` already exists), and
39
+ finishes by running `node .agents/scripts/bootstrap.js`, forwarding any flags
40
+ you pass. After it completes, run **`/onboard`** inside Claude Code for the
41
+ guided first run — stack detection, docs scaffolding, a `mandrel doctor`
42
+ readiness gate, and a started `/epic-plan` handoff.
43
+
44
+ The remainder of this section documents the manual steps `create-mandrel`
45
+ wraps, for operators who prefer to drive them by hand.
46
+
47
+ ### Manual cold start — install the npm package
48
+
49
+ From an **empty or existing** project that does not yet have `.agents/`,
50
+ install the package and materialize the framework payload:
51
+
52
+ ```bash
53
+ npm install mandrel
54
+ # pnpm add mandrel
55
+ # yarn add mandrel
56
+ ```
57
+
58
+ Installing `mandrel` pins an exact, provenance-signed version in
59
+ your lockfile (the npm publish attaches a Sigstore build-provenance
60
+ statement proving the tarball was built from this repo's CI). The package's
61
+ `postinstall` hook runs `mandrel sync` best-effort, which copies the
62
+ package's `.agents/` payload into your project's `./.agents/` directory as
63
+ plain regular files (never a symlink). If lifecycle scripts are skipped
64
+ (`--ignore-scripts`, sandboxed CI), run it yourself:
65
+
66
+ ```bash
67
+ npx mandrel sync # materialize ./.agents/ (idempotent, copy-only)
68
+ npx mandrel sync --dry-run # preview the planned copies, write nothing
69
+ npx mandrel doctor # confirm the install is healthy
70
+ ```
71
+
72
+ Then run the bootstrap to wire the project and GitHub side:
73
+
74
+ ```bash
75
+ node .agents/scripts/bootstrap.js
76
+ ```
77
+
78
+ ### Upgrading and local additions
79
+
80
+ Once installed, the ongoing upgrade path is **`mandrel update`** — it bumps
81
+ `mandrel` to the newest non-major version, re-runs `mandrel sync`,
82
+ applies version-keyed migrations, and verifies the install with
83
+ `mandrel doctor`. The lockfile bump is left **staged for you to review and
84
+ commit** (the command performs no `git` mutation):
85
+
86
+ ```bash
87
+ npx mandrel update # update → sync → migrate → doctor
88
+ npx mandrel update --dry-run # preview the target version + ordered steps
89
+ ```
90
+
91
+ A **major** crossing (e.g. `1.x → 2.0`) is **gated**: Mandrel lives on the
92
+ 1.x line under release-please `always-bump-minor`, so a major is a deliberate
93
+ operator decision. `mandrel update` refuses a major bump, points at the
94
+ [`docs/upgrade-major.md`](../docs/upgrade-major.md) runbook, and exits
95
+ without touching anything — re-run with `--major` to adopt it. Minor and
96
+ patch bumps are never gated. Migrations can also be run on their own:
97
+
98
+ ```bash
99
+ npx mandrel migrate --from <version> --to <version> [--dry-run]
100
+ ```
101
+
102
+ **Local additions survive upgrades only inside `.agents/local/`.** Because
103
+ `mandrel sync` overwrites `./.agents/` in place from the package payload,
104
+ hand edits to synced framework files are clobbered on the next upgrade — and
105
+ `mandrel doctor`'s drift check flags them. The **`.agents/local/`** zone is
106
+ the consumer-owned space `mandrel sync` never copies into nor prunes and the
107
+ drift check treats as sanctioned, so keep project-specific skills and local
108
+ workflow fragments there rather than editing synced files in place.
109
+
110
+ ### Run the unified bootstrap directly
111
+
112
+ When `.agents/` is already materialized, run the bootstrap straight from the
113
+ host repo root:
114
+
115
+ ```bash
116
+ node .agents/scripts/bootstrap.js
117
+ # bootstrap also seeds a discoverable npm alias, so after the first run:
118
+ npm run bootstrap
119
+ ```
120
+
121
+ The bootstrap adds an `npm run bootstrap` script to the consumer's
122
+ `package.json` (pointing at `node .agents/scripts/bootstrap.js`) the
123
+ first time it runs — an operator-defined `bootstrap` script always wins,
124
+ so the seed is skipped when the key already exists.
125
+
126
+ The bootstrap pipeline, in order:
127
+
128
+ 1. **Preflight gate (runs first, before any mutation).** A single
129
+ fail-before-mutate check confirms Node is at the required major
130
+ version, `git` is on `PATH`, the command is running inside a git work
131
+ tree, and — unless `--skip-github` is set — that the `gh` CLI is
132
+ installed and authenticated. If any check fails the bootstrap prints
133
+ each failing check's remedy and halts with exit 1 **before** touching
134
+ a single file or making a GitHub call, so a half-configured repo is
135
+ never left behind.
136
+ 2. **Resolve answers (owner / repo / base branch / operator handle /
137
+ project number).** Defaults are inferred from the local `git remote`
138
+ and config (no network calls). Each value is resolved through a
139
+ priority chain: CLI flag → environment variable
140
+ (`GH_OWNER`, `GH_REPO`, …) → silently-accepted inferred default →
141
+ interactive picker → free-text prompt → `--assume-yes` default.
142
+ 3. **Project-side mutations.** Seeds `.agentrc.json` from
143
+ [`starter-agentrc.json`](starter-agentrc.json), merges the framework's
144
+ runtime dependencies into `package.json`, runs the install, wires the
145
+ command-sync hook (the UserPromptSubmit hook that regenerates the flat
146
+ `.claude/commands/` tree so every `/<command>` loads), wires the system
147
+ prompt (see below), gitignores derived artefacts, and runs the
148
+ quality-gates installer.
149
+ 4. **GitHub-side mutations.** Creates the label taxonomy, Project V2
150
+ fields, branch protection, and merge-method settings. Skipped with
151
+ `--skip-github`.
152
+
153
+ The bootstrap is idempotent — safe to re-run; an already-configured
154
+ clone produces zero file mutations.
155
+
156
+ ### Automatic system-prompt wiring
157
+
158
+ The bootstrap wires the framework system prompt into a project-root
159
+ `CLAUDE.md` automatically, so there is no manual "load the system prompt"
160
+ step. Claude Code hydrates its always-loaded context from `CLAUDE.md`,
161
+ and the wiring step (idempotent, keyed off the literal
162
+ `@.agents/instructions.md` import path) does one of three things:
163
+
164
+ - **No `CLAUDE.md`** → writes a minimal one carrying a `## System Prompt`
165
+ heading and the `@.agents/instructions.md` import.
166
+ - **`CLAUDE.md` exists but lacks the import** → appends the import block.
167
+ - **`CLAUDE.md` already imports it** → no-op (no duplicate import line).
168
+
169
+ If your AI tool is not Claude Code, load
170
+ [`instructions.md`](instructions.md) verbatim through that tool's own
171
+ system-prompt mechanism (`.cursorrules`, Custom Instructions, etc.).
172
+
173
+ ### Interactive repo / project pickers
174
+
175
+ When the bootstrap runs interactively (a TTY, and `--assume-yes` is not
176
+ set), the **repo** and **project-number** questions render a live,
177
+ numbered menu of real choices instead of a blank prompt:
178
+
179
+ - The **repo picker** lists the resolved owner's repositories via
180
+ `gh repo list <owner>`.
181
+ - The **project picker** lists the owner's Projects V2 titles via
182
+ `gh project list --owner <owner>`.
183
+
184
+ The pickers are interactive-only and never block: a `--owner`/`--repo`
185
+ flag, a `GH_OWNER`/`GH_REPO` environment variable, or `--assume-yes`
186
+ short-circuits the picker (the earlier resolvers win); a non-TTY run
187
+ skips it entirely. If the owner cannot be resolved, or `gh` is missing,
188
+ unauthenticated, too old, or returns nothing, the list comes back empty
189
+ and the prompt falls through to manual free-text entry — so a missing or
190
+ stale `gh` never breaks the run.
191
+
192
+ For non-interactive (CI) installs, pass `--owner`, `--repo`, and
193
+ `--assume-yes`; pass `--skip-github` to defer the remote half.
194
+
195
+ After bootstrap, every Mandrel command is generated into a flat
196
+ `.claude/commands/` tree by `npm run sync:commands` (the UserPromptSubmit hook
197
+ keeps it current) and loads as a bare `/<command>` slash command — e.g.
198
+ `/epic-plan`, `/story-plan`, `/story-deliver`, `/audit-security`. The
199
+ commands load in every Claude Code environment. The [SDLC guide](docs/SDLC.md) walks
200
+ an end-to-end Epic; standalone Stories pair
201
+ [`/story-plan`](workflows/story-plan.md) (idea → drafted Story
202
+ Issue) with [`/story-deliver`](workflows/story-deliver.md) (Story Issue → merged
203
+ PR).
204
+
205
+ ### Runtime dependencies
206
+
207
+ The framework scripts under `.agents/scripts/` import a small set of
208
+ third-party npm packages at runtime. The materialized `./.agents/` tree
209
+ carries **no `node_modules` of its own** — `mandrel sync` copies only the
210
+ `.agents/` payload, so the scripts resolve their dependencies from the
211
+ **consuming repository's** install (Node walks `node_modules` upward from
212
+ the script's location to your repo root). The required set is enumerated in
213
+ a single vendored manifest that ships inside the bundle:
214
+
215
+ - **[`runtime-deps.json`](runtime-deps.json)** — the single source of
216
+ truth. Its `dependencies` block lists the **required** packages (`ajv`,
217
+ `ajv-formats`, `js-yaml`, `minimatch`, `picomatch`, `string-argv`,
218
+ `typescript`, `typhonjs-escomplex`); its `optionalDependencies` block
219
+ lists packages used only behind graceful-degradation paths (`chokidar`
220
+ for `quality:watch`, `@commitlint/load` for commit-subject sizing).
221
+
222
+ **How a consumer satisfies them:** `bootstrap` (above) merges the required
223
+ set into your `package.json` `dependencies` and runs your package manager's
224
+ install — so a freshly bootstrapped repo already has them. If you adopt
225
+ `.agents/` without the bootstrap, add the `runtime-deps.json` `dependencies`
226
+ to your own `package.json` (any compatible versions) and install.
227
+
228
+ **Fail-fast guard.** The dependency-dependent entry points
229
+ (`epic-plan-spec.js`, `epic-plan-decompose.js`, and the baseline scorers)
230
+ run a presence check on their required deps before doing any work. When the
231
+ install is missing, empty, or stale, they exit non-zero with an actionable
232
+ message naming the missing packages and your install command — instead of a
233
+ raw `ERR_MODULE_NOT_FOUND` deep inside a workflow. A drift test
234
+ (`tests/scripts/runtime-deps-drift.test.js`) keeps the manifest honest: it
235
+ fails if any third-party import under `.agents/scripts/**` is not declared
236
+ in `runtime-deps.json`.
237
+
238
+ ---
239
+
240
+ ## Contents
241
+
242
+ | Path | Purpose |
243
+ | ---- | ------- |
244
+ | [`instructions.md`](instructions.md) | Primary system prompt loaded by the host AI tool. |
245
+ | [`docs/SDLC.md`](docs/SDLC.md) | Operator process for `/epic-plan` and `/epic-deliver`. |
246
+ | [`starter-agentrc.json`](starter-agentrc.json) | Bootstrap delta-seed copied to the consumer repo root as `.agentrc.json`. |
247
+ | [`agentrc-reference.json`](docs/agentrc-reference.json) | Exhaustive editor reference enumerating every schema key with its framework default. |
248
+ | [`personas/`](personas/) | Role-specific behavior packs selected by task persona or explicit user instruction. |
249
+ | [`rules/`](rules/) | Domain-agnostic coding, security, testing, shell, git, and workflow rules. |
250
+ | [`skills/core/`](skills/core/) | Universal process skills such as debugging, TDD, security, documentation, and code review. |
251
+ | [`skills/stack/`](skills/stack/) | Stack-specific guardrails for frameworks, services, and testing tools. |
252
+ | [`workflows/`](workflows/) | Workflow definitions. Top-level files are projected into the flat `.claude/commands/` tree and invoked as `/<name>`. |
253
+ | [`workflows/helpers/`](workflows/helpers/) | Workflow fragments read by parent workflows; not exposed as commands. |
254
+ | [`scripts/`](scripts/) | Deterministic Node.js CLIs used by workflows and operators. |
255
+ | [`scripts/lib/orchestration/`](scripts/lib/orchestration/) | In-process orchestration SDK used by the CLI wrappers. |
256
+ | [`scripts/lib/checks/`](scripts/lib/checks/) | Discovery-based self-healing checks registry for preflight, the `diagnose.js` viewer, and retro surfaces. |
257
+ | [`schemas/`](schemas/) | JSON Schema contracts for config, manifests, reports, and persisted runtime artefacts. |
258
+ | [`templates/`](templates/) | Prompt and planning templates used by the orchestration flow. |
259
+
260
+ ---
261
+
262
+ ## Where to Look
263
+
264
+ | You want… | Open |
265
+ | --------- | ---- |
266
+ | The Epic planning and delivery process | [`docs/SDLC.md`](docs/SDLC.md) |
267
+ | The system prompt loaded by your AI tool | [`instructions.md`](instructions.md) |
268
+ | Every `.agentrc.json` key, default, and override | [`docs/configuration.md`](docs/configuration.md) (under `.agents/`) |
269
+ | Quality-gate runbooks (CRAP, MI, lint, friction) plus the baseline envelope, component model, and writer/reader contract | [`docs/quality-gates.md`](../docs/quality-gates.md) |
270
+ | Slash-command workflow definitions | [`workflows/`](workflows/) |
271
+ | Render the signals span-tree (debug helper) | [`workflows/helpers/signals.md`](workflows/helpers/signals.md) |
272
+ | Persona behavior packs | [`personas/`](personas/) |
273
+ | Domain-agnostic baseline rules | [`rules/`](rules/) |
274
+ | Skill library (core process + stack guardrails) | [`skills/core/`](skills/core/) · [`skills/stack/`](skills/stack/) |
275
+ | Decision rule: should this be a Skill or a Script? | [§ When to use a Skill vs a Script](#when-to-use-a-skill-vs-a-script) |
276
+ | Workflow authoring conventions | [§ Workflow authoring](#workflow-authoring) |
277
+ | Orchestration SDK and GitHub authentication | [§ Orchestration SDK](#orchestration-sdk) |
278
+ | Check registry authoring rules | [§ Self-healing checks](#self-healing-checks) |
279
+ | JSON Schema conventions | [§ Schemas](#schemas) |
280
+ | Bootstrap script (project + GitHub setup) | [`scripts/bootstrap.js`](scripts/bootstrap.js) |
281
+ | Adopt the QA workflows (`/qa-explore`, `/qa-assist`, `/qa-run-harness`) in your project | [§ Adopting the QA harness](#adopting-the-qa-harness) |
282
+ | Coordinate two operators on the same repo (lease model) | [§ Multi-developer coordination](#multi-developer-coordination) |
283
+
284
+ ---
285
+
286
+ ## When to use a Skill vs a Script
287
+
288
+ The framework ships two surfaces for automation under `.agents/`:
289
+
290
+ - **Scripts** under [`scripts/`](scripts/) — Node modules invoked via
291
+ `node .agents/scripts/<name>.js`, typically wired into a slash command
292
+ in [`workflows/`](workflows/).
293
+ - **Skills** under [`skills/core/`](skills/core/) and
294
+ [`skills/stack/`](skills/stack/) — declarative `SKILL.md` packages with
295
+ YAML front-matter (`name`, `description`, `allowed_tools`) that the host
296
+ LLM dispatches directly from a slash command.
297
+
298
+ The decision between the two is **not** a matter of taste. Apply this
299
+ rule:
300
+
301
+ > **Deterministic + parseable output → keep it a script.** Examples:
302
+ > GitHub I/O, label transitions, JSON validators, NDJSON readers,
303
+ > diff-vs-baseline gates, template renderers.
304
+ >
305
+ > **Prompt + judgment → make it a Skill.** Examples: composing a PRD
306
+ > from an Epic body, classifying friction signals from a failed shell
307
+ > command, decomposing a Tech Spec into a ticket hierarchy.
308
+
309
+ The rule is two-sided on purpose. "Has an LLM step adjacent" is *not*
310
+ the signal — many deterministic scripts emit a JSON envelope that a host
311
+ LLM consumes downstream, and that does not turn the script into a Skill.
312
+ The signal is whether the *output of this unit* is the product of
313
+ judgment (Skill) or of a parseable transform (script).
314
+
315
+ ### Worked example 1 — split: `epic-plan-decompose.js`
316
+
317
+ [`scripts/epic-plan-decompose.js`](scripts/epic-plan-decompose.js) is a
318
+ **split**: the deterministic halves stay as a script, the judgment middle
319
+ moves to a Skill.
320
+
321
+ - **`--emit-context`** (script half) — fetches the PRD and Tech Spec
322
+ bodies, scrapes project docs, emits a JSON envelope. Parseable in,
323
+ parseable out. Stays a script.
324
+ - **Authoring middle** (Skill half) — given the envelope, author the
325
+ ticket hierarchy JSON. Pure prompt + judgment. Migrates to a Skill
326
+ under `.agents/skills/core/` so it ships with declarative
327
+ `allowed_tools` and a smoke test rather than bespoke prompt-template
328
+ plumbing inside a Node module.
329
+ - **Persist half** (script half) — given the author-provided tickets
330
+ JSON, validate against the schema, create GitHub issues, flip the Epic
331
+ label. Deterministic GitHub I/O + schema validation. Stays a script.
332
+
333
+ The split codifies the "host LLM authors directly" pattern explicitly:
334
+ the prompt+judgment step gets a `description`, an
335
+ `allowed_tools` declaration, and a smoke test; the GitHub I/O around it
336
+ keeps its imperative implementation.
337
+
338
+ ### Worked example 2 — pure script: `resync-status-column.js`
339
+
340
+ [`scripts/resync-status-column.js`](scripts/resync-status-column.js)
341
+ **stays a script** because every step is deterministic GitHub I/O.
342
+
343
+ - It derives the target Projects v2 Status column for a ticket,
344
+ re-asserts it via a GraphQL mutation after auto-merge fires, and
345
+ polls for drift so the orchestrator wins the race against GitHub's
346
+ built-in merge bot.
347
+ - Input is the operator's CLI flags (`--ticket`, `--poll-attempts`,
348
+ etc.) and the GitHub API; output is a single-line JSON envelope
349
+ summarising the synced state.
350
+
351
+ The script's own input/output is deterministic and parseable: it does
352
+ not compose prompts, it does not classify, it does not author prose.
353
+ There is no judgment step adjacent to it — the verdict is "this is
354
+ the right shape" without any future Skill migration.
355
+
356
+ ---
357
+
358
+ ## Workflow Authoring
359
+
360
+ `workflows/` is the source of truth for the command surface exposed by
361
+ Claude Code in this repo. Each top-level `.md` file is projected into the
362
+ flat `.claude/commands/<name>.md` tree by
363
+ [`sync-claude-commands.js`](scripts/sync-claude-commands.js), so it is
364
+ invoked as `/<name>`. The flat projection has no plugin manifest and no
365
+ marketplace listing. Files under `workflows/helpers/` are path-included
366
+ modules read by parent workflows; they are not projected or exposed as
367
+ commands.
368
+
369
+ If you are looking for an end-user reference for an individual workflow,
370
+ read the workflow file itself. Every workflow is a self-contained
371
+ contract.
372
+
373
+ Every workflow begins with a flat YAML-ish frontmatter block delimited by
374
+ `---` lines. The parser in
375
+ [`frontmatter.js`](scripts/lib/audit-suite/frontmatter.js) reads a flat
376
+ key/value map; nested structures are not supported.
377
+
378
+ ```yaml
379
+ ---
380
+ description: <one-paragraph summary surfaced in the skill index>
381
+ ---
382
+ ```
383
+
384
+ `description` is recommended. Keep it under roughly 280 characters; the
385
+ audit-suite summary helpers truncate after three sentences. Missing
386
+ frontmatter falls back to the file's first prose paragraph.
387
+
388
+ Workflow frontmatter does **not** carry model identifiers. `Agent`
389
+ sub-dispatches inherit from the `general-purpose` sub-agent definition
390
+ unless a specific call in the workflow body passes a per-call `model:`
391
+ literal — that per-call override is the only supported way to pin a
392
+ sub-agent's model.
393
+
394
+ To add a workflow:
395
+
396
+ 1. Drop a new `.md` file at the top level of `workflows/`.
397
+ 2. Add frontmatter with at least `description`.
398
+ 3. Run `npm run sync:commands` to project the file into the flat
399
+ `.claude/commands/` tree; it surfaces as `/<name>`.
400
+
401
+ ---
402
+
403
+ ## Orchestration SDK
404
+
405
+ `scripts/lib/orchestration/` is the in-process orchestration SDK. Every
406
+ top-level CLI under `scripts/` should be a thin wrapper that parses argv,
407
+ resolves config, and delegates business logic to the SDK.
408
+
409
+ Provider operations are mediated through `ITicketingProvider`. The shipped
410
+ ticketing provider is GitHub, resolved by `provider-factory.js` from the
411
+ `orchestration.provider` config key. CLI scripts receive provider
412
+ instances from the SDK surface rather than importing provider
413
+ implementations directly. Execution is Claude-Code-in-session — there is
414
+ no separate adapter abstraction; `wave-dispatcher.js` synthesizes the
415
+ dispatch record inline and the dispatch manifest (md + structured
416
+ comment) is the cross-runtime contract.
417
+
418
+ The SDK barrel is `scripts/lib/orchestration/index.js`; its exports are
419
+ the source of truth for the public in-process surface. Key families
420
+ include dispatch (`dispatch-engine.js`, `manifest-builder.js`), context
421
+ hydration, planning state, label transitions, Epic runner phases,
422
+ Story-close internals, retro heuristics, and structured error capture.
423
+
424
+ ### GitHub authentication
425
+
426
+ The GitHub provider resolves credentials in this order:
427
+
428
+ | Priority | Method | Environment |
429
+ | -------- | ------ | ----------- |
430
+ | 1 | `GITHUB_TOKEN` or `GH_TOKEN` | CI/CD and background scripts |
431
+ | 2 | `gh auth token` | Local developer workflow |
432
+
433
+ Fine-grained PATs should grant GitHub Projects V2 read/write, Issues
434
+ read/write, Metadata read-only, and Pull requests read/write. Classic
435
+ PATs need `repo` and `project`.
436
+
437
+ Set `GITHUB_TOKEN` in the process environment or in `.env` at the
438
+ project root; the resolver auto-loads `.env`. For local interactive
439
+ sessions, `gh auth login` is sufficient.
440
+
441
+ ---
442
+
443
+ ## Self-Healing Checks
444
+
445
+ `scripts/lib/checks/` is the discovery-based registry of named checks
446
+ consumed by preflight guards (`/epic-deliver`, `/story-close`, `npm test`),
447
+ the `diagnose.js` ad-hoc viewer, and the retro surface. Use one check per
448
+ file. The runner (`index.js`) loads checks at process start and filters by
449
+ scope at each call site.
450
+
451
+ Each check module default-exports an object with this shape:
452
+
453
+ ```js
454
+ export default {
455
+ id: 'stale-origin-epic',
456
+ severity: 'blocker', // 'blocker' | 'warning' | 'info'
457
+ scope: ['epic-deliver', 'story-close', 'retro'],
458
+ autoCorrect: 'refuse-and-print', // 'auto' | 'refuse-and-print'
459
+ detect(state) {
460
+ return null;
461
+ },
462
+ async fix(state) {
463
+ return { ok: true, message: 'what was changed' };
464
+ },
465
+ };
466
+ ```
467
+
468
+ `detect(state)` returns a finding or `null`. Read git, filesystem, and
469
+ environment projections from the assembled `state`; do not re-probe the
470
+ environment inside the check. A finding includes `id`, `severity`,
471
+ `scope`, `summary`, optional `detail`, mandatory `fixCommand`, and
472
+ `autoCorrectable`.
473
+
474
+ `autoCorrect: 'auto'` means the fix is local, bounded, and reversible.
475
+ Auto-fixes must not push to remotes, commit to `epic/*` or `main`, amend
476
+ history, recursively delete outside `.worktrees/<id>/`, write GitHub
477
+ state, or read secret values. Anything requiring those operations must be
478
+ `refuse-and-print` with a human-run `fixCommand`.
479
+
480
+ The retro scope is read-only. `runChecks({ scope: 'retro', autoFix: true
481
+ })` is invalid, and retro-scoped checks should usually omit `fix()`.
482
+
483
+ Module boundary rules:
484
+
485
+ - Filenames match check ids in kebab-case.
486
+ - `index.js` and `state.js` are runner infrastructure and excluded from
487
+ discovery.
488
+ - Checks do not import from other checks.
489
+ - Shared probes belong in `state.js`; pure formatting helpers may live in
490
+ sibling helper modules.
491
+ - Checks do not keep module-level mutable state.
492
+
493
+ ---
494
+
495
+ ## Baselines
496
+
497
+ The framework's quality gates compare against per-kind baseline files
498
+ under `baselines/<kind>.json` (lint, coverage, crap, maintainability,
499
+ mutation, lighthouse, bundle-size). Every baseline shares a single
500
+ envelope, every gate reads through one shared module
501
+ ([`.agents/scripts/lib/baselines/reader.js`](scripts/lib/baselines/reader.js)),
502
+ and every refresher writes through one shared writer
503
+ ([`.agents/scripts/lib/baselines/writer.js`](scripts/lib/baselines/writer.js)).
504
+
505
+ See the [Baseline reference](../docs/quality-gates.md#baseline-reference)
506
+ section of `docs/quality-gates.md` for the full reference: envelope shape,
507
+ per-kind axes, component model, path canonicalisation, writer/reader
508
+ contract, kernel-version friction, and — most relevant to consumers — the
509
+ **floor override** path. Consumers add a `floors` block
510
+ (and optional `components`) under their gate in `.agentrc.json`:
511
+
512
+ ```json
513
+ {
514
+ "delivery": {
515
+ "quality": {
516
+ "gates": {
517
+ "coverage": {
518
+ "floors": { "*": { "lines": 90, "branches": 85 } },
519
+ "components": { "api": ["src/api/**"] }
520
+ }
521
+ }
522
+ }
523
+ }
524
+ }
525
+ ```
526
+
527
+ The unified runtime gate
528
+ [`.agents/scripts/check-baselines.js`](scripts/check-baselines.js)
529
+ currently runs floor + tolerance + schema + kernel-mismatch checks only;
530
+ full regression absorption and per-kind CLI deletion are tracked in
531
+ follow-up **Epic #1943**.
532
+
533
+ ---
534
+
535
+ ## Schemas
536
+
537
+ `schemas/` contains JSON Schema draft 2020-12 contracts consumed by the
538
+ orchestration layer. Each schema describes one structured artefact:
539
+ configuration, structural Epic specs, runtime reports, dispatch
540
+ manifests, or persisted state. Where a runtime AJV schema also exists,
541
+ the JSON file is a mirror kept in sync by a drift test.
542
+
543
+ Important schema groups:
544
+
545
+ - Structural specs: `epic-spec.schema.json` for the declarative
546
+ `epic.yaml` plus reconciler flow.
547
+ - Configuration: `agentrc.schema.json`, mirrored from the runtime config
548
+ schemas.
549
+ - Runtime reports: audit results, CRAP and maintainability reports,
550
+ performance summaries, friction and signal events, and validation
551
+ evidence.
552
+ - Dispatch: `dispatch-manifest.json`, the per-Epic dispatch manifest
553
+ schema written by `dispatcher.js`.
554
+
555
+ Schema conventions:
556
+
557
+ - `$schema` references draft 2020-12.
558
+ - `$id` is the canonical GitHub blob URL for the file.
559
+ - Every property carries a `description`.
560
+ - Objects use `additionalProperties: false` unless the contract
561
+ explicitly needs an open extension point.
562
+ - Structural schemas do not model `agent::*` labels; wave-runner state is
563
+ separate from structural intent.
564
+
565
+ ---
566
+
567
+ ## Code review providers (pluggable chain)
568
+
569
+ `runCodeReview()` (invoked at the end of `helpers/epic-deliver-story`,
570
+ `helpers/single-story-deliver`, and `/epic-deliver`'s `delivery.code-review`
571
+ state) loads its review backend through a pluggable registry. Two configuration shapes are supported:
572
+
573
+ - **Legacy single provider** — `delivery.codeReview.provider: "native"`
574
+ (default), `"codex"`, or `"security-review"`. Returns one adapter; one
575
+ set of findings; one structured comment.
576
+ - **Provider chain** (Story #2871) — `delivery.codeReview.providers: []`
577
+ iterates a declared list of entries, merges every inline adapter's
578
+ `Finding[]` in declaration order, and appends a non-blocking
579
+ "Manual Review Suggestions" section for any manual-prompt entries
580
+ that contributed text. When both fields are set, `providers` wins.
581
+
582
+ ```json
583
+ {
584
+ "delivery": {
585
+ "codeReview": {
586
+ "providers": [
587
+ { "name": "native" },
588
+ { "name": "security-review", "scopes": ["epic"], "optional": true },
589
+ {
590
+ "name": "ultrareview",
591
+ "scopes": ["epic"],
592
+ "manualPrompt": true,
593
+ "when": { "label": "risk::high" }
594
+ }
595
+ ]
596
+ }
597
+ }
598
+ }
599
+ ```
600
+
601
+ Each chain entry accepts:
602
+
603
+ - `name` (required) — registered key. Inline: `native`, `codex`,
604
+ `security-review`. Manual-prompt: `ultrareview`.
605
+ - `scopes` — invocation scopes this entry fires on (`["story", "epic"]`).
606
+ Default is both.
607
+ - `optional` — when `true`, a construction failure (host missing the
608
+ required CLI/plugin) is logged and the entry is skipped instead of
609
+ hard-failing the chain. Use for portable configs that ship across
610
+ Claude and non-Claude runtimes — for example,
611
+ `security-review` requires the `claude` CLI on PATH and degrades
612
+ cleanly on a non-Claude host when `optional: true`.
613
+ - `manualPrompt` — when `true`, the entry is loaded from the
614
+ manual-prompt registry and contributes a one-line operator suggestion
615
+ via `renderPrompt()` instead of running a real review. Manual-prompt
616
+ contributions do NOT affect severity counts or the `halted` gate.
617
+ - `when` — optional label predicate evaluated at invocation time
618
+ against the ticket's labels (`when.label` for a single required
619
+ label, `when.labelAny` for "any of these"). False predicates skip
620
+ the entry silently for that run.
621
+
622
+ Cross-runtime contract: manual-prompt providers (e.g. `ultrareview`)
623
+ emit Markdown only and MUST NEVER throw under any host. Inline
624
+ providers that require a host-specific binary (e.g.
625
+ `security-review` shells out to `claude --print /security-review`)
626
+ SHOULD be declared `optional: true` so non-Claude consumers can pin
627
+ the same `.agents/` version without modifying their config.
628
+
629
+ The pluggable backend was introduced in Epic #2815; the multi-provider
630
+ chain, `security-review`, and `ultrareview` were added in Story #2871.
631
+
632
+ ---
633
+
634
+ ## Feedback loop — code-review auto-graduation
635
+
636
+ When the Epic finalize listener runs, non-blocking code-review findings
637
+ (severity `high`, `medium`, or `low`) that survived merge are
638
+ auto-graduated into follow-up issues, routed by source classification
639
+ into the framework repo or the consumer repo. The toggle lives at
640
+ `delivery.feedbackLoop.codeReviewAutoFile` and defaults to `true`.
641
+
642
+ To opt out (for example, to triage findings manually during a
643
+ stabilization window), set the toggle to `false` in your root
644
+ `.agentrc.json`:
645
+
646
+ ```json
647
+ {
648
+ "delivery": {
649
+ "feedbackLoop": {
650
+ "codeReviewAutoFile": false
651
+ }
652
+ }
653
+ }
654
+ ```
655
+
656
+ When disabled, the listener short-circuits and leaves the structured
657
+ `code-review` comments on the Epic ticket untouched. Re-enabling the
658
+ toggle is safe: the graduator embeds an idempotency marker
659
+ (`<!-- code-review-followup: epic-<id>-finding-<idx> -->`) in each filed
660
+ issue body, so re-runs skip findings that already have an issue.
661
+
662
+ ---
663
+
664
+ ## Worktree dependency strategies
665
+
666
+ When `delivery.worktreeIsolation.enabled` is `true`, each Story runs in
667
+ its own worktree under `.worktrees/story-<id>/`. The
668
+ `nodeModulesStrategy` field on `delivery.worktreeIsolation` controls how
669
+ `node_modules` is populated in that worktree. Three values are supported,
670
+ each with different cost/portability trade-offs:
671
+
672
+ | Strategy | When to use | Cold-start cost | Notes |
673
+ | -------------- | ---------------------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------- |
674
+ | `per-worktree` | Default-safe — no host setup, no symlink semantics to worry about. | Full `npm ci` per Story. | Slowest. Each worktree gets an independent `node_modules`. |
675
+ | `symlink` | npm/yarn repos that want the fast path. **Opt-in.** | Near-zero. | Junctions a single donor `node_modules` into each worktree. Refuses on Windows unless explicitly opted in. |
676
+ | `pnpm-store` | pnpm repos. **Shipped consumer default in `agentrc-reference.json`.** | Fast (store-backed). | Runs `pnpm install --frozen-lockfile` against the shared content-addressable store. |
677
+
678
+ The **shipped consumer default in
679
+ [`.agents/docs/agentrc-reference.json`](./docs/agentrc-reference.json) remains
680
+ `pnpm-store`**. Repos that do not use pnpm should opt in to `symlink`
681
+ explicitly in their root `.agentrc.json`; this repo dogfoods that
682
+ configuration.
683
+
684
+ ### Symlink opt-in (npm / yarn)
685
+
686
+ To opt in, set three fields on `delivery.worktreeIsolation` in your root
687
+ `.agentrc.json`:
688
+
689
+ ```json
690
+ {
691
+ "delivery": {
692
+ "worktreeIsolation": {
693
+ "enabled": true,
694
+ "nodeModulesStrategy": "symlink",
695
+ "primeFromPath": ".",
696
+ "allowSymlinkOnWindows": true
697
+ }
698
+ }
699
+ }
700
+ ```
701
+
702
+ - **`nodeModulesStrategy: "symlink"`** — switch off the per-worktree
703
+ install and link instead.
704
+ - **`primeFromPath`** — relative path (from the repo root) to the donor
705
+ worktree whose `node_modules/` is reused. `"."` means the root
706
+ checkout, which must already have `node_modules/` populated before a
707
+ Story initializes. `story-init.js` enforces this with a pre-check.
708
+ - **`allowSymlinkOnWindows`** — required on Windows. The strategy uses
709
+ junctions (no admin rights needed) on Windows when this is `true`; it
710
+ refuses with an explanatory error otherwise, because symlink semantics
711
+ vary by Windows version.
712
+
713
+ Once these are set, `story-init.js` skips `npm ci` in the worktree and
714
+ junctions/symlinks `node_modules` from the donor — typical cold-start
715
+ falls from minutes to under a second.
716
+
717
+ ---
718
+
719
+ ## Multi-developer coordination
720
+
721
+ Two operators can drive the same repository at once — one running
722
+ `/epic-deliver <id>`, another running `/single-story-deliver <id>`, or two
723
+ operators on the same Epic from separate clones. The framework keeps those
724
+ runs from clobbering one another with **two distinct coordination layers**.
725
+ They solve different problems and must not be confused:
726
+
727
+ - **Filesystem locks** (`epic-merge-lock`, `sweep-lock`) serialise work
728
+ **within a single machine/clone**. They are keyed on local process PIDs
729
+ and live under `.git/` (or a local lockfile path), so they do **not**
730
+ coordinate across clones. See
731
+ [`docs/SDLC.md` § Cross-clone coordination](docs/SDLC.md#cross-clone-coordination)
732
+ for why.
733
+ - **The assignee-as-lease claim** coordinates **across clones** by riding
734
+ the ticket's GitHub `assignees` surface — a substrate every clone can
735
+ see. This is the cross-clone layer, described below.
736
+
737
+ ### Assignee-as-lease claim model
738
+
739
+ The lease primitive lives in
740
+ [`scripts/lib/orchestration/ticket-lease.js`](scripts/lib/orchestration/ticket-lease.js).
741
+ Rather than inventing a new state column, the lease rides the ticket's
742
+ existing **assignees** field: the single assignee *is* the lease owner.
743
+ Liveness is decided by the owner's most-recent `story.heartbeat` timestamp
744
+ compared against a configurable TTL (`delivery.lease.ttlMs`).
745
+
746
+ The model has five behaviours, all expressed through `acquireLease` /
747
+ `releaseLease`:
748
+
749
+ | Behaviour | When it fires | Outcome |
750
+ | --------- | ------------- | ------- |
751
+ | **Acquire by self-assign** | The ticket is unassigned. | The operator is written to `assignees`; the run proceeds (`reason: 'unclaimed'`). |
752
+ | **Re-affirm a self-held claim** | The operator already holds the lease. | No write; the run proceeds (`reason: 'already-held'`). |
753
+ | **Refuse-if-foreign** | A *different* operator holds the lease and their heartbeat is within the TTL (the claim is **live**). | The acquire **fails closed** — the run refuses to start and names the current owner so you know who to coordinate with (`reason: 'held'`). |
754
+ | **Stale-claim reclaim** | A foreign claim exists but its heartbeat is older than the TTL (or the owner never heartbeated). | The lease is automatically reassigned to the operator (`reason: 'reclaimed'`). An abandoned claim never wedges the ticket. |
755
+ | **`--steal` override** | A foreign claim is *live* and the operator passes `--steal`. | The live claim is forcibly transferred (`reason: 'stolen'`). This is the **only** way past a live foreign claim. |
756
+
757
+ On a clean completion the holder **releases** the lease (clears the
758
+ assignment), but only when it still holds it — a late release on a ticket
759
+ that was since reassigned (e.g. via `--steal`) is a no-op, so it never
760
+ yanks the claim back from whoever legitimately took over.
761
+
762
+ **Where it's wired:**
763
+
764
+ - **`/epic-deliver`** acquires the lease on the **Epic** ticket during its
765
+ prepare phase, before any mutating git work
766
+ ([`epic-deliver-lease-guard.js`](scripts/lib/orchestration/epic-deliver-lease-guard.js)).
767
+ A live foreign claim refuses the run; pass `--steal` to override and
768
+ `--as <handle>` to claim under a specific identity. The operator is
769
+ resolved from `--as`, then `github.operatorHandle`, then
770
+ `git config user.email`; when none resolve, the lease step is skipped
771
+ (the checkout-safety guard still runs).
772
+ - **`/single-story-deliver`** acquires the lease on the **Story** ticket at
773
+ init and releases it at close
774
+ ([`single-story-lease-guard.js`](scripts/lib/orchestration/single-story-lease-guard.js)).
775
+ The standalone path requires `github.operatorHandle` to be set — without
776
+ an operator identity the lease has no owner to record.
777
+ - **`/epic-plan`** acquires the lease on the **Epic** ticket before Phase 7
778
+ (spec) and releases it after Phase 8 (decompose)
779
+ ([`epic-plan-lease-guard.js`](scripts/lib/orchestration/epic-plan-lease-guard.js)).
780
+ Because planning emits no `story.heartbeat` (heartbeats are a
781
+ delivery-time signal), the plan path has no live-heartbeat source and so
782
+ **fails closed**: any foreign assignee is treated as a live claim and
783
+ refuses the run unless `--steal` transfers it. Unassigned or self-held
784
+ Epics proceed. When `github.operatorHandle` is unset the lease cannot be
785
+ keyed and the preflight degrades to a no-op.
786
+
787
+ ---
788
+
789
+ ## Root config vs distributed templates
790
+
791
+ Three `.agentrc`-shaped files live in this repository and are easy to
792
+ confuse:
793
+
794
+ | File | Audience | Role |
795
+ | --------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
796
+ | `.agentrc.json` (repo root) | The framework dogfooding itself | Live config used when running `/epic-*`, `/story-deliver` against this repo. Exercises the framework end-to-end. |
797
+ | `.agents/starter-agentrc.json` | Downstream consumer repos | Bootstrap delta-seed a consumer copies via `cp .agents/starter-agentrc.json .agentrc.json`. Minimum schema-required keys. |
798
+ | `.agents/docs/agentrc-reference.json` | Operators and reviewers | Exhaustive editor reference enumerating every schema key with its framework default. Not a copy target. |
799
+
800
+ The three files share a schema; where they legitimately diverge (target
801
+ dirs, repo identifiers, version-file pointer) is documented in
802
+ [`docs/configuration.md` § Root dogfood vs distributed template](docs/configuration.md#root-dogfood-vs-distributed-template).
803
+ Edit `agentrc-reference.json` when a framework default changes; edit
804
+ `starter-agentrc.json` only when the bootstrap seed itself needs new
805
+ schema-required keys; edit the root `.agentrc.json` for changes that
806
+ only affect this repo's own dogfood runs.
807
+
808
+ ---
809
+
810
+ ## Adopting the QA harness
811
+
812
+ Mandrel ships **three** complementary QA loops, all adopting the `qa-engineer`
813
+ persona and all reading the same `qa.*` project contract from `.agentrc.json`.
814
+ Two are exploratory siblings that differ on **who drives**; the third steps a
815
+ known scenario set:
816
+
817
+ - **`/qa-explore <surface>`** — an **agent-led**, open-ended
818
+ **Plan → Capture → Triage** exploratory sweep. The operator names a surface;
819
+ the **agent drives** it (through the browser MCP by default, or statically as
820
+ a documented interim), probing for product bugs, environment-setup friction,
821
+ tooling/DX gaps, missing tests, and enhancement ideas, recording each
822
+ observation as a `QaLedgerItem` against the
823
+ [`qa-ledger.schema.json`](schemas/qa-ledger.schema.json) contract. Capture is
824
+ strictly read-only — the only write it performs is appending ledger lines to
825
+ the session ledger at **`temp/qa/<sessionId>.ndjson`** (session scratch under
826
+ `project.paths.tempRoot`, gitignored, never committed). Triage then
827
+ classifies, dedups, and routes each item into a `file` / `defer` / `dismiss`
828
+ disposition; the session is HITL-gated — every phase transition and every
829
+ ticket-filing write is operator-gated. A resumed session
830
+ (`--session-id <id>`) appends and carries its un-triaged backlog forward. The
831
+ end-to-end procedure is the SSOT in
832
+ [`workflows/qa-explore.md`](workflows/qa-explore.md), with the deterministic
833
+ decision seams under `scripts/lib/qa/` (session, redaction, coverage,
834
+ missing-test) and `scripts/lib/findings/` (classification, dedup/route).
835
+ - **`/qa-assist`** — the **human-led** sibling of `/qa-explore`: a
836
+ single-observation **Intake → Enrich → Record** loop. Here the **human
837
+ drives** — the operator reports one thing they observed (a bug, a flaky
838
+ behavior, a "this feels off") and the agent enriches it into a triage-ready
839
+ `QaLedgerItem` (a clean repro, a `file:line` root-cause locus, a coverage
840
+ verdict), asking clarifying questions when the observation is ambiguous, then
841
+ appends it — after explicit confirmation — to a persistent, resumable rolling
842
+ session under `temp/qa/`. It writes the **same** ledger contract `/qa-explore`
843
+ produces, so a `/qa-assist` item flows through the identical dedup,
844
+ classification, and promotion machinery later. The end-to-end procedure is
845
+ the SSOT in [`workflows/qa-assist.md`](workflows/qa-assist.md). Reach for
846
+ `/qa-assist` when you hit something mid-flight and want it captured well
847
+ without breaking stride; reach for `/qa-explore` when you want the agent to
848
+ go hunt a named surface.
849
+ - **`/qa-run-harness <selector>`** — the **automated complement**: it drives a
850
+ consumer's Gherkin `.feature` scenarios through a real browser (the
851
+ `chrome-devtools` MCP surface), captures per-surface console/network into
852
+ structured `F#` findings, and drafts follow-up tickets for operator
853
+ sign-off. The end-to-end procedure is the SSOT in
854
+ [`workflows/qa-run-harness.md`](workflows/qa-run-harness.md); the
855
+ instrumentation conventions live in the
856
+ [`skills/stack/qa/qa-harness`](skills/stack/qa/qa-harness/SKILL.md) skill; the
857
+ architectural overview (run pipeline, contract fields, finding shape) is in
858
+ [`docs/architecture.md` § Agent-driven QA harness](../docs/architecture.md#agent-driven-qa-harness).
859
+
860
+ Reach for `/qa-explore` when you want the **agent** to hunt a freshly delivered
861
+ Story/Feature or run a structured bug-hunt captured into a triageable ledger;
862
+ reach for `/qa-assist` when **you** hit something mid-flight and want it
863
+ enriched into a single triage-ready ledger item; reach for `/qa-run-harness` to
864
+ step a **known** scenario set through the browser for a regression pass.
865
+
866
+ Binding the QA contract is **opt-in**. All three workflows resolve the
867
+ consumer's `qa` block through the single seam
868
+ [`resolve-qa-contract.js`](scripts/lib/qa/resolve-qa-contract.js); a consumer
869
+ that has not bound it gets a loud, actionable failure ("this project has not
870
+ bound the QA harness") when either workflow runs — there is no auto-detection
871
+ fallback. To adopt the QA surface, a consumer project takes three concrete
872
+ steps.
873
+
874
+ ### 1. Bind the `qa` block in `.agentrc.json`
875
+
876
+ Add a top-level `qa` block. It is optional in the schema (so config
877
+ validation never breaks a non-QA consumer), but the four core fields are
878
+ required at run time by `resolveQaContract`. Copy the reference shape from
879
+ [`agentrc-reference.json`](docs/agentrc-reference.json) and adapt the paths:
880
+
881
+ ```jsonc
882
+ {
883
+ "qa": {
884
+ "featureRoot": "tests/features", // root the selector resolves .feature files against
885
+ "fixturesManifest": "tests/fixtures/personas.json", // persona → seed-data manifest
886
+ "signInSeam": { "urlTemplate": "/dev/sign-in-as/{persona}" }, // dev seam (see step 3)
887
+ "personas": ["admin", "member"], // name-only array — the honest shape for a url-template seam
888
+ "consoleAllowlist": ["[HMR]"], // optional benign-noise filter (default [])
889
+ "designTokens": "src/styles/tokens.css" // optional visual-check pointer (default null)
890
+ }
891
+ }
892
+ ```
893
+
894
+ `featureRoot`, `fixturesManifest`, `signInSeam`, and `personas` are
895
+ mandatory; omitting any one makes the resolver throw a field-named error.
896
+ `consoleAllowlist` and `designTokens` default to `[]` and `null`.
897
+
898
+ `personas` accepts **two shapes** (the resolver normalizes both to one
899
+ canonical internal map keyed by persona name):
900
+
901
+ - **Name-only array** (above) — `["admin", "member"]`. This is the honest
902
+ shape under a `urlTemplate` dev-impersonation seam, where the persona name
903
+ is the only input the harness consumes (it is substituted into the URL) and
904
+ no per-persona auth material is ever read. Do **not** fabricate
905
+ `credentialRef`/`signInSkill` values a url-template seam ignores.
906
+ - **Object map** — keyed by persona name, each entry carrying per-persona
907
+ auth material (`{ credentialRef }` or `{ signInSkill }`). Use this only
908
+ under a `skill` (or credential) seam where that material is genuinely
909
+ consulted:
910
+
911
+ ```jsonc
912
+ "signInSeam": { "skill": "stack/qa/sign-in" },
913
+ "personas": {
914
+ "admin": { "credentialRef": "QA_ADMIN_CREDENTIAL" }, // stored-credential reference, never an inline secret
915
+ "member": { "signInSkill": "stack/qa/sign-in-member" } // or a per-persona sign-in skill
916
+ }
917
+ ```
918
+
919
+ ### 2. Author the fixtures manifest
920
+
921
+ Create the file referenced by `fixturesManifest`. It binds each persona to
922
+ the seed data the harness loads before signing that persona in, so scenarios
923
+ start from a known state. Every persona named under `qa.personas` should have
924
+ a corresponding entry. Keep the manifest free of real secrets — it carries
925
+ seed-data shape, not credentials (credentials resolve through `credentialRef`
926
+ or a sign-in skill).
927
+
928
+ ### 3. Expose a `signInSeam`
929
+
930
+ The harness signs in once per persona using a **dev-only seam** — real
931
+ credentials are never entered. Expose one of two shapes:
932
+
933
+ - **`{ urlTemplate }`** — a dev sign-in route where `{persona}` is
934
+ substituted (e.g. `/dev/sign-in-as/{persona}` → `/dev/sign-in-as/admin`).
935
+ Gate this route to non-production builds.
936
+ - **`{ skill }`** — when sign-in is multi-step or non-URL, point at a
937
+ consumer skill whose `SKILL.md` the harness reads and follows.
938
+
939
+ Which seam kinds consult per-persona material: under a `{ urlTemplate }` seam
940
+ the persona **name** is the sole input, so author `personas` as a name-only
941
+ array and supply no auth material. Under a `{ skill }` (or credential) seam,
942
+ author `personas` as the object map and supply per-persona overrides:
943
+ `{ credentialRef }` points at a stored-credential reference (resolved from the
944
+ environment, never inlined) and `{ signInSkill }` points at a per-persona
945
+ sign-in skill.
946
+
947
+ Once these three `qa.*` keys are in place, `/qa-explore <surface>`,
948
+ `/qa-assist`, and `/qa-run-harness <selector>` all resolve the contract and
949
+ operate against the bound surface. For `/qa-run-harness`, the `chrome-devtools`
950
+ MCP surface is a host-provided runtime dependency; when it is unavailable the
951
+ harness degrades with a clear error rather than falling back to a headless
952
+ runner. `/qa-explore` and `/qa-assist` read the same `qa.*` keys to scope their
953
+ work and to drive the deterministic coverage/missing-test verdicts, then record
954
+ each observation into the `temp/qa/` ledger described above.