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,1583 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/dsj1984/mandrel/blob/main/.agents/schemas/agentrc.schema.json",
4
+ "title": "Mandrel .agentrc",
5
+ "description": "Static JSON Schema mirror of the authoritative AJV schema in .agents/scripts/lib/config-settings-schema.js. The AJV schema is the runtime source of truth; this file exists for editor tooling and human readers. A drift test (tests/config-schema-mirror-drift.test.js) keeps the two in sync. Top-level reshape: Epic #1720 Story #1739 pivoted from {agentSettings, orchestration} to {project, github, planning, delivery}. Quality gate reshape: Epic #1720 Story #1737 introduced the uniform delivery.quality.gates.<tier> shape with seven gates (lint, coverage, crap, maintainability, mutation, lighthouse, bundleSize), object-shaped { kind, value } tolerances, and workspace-keyed floors objects. Story #2687 (Epic #2646) confirmed that the schema carries no field whose sole purpose is to keep pre-cutover documents validating \u2014 every property exposed here corresponds to a canonical reader in the post-reshape config layer. Epic #2880 Story #2935 finalized the cutover by deleting the resolver-side output shim that surfaced agentSettings/orchestration pointers; legacy-shaped documents are rejected by root additionalProperties:false and the canonical blocks are the only supported reads.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["project"],
9
+ "properties": {
10
+ "$schema": {
11
+ "type": "string"
12
+ },
13
+ "project": {
14
+ "$ref": "#/$defs/project"
15
+ },
16
+ "github": {
17
+ "$ref": "#/$defs/github"
18
+ },
19
+ "planning": {
20
+ "$ref": "#/$defs/planning"
21
+ },
22
+ "delivery": {
23
+ "$ref": "#/$defs/delivery"
24
+ },
25
+ "qa": {
26
+ "$ref": "#/$defs/qa"
27
+ }
28
+ },
29
+ "$defs": {
30
+ "safeString": {
31
+ "type": "string",
32
+ "not": {
33
+ "pattern": "[;&|`$<>]"
34
+ }
35
+ },
36
+ "nullableSafeString": {
37
+ "type": ["string", "null"],
38
+ "not": {
39
+ "type": "string",
40
+ "pattern": "[;&|`$<>]"
41
+ }
42
+ },
43
+ "nullableNonEmptySafeString": {
44
+ "type": ["string", "null"],
45
+ "minLength": 1,
46
+ "not": {
47
+ "type": "string",
48
+ "pattern": "[;&|`$<>]"
49
+ }
50
+ },
51
+ "listOrExtenderOfStrings": {
52
+ "oneOf": [
53
+ {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "string"
57
+ }
58
+ },
59
+ {
60
+ "type": "object",
61
+ "properties": {
62
+ "append": {
63
+ "type": "array",
64
+ "items": {
65
+ "type": "string"
66
+ }
67
+ },
68
+ "prepend": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "string"
72
+ }
73
+ }
74
+ },
75
+ "additionalProperties": false
76
+ }
77
+ ]
78
+ },
79
+ "paths": {
80
+ "type": "object",
81
+ "required": ["agentRoot", "docsRoot", "tempRoot"],
82
+ "properties": {
83
+ "agentRoot": {
84
+ "allOf": [
85
+ {
86
+ "$ref": "#/$defs/safeString"
87
+ },
88
+ {
89
+ "minLength": 1
90
+ }
91
+ ]
92
+ },
93
+ "docsRoot": {
94
+ "allOf": [
95
+ {
96
+ "$ref": "#/$defs/safeString"
97
+ },
98
+ {
99
+ "minLength": 1
100
+ }
101
+ ]
102
+ },
103
+ "tempRoot": {
104
+ "allOf": [
105
+ {
106
+ "$ref": "#/$defs/safeString"
107
+ },
108
+ {
109
+ "minLength": 1
110
+ }
111
+ ]
112
+ }
113
+ },
114
+ "additionalProperties": false
115
+ },
116
+ "commands": {
117
+ "type": "object",
118
+ "properties": {
119
+ "lintBaseline": {
120
+ "allOf": [
121
+ {
122
+ "$ref": "#/$defs/safeString"
123
+ },
124
+ {
125
+ "minLength": 1
126
+ }
127
+ ]
128
+ },
129
+ "test": {
130
+ "allOf": [
131
+ {
132
+ "$ref": "#/$defs/safeString"
133
+ },
134
+ {
135
+ "minLength": 1
136
+ }
137
+ ]
138
+ },
139
+ "typecheck": {
140
+ "$ref": "#/$defs/nullableNonEmptySafeString"
141
+ },
142
+ "formatCheck": {
143
+ "allOf": [
144
+ {
145
+ "$ref": "#/$defs/safeString"
146
+ },
147
+ {
148
+ "minLength": 1
149
+ }
150
+ ]
151
+ },
152
+ "formatWrite": {
153
+ "allOf": [
154
+ {
155
+ "$ref": "#/$defs/safeString"
156
+ },
157
+ {
158
+ "minLength": 1
159
+ }
160
+ ]
161
+ }
162
+ },
163
+ "additionalProperties": false
164
+ },
165
+ "project": {
166
+ "type": "object",
167
+ "required": ["paths"],
168
+ "properties": {
169
+ "baseBranch": {
170
+ "$ref": "#/$defs/safeString"
171
+ },
172
+ "paths": {
173
+ "$ref": "#/$defs/paths"
174
+ },
175
+ "docsContextFiles": {
176
+ "type": "array",
177
+ "items": {
178
+ "type": "string"
179
+ }
180
+ },
181
+ "commands": {
182
+ "$ref": "#/$defs/commands"
183
+ }
184
+ },
185
+ "additionalProperties": false
186
+ },
187
+ "branchProtectionCheck": {
188
+ "type": "object",
189
+ "required": ["name", "cmd"],
190
+ "properties": {
191
+ "name": {
192
+ "type": "string",
193
+ "minLength": 1
194
+ },
195
+ "cmd": {
196
+ "type": "array",
197
+ "minItems": 1,
198
+ "items": {
199
+ "type": "string",
200
+ "minLength": 1
201
+ }
202
+ }
203
+ },
204
+ "additionalProperties": false
205
+ },
206
+ "branchProtection": {
207
+ "type": "object",
208
+ "properties": {
209
+ "enforce": {
210
+ "type": "boolean"
211
+ },
212
+ "requiredChecks": {
213
+ "type": "array",
214
+ "items": {
215
+ "$ref": "#/$defs/branchProtectionCheck"
216
+ }
217
+ }
218
+ },
219
+ "additionalProperties": false
220
+ },
221
+ "mergeMethods": {
222
+ "type": "object",
223
+ "properties": {
224
+ "allow_squash_merge": {
225
+ "type": "boolean"
226
+ },
227
+ "allow_rebase_merge": {
228
+ "type": "boolean"
229
+ },
230
+ "allow_merge_commit": {
231
+ "type": "boolean"
232
+ },
233
+ "allow_auto_merge": {
234
+ "type": "boolean"
235
+ },
236
+ "delete_branch_on_merge": {
237
+ "type": "boolean"
238
+ }
239
+ },
240
+ "additionalProperties": false
241
+ },
242
+ "notifications": {
243
+ "type": "object",
244
+ "properties": {
245
+ "mentionOperator": {
246
+ "type": "boolean"
247
+ },
248
+ "commentEvents": {
249
+ "type": "array",
250
+ "items": {
251
+ "type": "string",
252
+ "enum": ["state-transition", "story-merged", "operator-message"]
253
+ },
254
+ "uniqueItems": true
255
+ },
256
+ "webhookEvents": {
257
+ "type": "array",
258
+ "items": {
259
+ "type": "string",
260
+ "enum": [
261
+ "epic-started",
262
+ "epic-progress",
263
+ "epic-blocked",
264
+ "epic-unblocked",
265
+ "epic-complete"
266
+ ]
267
+ },
268
+ "uniqueItems": true
269
+ }
270
+ },
271
+ "additionalProperties": false
272
+ },
273
+ "github": {
274
+ "type": "object",
275
+ "required": ["owner", "repo", "operatorHandle"],
276
+ "properties": {
277
+ "owner": {
278
+ "type": "string",
279
+ "minLength": 1
280
+ },
281
+ "repo": {
282
+ "type": "string",
283
+ "minLength": 1
284
+ },
285
+ "projectNumber": {
286
+ "type": ["integer", "null"],
287
+ "minimum": 1
288
+ },
289
+ "projectOwner": {
290
+ "type": ["string", "null"],
291
+ "minLength": 1
292
+ },
293
+ "operatorHandle": {
294
+ "type": "string",
295
+ "pattern": "^@.+"
296
+ },
297
+ "defaultTimeoutMs": {
298
+ "type": "integer",
299
+ "minimum": 1000,
300
+ "description": "Default `timeoutMs` (in milliseconds) applied to every `gh` subprocess spawned by the GitHub provider facade. Caps any single `gh api` / `gh issue ...` / `gh pr ...` invocation so a stalled TCP socket or long-poll cannot hang an orchestration indefinitely. A `GhExecTimeoutError` from a hit ceiling is classified `transient` and retried by `withTransientRetry`. Recommended floor 1000ms; recommended default 60000 (60s). Omit to use the in-code default of 60000. Story #2860."
301
+ },
302
+ "branchProtection": {
303
+ "$ref": "#/$defs/branchProtection"
304
+ },
305
+ "mergeMethods": {
306
+ "$ref": "#/$defs/mergeMethods"
307
+ },
308
+ "notifications": {
309
+ "$ref": "#/$defs/notifications"
310
+ }
311
+ },
312
+ "additionalProperties": false
313
+ },
314
+ "planningContext": {
315
+ "type": "object",
316
+ "properties": {
317
+ "maxBytes": {
318
+ "type": "integer",
319
+ "minimum": 1024
320
+ },
321
+ "summaryMode": {
322
+ "type": "string",
323
+ "enum": ["auto", "always", "never"]
324
+ }
325
+ },
326
+ "additionalProperties": false
327
+ },
328
+ "taskSizing": {
329
+ "type": "object",
330
+ "description": "Story-sizing thresholds consumed by ticket-validator-sizing.js. Operator overrides shallow-merge with DEFAULT_TASK_SIZING defaults. Story #3760 collapsed the per-profile matrix and the parallel testSurface axis into a flat set of knobs; the sizingProfile enum was replaced by an optional body-level `wide` declaration that lifts the hardFiles rejection. Story #3874 cut over to one uniform relaxed profile sized for capability slices a frontier model delivers and self-verifies in one pass.",
331
+ "properties": {
332
+ "softFiles": {
333
+ "type": "integer",
334
+ "minimum": 1,
335
+ "description": "File-count soft-warn threshold above which a typical-Story width finding fires (default 8)."
336
+ },
337
+ "hardFiles": {
338
+ "type": "integer",
339
+ "minimum": 1,
340
+ "description": "File-count hard ceiling: a Story exceeding it is rejected unless it declares `wide` with a reason (default 30)."
341
+ },
342
+ "maxAcceptance": {
343
+ "type": "integer",
344
+ "minimum": 1,
345
+ "description": "Hard ceiling on acceptance[] item count (default 14)."
346
+ },
347
+ "softAcceptanceCount": {
348
+ "type": "integer",
349
+ "minimum": 1,
350
+ "description": "Soft-warn threshold on acceptance[] item count (default 10)."
351
+ }
352
+ },
353
+ "additionalProperties": false
354
+ },
355
+ "planning": {
356
+ "type": "object",
357
+ "properties": {
358
+ "riskHeuristics": {
359
+ "$ref": "#/$defs/listOrExtenderOfStrings"
360
+ },
361
+ "maxTickets": {
362
+ "type": "integer",
363
+ "minimum": 1
364
+ },
365
+ "context": {
366
+ "$ref": "#/$defs/planningContext"
367
+ },
368
+ "codebaseSnapshot": {
369
+ "$ref": "#/$defs/codebaseSnapshot"
370
+ },
371
+ "taskSizing": {
372
+ "$ref": "#/$defs/taskSizing"
373
+ },
374
+ "failOnSharedEditors": {
375
+ "type": "boolean"
376
+ },
377
+ "requireExplicitCrossStoryDeps": {
378
+ "type": "boolean"
379
+ },
380
+ "failOnRegistryConflicts": {
381
+ "type": "boolean"
382
+ },
383
+ "failOnLargeFanOut": {
384
+ "type": "boolean"
385
+ },
386
+ "largeFanOutThreshold": {
387
+ "type": "integer",
388
+ "minimum": 0
389
+ },
390
+ "crossCuttingRegistries": {
391
+ "$ref": "#/$defs/listOrExtenderOfStrings"
392
+ }
393
+ },
394
+ "additionalProperties": false
395
+ },
396
+ "codebaseSnapshot": {
397
+ "type": "object",
398
+ "properties": {
399
+ "tier": {
400
+ "type": "string",
401
+ "enum": ["skinny", "medium"]
402
+ },
403
+ "include": {
404
+ "type": "array",
405
+ "items": {
406
+ "type": "string",
407
+ "minLength": 1
408
+ }
409
+ },
410
+ "exclude": {
411
+ "type": "array",
412
+ "items": {
413
+ "type": "string",
414
+ "minLength": 1
415
+ }
416
+ },
417
+ "recentCommitWindow": {
418
+ "type": "integer",
419
+ "minimum": 1
420
+ }
421
+ },
422
+ "additionalProperties": false
423
+ },
424
+ "execution": {
425
+ "type": "object",
426
+ "properties": {
427
+ "timeoutMs": {
428
+ "type": "integer",
429
+ "minimum": 1
430
+ }
431
+ },
432
+ "additionalProperties": false
433
+ },
434
+ "lease": {
435
+ "type": "object",
436
+ "description": "Story #3480 (Epic #3457). Assignee-as-lease primitive. ttlMs is the staleness window \u2014 a ticket claim whose owner has not emitted a story.heartbeat within this many milliseconds is reclaimable by another operator. Defaults to 900000 (15 min) in lib/config/limits.js.",
437
+ "properties": {
438
+ "ttlMs": {
439
+ "type": "integer",
440
+ "minimum": 1
441
+ }
442
+ },
443
+ "additionalProperties": false
444
+ },
445
+ "docsFreshness": {
446
+ "type": "object",
447
+ "properties": {
448
+ "paths": {
449
+ "type": "array",
450
+ "items": {
451
+ "allOf": [
452
+ {
453
+ "$ref": "#/$defs/safeString"
454
+ },
455
+ {
456
+ "minLength": 1
457
+ }
458
+ ]
459
+ }
460
+ }
461
+ },
462
+ "additionalProperties": false
463
+ },
464
+ "deliverRunner": {
465
+ "type": "object",
466
+ "properties": {
467
+ "concurrencyCap": {
468
+ "type": "integer",
469
+ "minimum": 1,
470
+ "description": "Maximum Stories dispatched in parallel within one wave. Default 3. Conservative by design \u2014 keeps host-quota consumption predictable on small waves and avoids GitHub API saturation. Operators running wide-wave Epics on hosts with adequate parallel-agent quota should raise this value to reduce wall-clock time proportionally. See epic-deliver.md \u00a7 Phase 2b for the dispatch model and the throughput tradeoff discussion."
471
+ },
472
+ "progressReportIntervalSec": {
473
+ "type": "integer",
474
+ "minimum": 0
475
+ },
476
+ "verifyConcurrencyCap": {
477
+ "type": "integer",
478
+ "minimum": 1,
479
+ "description": "Bounded-concurrency cap for the per-wave verifyWaveResults loop (Epic #3019 Tech Spec \u00a71.4). Separate from the wave-execution `concurrencyCap` so operators can tune ticket-verification parallelism independently of Story dispatch parallelism. Default 4."
480
+ }
481
+ },
482
+ "additionalProperties": false
483
+ },
484
+ "retro": {
485
+ "type": "object",
486
+ "description": "Story #3042 (Epic #3019). Operator-tunable retro behaviour. Currently exposes `perfThresholds`, the gates the retro perf-signals classifier uses to decide which signals to surface in the `## Performance Signals` / `## Recommended Follow-Ons` retro sections.",
487
+ "properties": {
488
+ "perfThresholds": {
489
+ "type": "object",
490
+ "description": "Gates for `classifyPerfSignals` (lib/orchestration/retro-perf-heuristics.js). Defaults are 0.6 / 0.4 / 2.",
491
+ "properties": {
492
+ "utilisation": {
493
+ "type": "number",
494
+ "minimum": 0,
495
+ "maximum": 1,
496
+ "description": "Per-wave utilisation threshold. Waves whose `utilisation` is strictly below this value emit a `low-utilisation` signal. Default 0.6."
497
+ },
498
+ "bootstrapShare": {
499
+ "type": "number",
500
+ "minimum": 0,
501
+ "maximum": 1,
502
+ "description": "Maximum acceptable share of cumulative Story execution time spent in the story-init phase. When exceeded the retro emits a `high-bootstrap-share` signal. Default 0.4."
503
+ },
504
+ "capBindingRunLength": {
505
+ "type": "integer",
506
+ "minimum": 1,
507
+ "description": "Minimum run length of consecutive cap-binding waves before the retro emits a `cap-binding-run` signal. Default 2."
508
+ }
509
+ },
510
+ "additionalProperties": false
511
+ }
512
+ },
513
+ "additionalProperties": false
514
+ },
515
+ "epicAudit": {
516
+ "type": "object",
517
+ "properties": {
518
+ "maxFixAttempts": {
519
+ "type": "integer",
520
+ "minimum": 0,
521
+ "description": "Maximum auto-fix retry attempts per finding in /epic-deliver Phase 4 (epic-audit). 0 disables auto-fix. Default 3."
522
+ },
523
+ "maxFixScopeFiles": {
524
+ "type": "integer",
525
+ "minimum": 1,
526
+ "description": "Maximum file count a single auto-fix may modify before escalating to agent::blocked. Default 5."
527
+ }
528
+ },
529
+ "additionalProperties": false
530
+ },
531
+ "codeReview": {
532
+ "type": "object",
533
+ "properties": {
534
+ "provider": {
535
+ "type": "string",
536
+ "enum": ["native", "codex", "security-review"],
537
+ "default": "native",
538
+ "description": "Legacy single-adapter selection. ReviewProvider that produces the Finding[] consumed by runCodeReview(). Story #2833 registered `native` (in-process maintainability/lint); Story #2830 added `codex` (invokes `/codex:review` plugin); Story #2871 added `security-review` (shells out to `claude --print /security-review`). When `providers` (chain shape) is set this field is ignored with a warning. Selecting an adapter whose probe fails hard-fails at factory construction unless declared `optional: true` in the chain."
539
+ },
540
+ "providers": {
541
+ "type": "array",
542
+ "description": "Multi-provider chain (Story #2871). When set and non-empty, takes precedence over the legacy `provider` field. The orchestrator iterates inline entries in declaration order and merges their Finding[] before posting one structured comment; manual-prompt entries (e.g. ultrareview) contribute a trailing 'Manual review suggestions' section.",
543
+ "items": {
544
+ "type": "object",
545
+ "required": ["name"],
546
+ "properties": {
547
+ "name": {
548
+ "type": "string",
549
+ "enum": ["native", "codex", "security-review", "ultrareview"],
550
+ "description": "Registered provider key. Inline: native, codex, security-review. Manual-prompt: ultrareview."
551
+ },
552
+ "scopes": {
553
+ "type": "array",
554
+ "items": {
555
+ "type": "string",
556
+ "enum": ["story", "epic"]
557
+ },
558
+ "description": "Invocation scopes this entry fires on. Default (omitted) is both."
559
+ },
560
+ "optional": {
561
+ "type": "boolean",
562
+ "default": false,
563
+ "description": "When true, construction failure (host missing CLI/plugin) is logged and the entry is skipped instead of hard-failing the chain. Use for cross-runtime portability."
564
+ },
565
+ "manualPrompt": {
566
+ "type": "boolean",
567
+ "default": false,
568
+ "description": "When true, the entry is loaded from the manual-prompt registry: contributes a one-line operator suggestion via `renderPrompt()` instead of running a review via `runReview()`. Does not affect severity counts or `halted`."
569
+ },
570
+ "when": {
571
+ "type": "object",
572
+ "description": "Optional label-gated invocation predicate. Evaluated against the ticket's current labels at invocation time; when false, the entry is silently skipped for this run.",
573
+ "properties": {
574
+ "label": {
575
+ "type": "string",
576
+ "minLength": 1,
577
+ "description": "Single label that MUST be present on the ticket."
578
+ },
579
+ "labelAny": {
580
+ "type": "array",
581
+ "items": {
582
+ "type": "string",
583
+ "minLength": 1
584
+ },
585
+ "minItems": 1,
586
+ "description": "Run when ANY of the listed labels is present."
587
+ }
588
+ },
589
+ "additionalProperties": false
590
+ }
591
+ },
592
+ "additionalProperties": false
593
+ }
594
+ },
595
+ "providerConfig": {
596
+ "type": "object",
597
+ "additionalProperties": true,
598
+ "description": "Optional escape hatch for adapter-specific configuration. No documented keys in Epic #2815; reserved so future adapters can be configured without another schema migration."
599
+ },
600
+ "maxFixAttempts": {
601
+ "type": "integer",
602
+ "minimum": 0,
603
+ "description": "Maximum auto-fix retry attempts per finding in /epic-deliver Phase 5 (code-review). 0 disables auto-fix. Default 3."
604
+ },
605
+ "maxFixScopeFiles": {
606
+ "type": "integer",
607
+ "minimum": 1,
608
+ "description": "Maximum file count a single auto-fix may modify before escalating to agent::blocked. Default 5."
609
+ }
610
+ },
611
+ "additionalProperties": false
612
+ },
613
+ "worktreeIsolation": {
614
+ "type": "object",
615
+ "properties": {
616
+ "enabled": {
617
+ "type": "boolean"
618
+ },
619
+ "root": {
620
+ "type": "string",
621
+ "minLength": 1
622
+ },
623
+ "nodeModulesStrategy": {
624
+ "type": "string",
625
+ "enum": ["per-worktree", "symlink", "pnpm-store"]
626
+ },
627
+ "primeFromPath": {
628
+ "type": ["string", "null"],
629
+ "minLength": 1
630
+ },
631
+ "allowSymlinkOnWindows": {
632
+ "type": "boolean"
633
+ },
634
+ "reapOnSuccess": {
635
+ "type": "boolean"
636
+ },
637
+ "reapOnCancel": {
638
+ "type": "boolean"
639
+ },
640
+ "bootstrapFiles": {
641
+ "type": "array",
642
+ "items": {
643
+ "type": "string",
644
+ "minLength": 1
645
+ },
646
+ "default": [".env", ".mcp.json"]
647
+ }
648
+ },
649
+ "additionalProperties": false,
650
+ "allOf": [
651
+ {
652
+ "if": {
653
+ "properties": {
654
+ "enabled": {
655
+ "const": true
656
+ }
657
+ },
658
+ "required": ["enabled"]
659
+ },
660
+ "then": {
661
+ "required": ["root"]
662
+ }
663
+ }
664
+ ]
665
+ },
666
+ "signals": {
667
+ "type": "object",
668
+ "properties": {
669
+ "hotspot": {
670
+ "type": "object",
671
+ "properties": {
672
+ "p95Multiplier": {
673
+ "type": "number",
674
+ "minimum": 0
675
+ }
676
+ },
677
+ "additionalProperties": false
678
+ },
679
+ "rework": {
680
+ "type": "object",
681
+ "properties": {
682
+ "editsPerFile": {
683
+ "type": "integer",
684
+ "minimum": 1
685
+ }
686
+ },
687
+ "additionalProperties": false
688
+ },
689
+ "retry": {
690
+ "type": "object",
691
+ "properties": {
692
+ "repeatCount": {
693
+ "type": "integer",
694
+ "minimum": 1
695
+ }
696
+ },
697
+ "additionalProperties": false
698
+ }
699
+ },
700
+ "additionalProperties": false
701
+ },
702
+ "tolerance": {
703
+ "type": "object",
704
+ "required": ["kind", "value"],
705
+ "properties": {
706
+ "kind": {
707
+ "type": "string",
708
+ "enum": ["absolute", "percent"]
709
+ },
710
+ "value": {
711
+ "type": "number",
712
+ "minimum": 0
713
+ }
714
+ },
715
+ "additionalProperties": false
716
+ },
717
+ "floors": {
718
+ "type": "object",
719
+ "additionalProperties": {
720
+ "type": "object",
721
+ "additionalProperties": {
722
+ "type": "number"
723
+ }
724
+ }
725
+ },
726
+ "components": {
727
+ "type": "object",
728
+ "additionalProperties": {
729
+ "type": "array",
730
+ "items": {
731
+ "type": "string",
732
+ "minLength": 1
733
+ }
734
+ }
735
+ },
736
+ "lintGate": {
737
+ "type": "object",
738
+ "properties": {
739
+ "enabled": {
740
+ "type": "boolean"
741
+ },
742
+ "baselinePath": {
743
+ "allOf": [
744
+ {
745
+ "$ref": "#/$defs/safeString"
746
+ },
747
+ {
748
+ "minLength": 1
749
+ }
750
+ ]
751
+ },
752
+ "tolerance": {
753
+ "$ref": "#/$defs/tolerance"
754
+ },
755
+ "floors": {
756
+ "$ref": "#/$defs/floors"
757
+ },
758
+ "components": {
759
+ "$ref": "#/$defs/components"
760
+ }
761
+ },
762
+ "additionalProperties": false
763
+ },
764
+ "coverageGate": {
765
+ "type": "object",
766
+ "properties": {
767
+ "enabled": {
768
+ "type": "boolean"
769
+ },
770
+ "baselinePath": {
771
+ "allOf": [
772
+ {
773
+ "$ref": "#/$defs/safeString"
774
+ },
775
+ {
776
+ "minLength": 1
777
+ }
778
+ ]
779
+ },
780
+ "tolerance": {
781
+ "$ref": "#/$defs/tolerance"
782
+ },
783
+ "floors": {
784
+ "$ref": "#/$defs/floors"
785
+ },
786
+ "components": {
787
+ "$ref": "#/$defs/components"
788
+ },
789
+ "coveragePath": {
790
+ "allOf": [
791
+ {
792
+ "$ref": "#/$defs/safeString"
793
+ },
794
+ {
795
+ "minLength": 1
796
+ }
797
+ ]
798
+ },
799
+ "timeoutMs": {
800
+ "type": "integer",
801
+ "minimum": 1
802
+ }
803
+ },
804
+ "additionalProperties": false
805
+ },
806
+ "crapGate": {
807
+ "type": "object",
808
+ "properties": {
809
+ "enabled": {
810
+ "type": "boolean"
811
+ },
812
+ "baselinePath": {
813
+ "allOf": [
814
+ {
815
+ "$ref": "#/$defs/safeString"
816
+ },
817
+ {
818
+ "minLength": 1
819
+ }
820
+ ]
821
+ },
822
+ "tolerance": {
823
+ "$ref": "#/$defs/tolerance"
824
+ },
825
+ "floors": {
826
+ "$ref": "#/$defs/floors"
827
+ },
828
+ "components": {
829
+ "$ref": "#/$defs/components"
830
+ },
831
+ "targetDirs": {
832
+ "$ref": "#/$defs/listOrExtenderOfStrings",
833
+ "description": "Directories whose JS sources the CRAP gate scores. Mandrel ships a `src/`-centric default; projects whose executable code lives elsewhere (e.g. this repo's `.agents/scripts/`) override here. The framework default is intentionally not auto-discovered, so an override is the explicit, auditable signal."
834
+ },
835
+ "newMethodCeiling": {
836
+ "type": "integer",
837
+ "minimum": 1
838
+ },
839
+ "requireCoverage": {
840
+ "type": "boolean"
841
+ },
842
+ "friction": {
843
+ "type": "object",
844
+ "properties": {
845
+ "markerKey": {
846
+ "type": "string",
847
+ "minLength": 1
848
+ }
849
+ },
850
+ "additionalProperties": false
851
+ },
852
+ "refreshTag": {
853
+ "allOf": [
854
+ {
855
+ "$ref": "#/$defs/safeString"
856
+ },
857
+ {
858
+ "minLength": 1
859
+ }
860
+ ]
861
+ },
862
+ "refreshTimeoutMs": {
863
+ "type": "integer",
864
+ "minimum": 1,
865
+ "description": "Bounded timeout (ms) for `npm run crap:update` spawned by the baseline-attribution refresh path. Mirrors `coverage.timeoutMs`: a SIGKILL fired at the budget boundary maps to exit 124 so the close orchestrator can flip the Story to `agent::blocked`. Default 60000 (Story #2165)."
866
+ },
867
+ "ignoreGlobs": {
868
+ "type": "array",
869
+ "items": {
870
+ "type": "string",
871
+ "minLength": 1
872
+ },
873
+ "description": "Minimatch glob patterns matched against the canonicalised repo-relative path of each discovered file. Files matching any pattern are excluded from CRAP discovery before scoring. Orthogonal to `components` (grouping) \u2014 a file excluded here never appears in any component bucket. Absent or empty preserves the existing IGNORED_DIRS-only behaviour (Story #3217)."
874
+ }
875
+ },
876
+ "additionalProperties": false
877
+ },
878
+ "maintainabilityGate": {
879
+ "type": "object",
880
+ "properties": {
881
+ "enabled": {
882
+ "type": "boolean"
883
+ },
884
+ "baselinePath": {
885
+ "allOf": [
886
+ {
887
+ "$ref": "#/$defs/safeString"
888
+ },
889
+ {
890
+ "minLength": 1
891
+ }
892
+ ]
893
+ },
894
+ "tolerance": {
895
+ "$ref": "#/$defs/tolerance"
896
+ },
897
+ "floors": {
898
+ "$ref": "#/$defs/floors"
899
+ },
900
+ "components": {
901
+ "$ref": "#/$defs/components"
902
+ },
903
+ "targetDirs": {
904
+ "$ref": "#/$defs/listOrExtenderOfStrings",
905
+ "description": "Directories whose JS sources the maintainability gate scores. Mandrel ships a `src/`-centric default; projects whose executable code lives elsewhere (e.g. this repo's `.agents/scripts/` plus `tests/`) override here. The framework default is intentionally not auto-discovered, so an override is the explicit, auditable signal."
906
+ },
907
+ "refreshTimeoutMs": {
908
+ "type": "integer",
909
+ "minimum": 1,
910
+ "description": "Bounded timeout (ms) for `npm run maintainability:update` spawned by the baseline-attribution refresh path. Mirrors `coverage.timeoutMs`: a SIGKILL fired at the budget boundary maps to exit 124 so the close orchestrator can flip the Story to `agent::blocked`. Default 60000 (Story #2165)."
911
+ },
912
+ "ignoreGlobs": {
913
+ "type": "array",
914
+ "items": {
915
+ "type": "string",
916
+ "minLength": 1
917
+ },
918
+ "description": "Minimatch glob patterns matched against the canonicalised repo-relative path of each discovered file. Files matching any pattern are excluded from MI discovery before scoring. Orthogonal to `components` (grouping) \u2014 a file excluded here never appears in any component bucket. Absent or empty preserves the existing IGNORED_DIRS-only behaviour (Story #3217)."
919
+ }
920
+ },
921
+ "additionalProperties": false
922
+ },
923
+ "mutationGate": {
924
+ "type": "object",
925
+ "properties": {
926
+ "enabled": {
927
+ "type": "boolean"
928
+ },
929
+ "baselinePath": {
930
+ "allOf": [
931
+ {
932
+ "$ref": "#/$defs/safeString"
933
+ },
934
+ {
935
+ "minLength": 1
936
+ }
937
+ ]
938
+ },
939
+ "tolerance": {
940
+ "$ref": "#/$defs/tolerance"
941
+ },
942
+ "floors": {
943
+ "$ref": "#/$defs/floors"
944
+ },
945
+ "components": {
946
+ "$ref": "#/$defs/components"
947
+ },
948
+ "strykerConfigPath": {
949
+ "$ref": "#/$defs/nullableNonEmptySafeString"
950
+ }
951
+ },
952
+ "additionalProperties": false
953
+ },
954
+ "lighthouseRoute": {
955
+ "type": "object",
956
+ "required": ["path"],
957
+ "properties": {
958
+ "path": {
959
+ "type": "string",
960
+ "minLength": 1
961
+ },
962
+ "formFactor": {
963
+ "type": "string",
964
+ "enum": ["mobile", "desktop"]
965
+ }
966
+ },
967
+ "additionalProperties": false
968
+ },
969
+ "lighthouseGate": {
970
+ "type": "object",
971
+ "properties": {
972
+ "enabled": {
973
+ "type": "boolean"
974
+ },
975
+ "baselinePath": {
976
+ "allOf": [
977
+ {
978
+ "$ref": "#/$defs/safeString"
979
+ },
980
+ {
981
+ "minLength": 1
982
+ }
983
+ ]
984
+ },
985
+ "tolerance": {
986
+ "$ref": "#/$defs/tolerance"
987
+ },
988
+ "floors": {
989
+ "$ref": "#/$defs/floors"
990
+ },
991
+ "components": {
992
+ "$ref": "#/$defs/components"
993
+ },
994
+ "baseUrl": {
995
+ "$ref": "#/$defs/nullableNonEmptySafeString"
996
+ },
997
+ "routes": {
998
+ "type": "array",
999
+ "items": {
1000
+ "$ref": "#/$defs/lighthouseRoute"
1001
+ }
1002
+ }
1003
+ },
1004
+ "additionalProperties": false
1005
+ },
1006
+ "bundleDeclaration": {
1007
+ "type": "object",
1008
+ "required": ["name", "path", "limit"],
1009
+ "properties": {
1010
+ "name": {
1011
+ "type": "string",
1012
+ "minLength": 1
1013
+ },
1014
+ "path": {
1015
+ "type": "string",
1016
+ "minLength": 1
1017
+ },
1018
+ "limit": {
1019
+ "type": "string",
1020
+ "minLength": 1
1021
+ }
1022
+ },
1023
+ "additionalProperties": false
1024
+ },
1025
+ "bundleSizeGate": {
1026
+ "type": "object",
1027
+ "properties": {
1028
+ "enabled": {
1029
+ "type": "boolean"
1030
+ },
1031
+ "baselinePath": {
1032
+ "allOf": [
1033
+ {
1034
+ "$ref": "#/$defs/safeString"
1035
+ },
1036
+ {
1037
+ "minLength": 1
1038
+ }
1039
+ ]
1040
+ },
1041
+ "tolerance": {
1042
+ "$ref": "#/$defs/tolerance"
1043
+ },
1044
+ "floors": {
1045
+ "$ref": "#/$defs/floors"
1046
+ },
1047
+ "components": {
1048
+ "$ref": "#/$defs/components"
1049
+ },
1050
+ "bundles": {
1051
+ "type": "array",
1052
+ "items": {
1053
+ "$ref": "#/$defs/bundleDeclaration"
1054
+ }
1055
+ }
1056
+ },
1057
+ "additionalProperties": false
1058
+ },
1059
+ "duplicationGate": {
1060
+ "type": "object",
1061
+ "properties": {
1062
+ "enabled": {
1063
+ "type": "boolean"
1064
+ },
1065
+ "baselinePath": {
1066
+ "allOf": [
1067
+ {
1068
+ "$ref": "#/$defs/safeString"
1069
+ },
1070
+ {
1071
+ "minLength": 1
1072
+ }
1073
+ ]
1074
+ },
1075
+ "tolerance": {
1076
+ "$ref": "#/$defs/tolerance"
1077
+ },
1078
+ "floors": {
1079
+ "$ref": "#/$defs/floors"
1080
+ },
1081
+ "components": {
1082
+ "$ref": "#/$defs/components"
1083
+ },
1084
+ "targetDirs": {
1085
+ "$ref": "#/$defs/listOrExtenderOfStrings",
1086
+ "description": "Directories whose JS sources the duplication (DRY) gate scans for copy-paste clones. Mandrel ships a `src/`-centric default; projects whose executable code lives elsewhere (e.g. this repo's `.agents/scripts/`) override here. The framework default is intentionally not auto-discovered, so an override is the explicit, auditable signal (Story #3664)."
1087
+ },
1088
+ "refreshTimeoutMs": {
1089
+ "type": "integer",
1090
+ "minimum": 1,
1091
+ "description": "Bounded timeout (ms) for `npm run duplication:update` spawned by the baseline-attribution refresh path. Mirrors `crap.refreshTimeoutMs` / `coverage.timeoutMs`: a SIGKILL fired at the budget boundary maps to exit 124. Default 60000 (Story #3664)."
1092
+ },
1093
+ "ignoreGlobs": {
1094
+ "type": "array",
1095
+ "items": {
1096
+ "type": "string",
1097
+ "minLength": 1
1098
+ },
1099
+ "description": "Minimatch glob patterns matched against the canonicalised repo-relative path of each discovered file. Files matching any pattern are excluded from duplication discovery before scanning. Orthogonal to `components` (grouping). Absent or empty preserves the existing behaviour (Story #3664)."
1100
+ }
1101
+ },
1102
+ "additionalProperties": false
1103
+ },
1104
+ "gates": {
1105
+ "type": "object",
1106
+ "properties": {
1107
+ "lint": {
1108
+ "$ref": "#/$defs/lintGate"
1109
+ },
1110
+ "coverage": {
1111
+ "$ref": "#/$defs/coverageGate"
1112
+ },
1113
+ "crap": {
1114
+ "$ref": "#/$defs/crapGate"
1115
+ },
1116
+ "maintainability": {
1117
+ "$ref": "#/$defs/maintainabilityGate"
1118
+ },
1119
+ "mutation": {
1120
+ "$ref": "#/$defs/mutationGate"
1121
+ },
1122
+ "lighthouse": {
1123
+ "$ref": "#/$defs/lighthouseGate"
1124
+ },
1125
+ "bundle-size": {
1126
+ "$ref": "#/$defs/bundleSizeGate"
1127
+ },
1128
+ "duplication": {
1129
+ "$ref": "#/$defs/duplicationGate"
1130
+ }
1131
+ },
1132
+ "additionalProperties": false
1133
+ },
1134
+ "codingGuardrails": {
1135
+ "type": "object",
1136
+ "properties": {
1137
+ "cyclomaticFlag": {
1138
+ "type": "integer",
1139
+ "minimum": 1
1140
+ },
1141
+ "cyclomaticMustFix": {
1142
+ "type": "integer",
1143
+ "minimum": 1
1144
+ },
1145
+ "miDropMustRefactor": {
1146
+ "type": "number",
1147
+ "minimum": 0
1148
+ },
1149
+ "requireSiblingTest": {
1150
+ "type": "boolean"
1151
+ }
1152
+ },
1153
+ "additionalProperties": false
1154
+ },
1155
+ "autoRefresh": {
1156
+ "type": "object",
1157
+ "properties": {
1158
+ "enabled": {
1159
+ "type": "boolean"
1160
+ },
1161
+ "miDropCap": {
1162
+ "type": "number",
1163
+ "minimum": 0
1164
+ },
1165
+ "crapJumpCap": {
1166
+ "type": "number",
1167
+ "minimum": 0
1168
+ },
1169
+ "scope": {
1170
+ "type": "string",
1171
+ "enum": ["diff", "full"]
1172
+ }
1173
+ },
1174
+ "additionalProperties": false
1175
+ },
1176
+ "baselineEpsilon": {
1177
+ "type": "object",
1178
+ "description": "Per-kind epsilon for s-stability-epsilon (Story #1964). Sub-epsilon row deltas resolve to prior bytes so env variance does not rewrite the on-disk baseline.",
1179
+ "properties": {
1180
+ "maintainability": {
1181
+ "type": "number",
1182
+ "minimum": 0
1183
+ },
1184
+ "crap": {
1185
+ "type": "number",
1186
+ "minimum": 0
1187
+ },
1188
+ "coverage": {
1189
+ "type": "number",
1190
+ "minimum": 0
1191
+ },
1192
+ "mutation": {
1193
+ "type": "number",
1194
+ "minimum": 0
1195
+ },
1196
+ "lint": {
1197
+ "type": "number",
1198
+ "minimum": 0
1199
+ },
1200
+ "lighthouse": {
1201
+ "type": "number",
1202
+ "minimum": 0
1203
+ },
1204
+ "bundle-size": {
1205
+ "type": "number",
1206
+ "minimum": 0
1207
+ },
1208
+ "duplication": {
1209
+ "type": "number",
1210
+ "minimum": 0
1211
+ }
1212
+ },
1213
+ "additionalProperties": false
1214
+ },
1215
+ "gateScoping": {
1216
+ "type": "object",
1217
+ "properties": {
1218
+ "scope": {
1219
+ "type": "string",
1220
+ "enum": ["diff", "full"]
1221
+ },
1222
+ "diffRef": {
1223
+ "type": "string",
1224
+ "minLength": 1
1225
+ }
1226
+ },
1227
+ "additionalProperties": false
1228
+ },
1229
+ "formatAutofix": {
1230
+ "type": "object",
1231
+ "description": "Bounded-timeout knob for the close-time `npx biome format --write` spawn (Story #2165). A SIGKILL fired at the budget boundary maps to exit 124 so the close orchestrator can flip the Story to `agent::blocked` with a friction comment.",
1232
+ "properties": {
1233
+ "timeoutMs": {
1234
+ "type": "integer",
1235
+ "minimum": 1
1236
+ }
1237
+ },
1238
+ "additionalProperties": false
1239
+ },
1240
+ "lifecycle": {
1241
+ "type": "object",
1242
+ "description": "Knobs consumed by the lifecycle event bus (Epic #2172). `timeouts` is a per-event budget map (eventName \u2192 seconds) used by `TimeoutWatchdog`; missing entries fall back to in-listener defaults. `heartbeatWarnSeconds` is the no-progress threshold consumed by `HeartbeatMonitor`. Story #2227 lays down the keys; consumers land in later stories.",
1243
+ "properties": {
1244
+ "timeouts": {
1245
+ "type": "object",
1246
+ "additionalProperties": {
1247
+ "type": "integer",
1248
+ "minimum": 1
1249
+ }
1250
+ },
1251
+ "heartbeatWarnSeconds": {
1252
+ "type": "integer",
1253
+ "minimum": 1
1254
+ }
1255
+ },
1256
+ "additionalProperties": false
1257
+ },
1258
+ "mergeWatch": {
1259
+ "type": "object",
1260
+ "description": "Knobs consumed by the MergeWatcher lifecycle listener (Story #2896, Epic #2880). `intervalSeconds` is the poll cadence between `gh pr view --json mergeCommit,mergedAt` probes after epic.merge.armed; `maxBudgetSeconds` is the total wall-clock budget before the watcher surfaces `agent::blocked` with reason `budget-exceeded`.",
1261
+ "properties": {
1262
+ "intervalSeconds": {
1263
+ "type": "integer",
1264
+ "minimum": 1,
1265
+ "default": 30,
1266
+ "description": "Seconds between MergeWatcher polls. Default 30."
1267
+ },
1268
+ "maxBudgetSeconds": {
1269
+ "type": "integer",
1270
+ "minimum": 1,
1271
+ "default": 3600,
1272
+ "description": "Total wall-clock budget (seconds) for the MergeWatcher poll loop. Default 3600 (60 minutes)."
1273
+ }
1274
+ },
1275
+ "additionalProperties": false
1276
+ },
1277
+ "quality": {
1278
+ "type": "object",
1279
+ "properties": {
1280
+ "gateScoping": {
1281
+ "$ref": "#/$defs/gateScoping"
1282
+ },
1283
+ "gates": {
1284
+ "$ref": "#/$defs/gates"
1285
+ },
1286
+ "formatAutofix": {
1287
+ "$ref": "#/$defs/formatAutofix"
1288
+ },
1289
+ "codingGuardrails": {
1290
+ "$ref": "#/$defs/codingGuardrails"
1291
+ },
1292
+ "autoRefresh": {
1293
+ "$ref": "#/$defs/autoRefresh"
1294
+ },
1295
+ "baselineEpsilon": {
1296
+ "$ref": "#/$defs/baselineEpsilon"
1297
+ }
1298
+ },
1299
+ "additionalProperties": false
1300
+ },
1301
+ "refactorStage": {
1302
+ "type": "object",
1303
+ "description": "Opt-in, config-gated post-green refactor checkpoint wired into story-deliver (Story #3430, Epic #3418). Strictly additive and default-OFF: when disabled, story-deliver behaves exactly as before. Advisory only \u2014 never changes existing close-validation gate semantics.",
1304
+ "properties": {
1305
+ "enabled": {
1306
+ "type": "boolean",
1307
+ "default": false,
1308
+ "description": "When true, story-deliver runs an advisory post-green refactor stage (refactorer persona + core/refactoring-discipline skill) after the suite is green. Default false \u2014 when unset the stage is skipped and close-validation gate semantics are unchanged."
1309
+ }
1310
+ },
1311
+ "additionalProperties": false
1312
+ },
1313
+ "acceptanceEval": {
1314
+ "type": "object",
1315
+ "description": "Story #3819. Bounded per-Story acceptance self-eval loop. After the implementation commits land and before the Story-implementation phase flips to `closing`, an independent (fresh-context) critic pass scores the working diff against each inline `acceptance[]` item, redrafts the unmet items, and re-evaluates \u2014 capped at `maxRounds` redraft rounds, then escalates to `agent::blocked` when criteria remain unmet. There is no `enabled` flag: the loop is a hard cutover (always on).",
1316
+ "properties": {
1317
+ "maxRounds": {
1318
+ "type": "integer",
1319
+ "minimum": 1,
1320
+ "description": "Maximum number of redraft rounds before escalation. Default 2; clamped into [1, hard ceiling] by lib/config/acceptance-eval.js so the cap can never be disabled (maxRounds: 0 clamps up to 1)."
1321
+ }
1322
+ },
1323
+ "additionalProperties": false
1324
+ },
1325
+ "delivery": {
1326
+ "type": "object",
1327
+ "properties": {
1328
+ "execution": {
1329
+ "$ref": "#/$defs/execution"
1330
+ },
1331
+ "maxTokenBudget": {
1332
+ "type": "integer",
1333
+ "minimum": 1
1334
+ },
1335
+ "lease": {
1336
+ "$ref": "#/$defs/lease"
1337
+ },
1338
+ "docsFreshness": {
1339
+ "$ref": "#/$defs/docsFreshness"
1340
+ },
1341
+ "deliverRunner": {
1342
+ "$ref": "#/$defs/deliverRunner"
1343
+ },
1344
+ "worktreeIsolation": {
1345
+ "$ref": "#/$defs/worktreeIsolation"
1346
+ },
1347
+ "signals": {
1348
+ "$ref": "#/$defs/signals"
1349
+ },
1350
+ "quality": {
1351
+ "$ref": "#/$defs/quality"
1352
+ },
1353
+ "lifecycle": {
1354
+ "$ref": "#/$defs/lifecycle"
1355
+ },
1356
+ "mergeWatch": {
1357
+ "$ref": "#/$defs/mergeWatch"
1358
+ },
1359
+ "epicAudit": {
1360
+ "$ref": "#/$defs/epicAudit"
1361
+ },
1362
+ "codeReview": {
1363
+ "$ref": "#/$defs/codeReview"
1364
+ },
1365
+ "retro": {
1366
+ "$ref": "#/$defs/retro"
1367
+ },
1368
+ "refactorStage": {
1369
+ "$ref": "#/$defs/refactorStage"
1370
+ },
1371
+ "acceptanceEval": {
1372
+ "$ref": "#/$defs/acceptanceEval"
1373
+ },
1374
+ "ci": {
1375
+ "type": "object",
1376
+ "properties": {
1377
+ "skipForStoryPushes": {
1378
+ "type": "boolean",
1379
+ "description": "Story #2899 (Epic #2880, F13). When true (default), pre-push tooling appends a '[skip ci]' trailer to Story-branch commit subjects so intermediate pushes do not stampede the CI fleet. The Epic-branch merge commit produced by story-close.js never carries the marker, regardless of this flag."
1380
+ }
1381
+ },
1382
+ "additionalProperties": false
1383
+ },
1384
+ "preflight": {
1385
+ "type": "object",
1386
+ "description": "Story #2899 (Epic #2880, F13). Thresholds consumed by `.agents/scripts/epic-deliver-preflight.js`. When any value is exceeded the preflight envelope flags a breach and /epic-deliver Phase 1 surfaces it via agent::blocked.",
1387
+ "properties": {
1388
+ "maxStories": {
1389
+ "type": "integer",
1390
+ "minimum": 1
1391
+ },
1392
+ "maxWaves": {
1393
+ "type": "integer",
1394
+ "minimum": 1
1395
+ },
1396
+ "maxInstallCostSeconds": {
1397
+ "type": "integer",
1398
+ "minimum": 1
1399
+ },
1400
+ "maxGithubApiRequests": {
1401
+ "type": "integer",
1402
+ "minimum": 1
1403
+ },
1404
+ "maxClaudeQuotaTokens": {
1405
+ "type": "integer",
1406
+ "minimum": 1
1407
+ }
1408
+ },
1409
+ "additionalProperties": false
1410
+ },
1411
+ "failOnConcurrencyHazards": {
1412
+ "type": "boolean"
1413
+ },
1414
+ "feedbackLoop": {
1415
+ "type": "object",
1416
+ "properties": {
1417
+ "codeReviewAutoFile": {
1418
+ "type": "boolean",
1419
+ "default": true,
1420
+ "description": "When true (default), the Epic finalize listener auto-files non-blocking code-review findings as follow-up issues routed by source classification. Set to false to suppress auto-filing; findings remain accessible in the structured comments on the Epic."
1421
+ },
1422
+ "auditResultsAutoFile": {
1423
+ "type": "boolean",
1424
+ "default": true,
1425
+ "description": "When true (default), the Epic finalize listener auto-files non-blocking audit-results findings as follow-up issues routed by source classification. Set to false to suppress auto-filing; findings remain accessible in the structured comments on the Epic."
1426
+ }
1427
+ },
1428
+ "additionalProperties": false
1429
+ }
1430
+ },
1431
+ "additionalProperties": false
1432
+ },
1433
+ "qaSignInSeam": {
1434
+ "oneOf": [
1435
+ {
1436
+ "type": "object",
1437
+ "required": ["urlTemplate"],
1438
+ "additionalProperties": false,
1439
+ "properties": {
1440
+ "urlTemplate": {
1441
+ "allOf": [
1442
+ {
1443
+ "$ref": "#/$defs/safeString"
1444
+ },
1445
+ {
1446
+ "minLength": 1
1447
+ }
1448
+ ]
1449
+ }
1450
+ }
1451
+ },
1452
+ {
1453
+ "type": "object",
1454
+ "required": ["skill"],
1455
+ "additionalProperties": false,
1456
+ "properties": {
1457
+ "skill": {
1458
+ "allOf": [
1459
+ {
1460
+ "$ref": "#/$defs/safeString"
1461
+ },
1462
+ {
1463
+ "minLength": 1
1464
+ }
1465
+ ]
1466
+ }
1467
+ }
1468
+ }
1469
+ ]
1470
+ },
1471
+ "qaPersonas": {
1472
+ "description": "Personas the QA-harness sign-in seam accepts. Two accepted shapes: (1) a plain array of persona names \u2014 the honest shape for a `urlTemplate` dev-impersonation seam, where the persona name is the sole input the workflow consumes; (2) the object-map form keyed by persona name, where each entry carries per-persona auth material (`credentialRef` or `signInSkill`) consulted only under a `skill`/credential seam.",
1473
+ "oneOf": [
1474
+ {
1475
+ "type": "array",
1476
+ "minItems": 1,
1477
+ "items": {
1478
+ "allOf": [
1479
+ {
1480
+ "$ref": "#/$defs/safeString"
1481
+ },
1482
+ {
1483
+ "minLength": 1
1484
+ }
1485
+ ]
1486
+ }
1487
+ },
1488
+ {
1489
+ "type": "object",
1490
+ "minProperties": 1,
1491
+ "additionalProperties": {
1492
+ "oneOf": [
1493
+ {
1494
+ "type": "object",
1495
+ "required": ["credentialRef"],
1496
+ "additionalProperties": false,
1497
+ "properties": {
1498
+ "credentialRef": {
1499
+ "allOf": [
1500
+ {
1501
+ "$ref": "#/$defs/safeString"
1502
+ },
1503
+ {
1504
+ "minLength": 1
1505
+ }
1506
+ ]
1507
+ }
1508
+ }
1509
+ },
1510
+ {
1511
+ "type": "object",
1512
+ "required": ["signInSkill"],
1513
+ "additionalProperties": false,
1514
+ "properties": {
1515
+ "signInSkill": {
1516
+ "allOf": [
1517
+ {
1518
+ "$ref": "#/$defs/safeString"
1519
+ },
1520
+ {
1521
+ "minLength": 1
1522
+ }
1523
+ ]
1524
+ }
1525
+ }
1526
+ }
1527
+ ]
1528
+ }
1529
+ }
1530
+ ]
1531
+ },
1532
+ "qa": {
1533
+ "type": "object",
1534
+ "description": "Agent-driven QA harness contract (Epic #3214). Optional top-level block. All filesystem-pointer fields (featureRoot, fixturesManifest, designTokens) carry safeString guards rejecting shell-injection metacharacters. signInSeam is a url-template/skill union; personas resolve to a stored credential reference or a sign-in skill, never an inline secret.",
1535
+ "additionalProperties": false,
1536
+ "properties": {
1537
+ "featureRoot": {
1538
+ "allOf": [
1539
+ {
1540
+ "$ref": "#/$defs/safeString"
1541
+ },
1542
+ {
1543
+ "minLength": 1
1544
+ }
1545
+ ]
1546
+ },
1547
+ "fixturesManifest": {
1548
+ "allOf": [
1549
+ {
1550
+ "$ref": "#/$defs/safeString"
1551
+ },
1552
+ {
1553
+ "minLength": 1
1554
+ }
1555
+ ]
1556
+ },
1557
+ "signInSeam": {
1558
+ "$ref": "#/$defs/qaSignInSeam"
1559
+ },
1560
+ "personas": {
1561
+ "$ref": "#/$defs/qaPersonas"
1562
+ },
1563
+ "consoleAllowlist": {
1564
+ "type": "array",
1565
+ "items": {
1566
+ "type": "string",
1567
+ "minLength": 1
1568
+ }
1569
+ },
1570
+ "designTokens": {
1571
+ "allOf": [
1572
+ {
1573
+ "$ref": "#/$defs/safeString"
1574
+ },
1575
+ {
1576
+ "minLength": 1
1577
+ }
1578
+ ]
1579
+ }
1580
+ }
1581
+ }
1582
+ }
1583
+ }