mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,34 +1,8 @@
1
1
  /**
2
- * loop-health.js — read-only retro-scope check for the feedback-loop
3
- * substrate (Epic #4406 / Story #4419, the terminal slice).
4
- *
5
- * The original feedback-loop drift shipped silently because an empty
6
- * feedback report is indistinguishable from a healthy one. This standing
7
- * self-check closes that gap: at retro time it samples the on-disk signal
8
- * substrate the sibling Stories established and surfaces the two ways the
9
- * repaired loop can regress without anyone noticing:
10
- *
11
- * 1. **Schema-invalid signal lines.** It tails the most recent
12
- * {@link MAX_SAMPLE_LINES} lines of every `signals.ndjson` stream under
13
- * the run temp tree and validates each against the canonical
14
- * `signal-event.schema.json` (via `validateSignal`, the same validator
15
- * the writer uses — no hand-rolled drift).
16
- * 2. **Un-actioned retro proposals.** It reads the retro mirror
17
- * (`temp/run-<id>/retro.md`, Story #4418) and flags any actionable
18
- * "Proposed issues" item that carries neither a filed-issue reference
19
- * (`Filed: [#N](url)`) nor lives under the explicit "One-off /
20
- * discarded" record.
21
- *
22
- * Contract:
23
- * - Scope `retro`, `autoCorrect: 'refuse-and-print'` — read-only by
24
- * construction; the runner refuses `autoFix` under the retro scope.
25
- * - A clean substrate (valid lines, every proposal filed or
26
- * discarded) yields **zero findings**, preserving the compact retro
27
- * shape. Only when a concern is non-zero does `detect` return a single
28
- * combined finding naming every non-clean dimension.
29
- * - No new provider plumbing: `detect(state)` reads `state.cwd` from the
30
- * existing cwd-scoped checks-registry state, anchors it to the main
31
- * checkout root, and reads the temp tree directly.
2
+ * Read-only retro check for the feedback-loop substrate — an empty feedback
3
+ * report looks healthy, so this surfaces schema-invalid signal samples
4
+ * (validated with the writer's own validator) and actionable retro
5
+ * proposals neither filed nor discarded. A clean substrate yields no finding.
32
6
  */
33
7
 
34
8
  import { readdirSync, readFileSync, statSync } from 'node:fs';
@@ -37,18 +11,11 @@ import path from 'node:path';
37
11
  import { mainCheckoutRoot, tempRootFrom } from '../config/temp-paths.js';
38
12
  import { validateSignal } from '../observability/signal-validator.js';
39
13
 
40
- /**
41
- * Lines sampled from the tail of each `signals.ndjson` stream. The check is
42
- * a health probe, not an exhaustive audit — the most recent window is a
43
- * representative sample that keeps the read bounded on long streams.
44
- */
14
+ /** Tail window per stream: a bounded health probe, not an audit. */
45
15
  const MAX_SAMPLE_LINES = 200;
46
16
 
47
17
  /**
48
- * Locate the most-recently-touched `run-<id>` temp tree under
49
- * `<baseDir>/<tempRoot>` (the layout `lib/config/temp-paths.js` creates).
50
- * Returns `{ epicId, epicDir }` or `null` when no run temp tree exists (a
51
- * fresh checkout, or a context with no run in flight).
18
+ * Most-recently-touched `run-<id>` temp tree, or `null`.
52
19
  *
53
20
  * @param {string} baseDir The main checkout root.
54
21
  * @param {{ tempRoot?: string, fsImpl?: { readdirSync: typeof readdirSync, statSync: typeof statSync } }} [opts]
@@ -87,8 +54,7 @@ export function resolveEpicTempTree(
87
54
  }
88
55
 
89
56
  /**
90
- * Enumerate every `signals.ndjson` stream under an Epic temp tree: the
91
- * Epic-level wave-lifecycle stream plus each per-Story stream.
57
+ * The run-level stream plus each per-Story stream.
92
58
  *
93
59
  * @param {string} epicDir
94
60
  * @param {{ fsImpl?: { readdirSync: typeof readdirSync, statSync: typeof statSync } }} [opts]
@@ -123,9 +89,7 @@ export function findSignalStreams(epicDir, { fsImpl } = {}) {
123
89
  }
124
90
 
125
91
  /**
126
- * Tail `maxLines` of a single stream and count how many sampled lines fail
127
- * the canonical schema (a JSON parse failure counts as invalid). A missing
128
- * or unreadable stream contributes zero — absence is not invalidity.
92
+ * Unparseable lines count as invalid; an unreadable stream counts zero.
129
93
  *
130
94
  * @param {string} streamPath
131
95
  * @param {{ validate?: typeof validateSignal, maxLines?: number, readImpl?: typeof readFileSync }} [opts]
@@ -165,12 +129,8 @@ export function sampleStreamInvalidCount(
165
129
  }
166
130
 
167
131
  /**
168
- * Scan a retro mirror body for actionable proposals that were neither filed
169
- * nor discarded. An actionable proposal is a `- **Title**` item under a
170
- * `### Proposed issues` heading whose body carries a paste-ready
171
- * `gh issue create` stanza (the un-filed fallback) instead of a
172
- * `Filed: [#N](url)` reference. Discarded proposals live under the separate
173
- * "### One-off / discarded" heading and are never scanned here.
132
+ * Unfiled = a `### Proposed issues` item carrying a `gh issue create` stanza
133
+ * and no `Filed:` line. Discarded proposals sit under another heading.
174
134
  *
175
135
  * @param {string} retroText
176
136
  * @returns {string[]} Titles of unfiled actionable proposals.
@@ -211,9 +171,7 @@ export function scanRetroMirror(retroText) {
211
171
  }
212
172
 
213
173
  /**
214
- * Core detection: locate the Epic temp tree under `baseDir`, sample its
215
- * signal streams, and scan its retro mirror. Returns a single combined
216
- * finding when either dimension is non-clean, else `null`.
174
+ * One combined finding when either dimension is non-clean, else `null`.
217
175
  *
218
176
  * @param {string} baseDir
219
177
  * @param {{
@@ -1,34 +1,9 @@
1
1
  /**
2
- * checks/state.js — Scope-aware state assembler for the checks registry.
2
+ * Scope-aware, memoized state assembler for the checks registry: each scope
3
+ * probes only the keys its checks need.
3
4
  *
4
- * `assembleState({ scope })` returns the subset of environment/git/fs probes
5
- * that checks declared for the given scope actually need. The runner in
6
- * `index.js` filters the registry by `scope` first, then asks this module
7
- * for state; the per-scope projection keeps probe cost proportional to the
8
- * call site (e.g. `story-close` does not pay for `diagnose` probes, and
9
- * the `retro` consumer only probes inputs the retro-scoped checks need).
10
- *
11
- * Privacy contract:
12
- * - The `env` projection records **presence only** (`'set' | 'missing'`).
13
- * It must never return, log, or otherwise expose the value of any
14
- * environment variable. Specifically `GITHUB_TOKEN` and similarly
15
- * scoped secrets are reduced to a single `'set'` / `'missing'` string
16
- * before reaching the caller.
17
- * - The `fs` projection records the **existence** of bootstrap files
18
- * (`.env`, `.mcp.json`, `.worktrees/`); it does not read their contents.
19
- *
20
- * Memoization:
21
- * - Results are cached per-scope by a module-local `Map`. Repeated calls
22
- * with the same scope reuse the prior result without re-running any
23
- * probe (verifiable via a probe spy in unit tests).
24
- * - Different scopes get independent entries — they probe different keys
25
- * and must not share a cached object.
26
- * - `clearStateCache()` is exported for tests so a fresh probe matrix can
27
- * be observed without restarting the process.
28
- *
29
- * Probes are injectable for testing. Production callers omit the `probes`
30
- * option and get the real `git` / `fs` / `process.env` probes; tests pass
31
- * spy probes to assert call counts and shapes.
5
+ * Privacy contract: `env` records presence only (`'set' | 'missing'`), never a
6
+ * value; `fs` records existence only, never contents.
32
7
  */
33
8
 
34
9
  import { spawnSync } from 'node:child_process';
@@ -36,17 +11,11 @@ import { existsSync } from 'node:fs';
36
11
  import path from 'node:path';
37
12
 
38
13
  /**
39
- * Scope → declared keys. Each scope only assembles the state its checks
40
- * need. Adding a new scope (or extending an existing one) is a deliberate
41
- * edit here — checks should not silently grow the probe surface.
42
- *
43
- * Keys are namespaced by category (`git.*`, `fs.*`, `env.*`) so the probe
44
- * dispatcher can route them without re-parsing.
14
+ * Scope → probe keys (`git.*`, `fs.*`, `env.*`). Growing the probe surface is
15
+ * a deliberate edit here.
45
16
  *
46
17
  * @type {Record<string, readonly string[]>}
47
18
  */
48
- // Story-close probe surface: branch list + worktree set. Story #1289
49
- // introduced the `npm-test` alias.
50
19
  const STORY_CLOSE_KEYS = Object.freeze([
51
20
  'git.headRef',
52
21
  'git.localBranches',
@@ -73,33 +42,25 @@ const SCOPE_KEYS = Object.freeze({
73
42
  'fs.dotEnv',
74
43
  'fs.dotMcp',
75
44
  ]),
76
- // git.coreBare: core-bare-clean declares scope ['story-close', 'retro',
77
- // 'npm-test']; without the probe key its detect() reads undefined and the
78
- // retro leg is a silent no-op (#4580).
45
+ // core-bare-clean runs in retro; without git.coreBare its detect() is a
46
+ // silent no-op.
79
47
  retro: Object.freeze(['git.headRef', 'git.coreBare', 'fs.worktrees']),
80
48
  diagnose: DIAGNOSE_KEYS,
81
49
  });
82
50
 
83
51
  /**
84
- * Module-local cache. Keyed by `${scope}::${cwd}` so a test that swaps cwd
85
- * does not collide with a prior probe matrix.
52
+ * Keyed by `${scope}::${cwd}`.
86
53
  *
87
54
  * @type {Map<string, StateObject>}
88
55
  */
89
56
  const cache = new Map();
90
57
 
91
- /**
92
- * Clear the memoization cache. Tests call this between cases to observe a
93
- * fresh probe matrix without restarting the process.
94
- */
95
58
  export function clearStateCache() {
96
59
  cache.clear();
97
60
  }
98
61
 
99
62
  /**
100
- * Default git probe — `spawnSync` wrapper that never throws. A non-zero
101
- * exit is reported as `{ ok: false, stdout: '' }` so callers can treat the
102
- * absence of a ref as "missing" rather than crashing the probe assembly.
63
+ * Never throws; a failure reads as `{ ok: false }`.
103
64
  *
104
65
  * @param {string} cwd
105
66
  * @param {...string} args
@@ -114,8 +75,6 @@ function defaultGitProbe(cwd, ...args) {
114
75
  }
115
76
 
116
77
  /**
117
- * Default fs probe — `existsSync` wrapper. Never reads file contents.
118
- *
119
78
  * @param {string} absPath
120
79
  * @returns {boolean}
121
80
  */
@@ -124,9 +83,6 @@ function defaultFsProbe(absPath) {
124
83
  }
125
84
 
126
85
  /**
127
- * Default env probe — returns `'set' | 'missing'` for the named variable.
128
- * Never returns the value.
129
- *
130
86
  * @param {string} name
131
87
  * @returns {'set' | 'missing'}
132
88
  */
@@ -135,9 +91,6 @@ function defaultEnvProbe(name) {
135
91
  }
136
92
 
137
93
  /**
138
- * Probe the current HEAD ref (short / abbreviated form). Returns the branch
139
- * name, or `null` when git cannot resolve HEAD (detached / non-repo).
140
- *
141
94
  * @param {object} args
142
95
  * @param {string} args.cwd
143
96
  * @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
@@ -149,9 +102,6 @@ function probeHeadRef({ cwd, git }) {
149
102
  }
150
103
 
151
104
  /**
152
- * Split a newline-delimited `for-each-ref --format='%(refname:short)'`
153
- * payload into a trimmed, non-empty short-name list.
154
- *
155
105
  * @param {{ ok: boolean, stdout: string }} result
156
106
  * @returns {string[]}
157
107
  */
@@ -165,9 +115,6 @@ function parseBranchList(result) {
165
115
  }
166
116
 
167
117
  /**
168
- * Probe all local branches (`refs/heads/`), short-name form. Used by checks
169
- * that grep over the branch list for legacy naming patterns.
170
- *
171
118
  * @param {object} args
172
119
  * @param {string} args.cwd
173
120
  * @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
@@ -180,8 +127,6 @@ function probeLocalBranches({ cwd, git }) {
180
127
  }
181
128
 
182
129
  /**
183
- * Probe `core.bare`. Returns the config value, or `null` when unset.
184
- *
185
130
  * @param {object} args
186
131
  * @param {string} args.cwd
187
132
  * @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
@@ -193,11 +138,7 @@ function probeCoreBare({ cwd, git }) {
193
138
  }
194
139
 
195
140
  /**
196
- * Handler map keyed by git probe field name (the part after `git.`). Each
197
- * handler receives `{ cwd, git }` and returns the field's value.
198
- *
199
- * Story #3351: replaces the prior if/else ladder so each probe is
200
- * independently testable.
141
+ * Keyed by the field after `git.`.
201
142
  *
202
143
  * @type {Record<string, (ctx: { cwd: string, git: (cwd: string, ...args: string[]) => { ok: boolean, stdout: string } }) => unknown>}
203
144
  */
@@ -208,9 +149,6 @@ const GIT_PROBES = Object.freeze({
208
149
  });
209
150
 
210
151
  /**
211
- * Build the git projection for a key list by iterating the `GIT_PROBES`
212
- * handler map.
213
- *
214
152
  * @param {readonly string[]} keys
215
153
  * @param {string} cwd
216
154
  * @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} git
@@ -229,8 +167,6 @@ function probeGit(keys, cwd, git) {
229
167
  }
230
168
 
231
169
  /**
232
- * Build the fs projection for a key list.
233
- *
234
170
  * @param {readonly string[]} keys
235
171
  * @param {string} cwd
236
172
  * @param {(absPath: string) => boolean} fs
@@ -253,8 +189,6 @@ function probeFs(keys, cwd, fs) {
253
189
  }
254
190
 
255
191
  /**
256
- * Build the env projection for a key list. Presence only.
257
- *
258
192
  * @param {readonly string[]} keys
259
193
  * @param {(name: string) => 'set' | 'missing'} env
260
194
  * @returns {Record<string, 'set' | 'missing'>}
@@ -270,17 +204,13 @@ function probeEnv(keys, env) {
270
204
  }
271
205
 
272
206
  /**
273
- * Scope-aware state assembler. Returns a frozen state object with
274
- * `{ git, fs, env, scope }` projections populated only for the keys the
275
- * scope declares. Memoized per `(scope, cwd)`.
207
+ * Frozen state with projections for the scope's keys only; memoized per
208
+ * `(scope, cwd)` unless `probes` are injected.
276
209
  *
277
210
  * @param {object} [opts]
278
- * @param {string} [opts.scope] Required in practice — every consumer is
279
- * scope-specific. An undefined scope returns an empty projection (used
280
- * only by tests that want to verify the no-op path).
211
+ * @param {string} [opts.scope] Undefined yields an empty projection.
281
212
  * @param {string} [opts.cwd=process.cwd()]
282
- * @param {object} [opts.probes] Test injection — `{ git, fs, env }` spies.
283
- * Production callers omit this and get the default probes.
213
+ * @param {object} [opts.probes] `{ git, fs, env }` test spies.
284
214
  * @returns {StateObject}
285
215
  *
286
216
  * @typedef {object} StateObject
@@ -300,8 +230,7 @@ export function assembleState({ scope, cwd = process.cwd(), probes } = {}) {
300
230
  const envProbe = probes?.env ?? defaultEnvProbe;
301
231
  const gitProjection = probeGit(keys, cwd, gitProbe);
302
232
  const fsProjection = probeFs(keys, cwd, fsProbe);
303
- // Story #1289: `cwd` is surfaced so fs-scanning checks target the
304
- // worktree they were assembled for.
233
+ // `cwd` lets fs-scanning checks target the worktree they were assembled for.
305
234
  const state = Object.freeze({
306
235
  scope,
307
236
  cwd,
@@ -310,16 +239,12 @@ export function assembleState({ scope, cwd = process.cwd(), probes } = {}) {
310
239
  env: Object.freeze(probeEnv(keys, envProbe)),
311
240
  });
312
241
  if (!probes) {
313
- // Only memoize the default-probe path. Tests with injected spies want
314
- // to observe call counts on every invocation.
315
242
  cache.set(cacheKey, state);
316
243
  }
317
244
  return state;
318
245
  }
319
246
 
320
247
  /**
321
- * Expose the scope → key map for tests and `/diagnose --show-scope`.
322
- *
323
248
  * @returns {Record<string, readonly string[]>}
324
249
  */
325
250
  export function getScopeKeys() {
@@ -1,29 +1,8 @@
1
1
  /**
2
- * story-init-not-backgrounded — refuse-and-print check.
3
- *
4
- * Detects orchestration call sites that invoke `single-story-init.js` via
5
- * the Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
6
- * waiting on completion) instead of a synchronous Bash call with a
7
- * 10-minute timeout. This guards the failure mode where `Monitor`'s wait
8
- * is not equivalent to script exit — a sub-agent that exits during a
9
- * Monitor wait kills `single-story-init.js` mid-run, leaving a
10
- * half-initialized worktree.
11
- *
12
- * Scope: 'story-close', 'retro'. The check runs at every
13
- * preflight surface that has the opportunity to invoke Story init —
14
- * primarily `/mandrel-deliver`'s init step — and surfaces as a retro audit
15
- * signal if the failure mode resurfaces during a sprint.
16
- *
17
- * The check is `refuse-and-print`. Auto-rewriting an orchestration call
18
- * site would change runtime behavior on a script the operator may be
19
- * actively iterating on; the fixCommand prints the canonical
20
- * synchronous-call replacement pattern so they can apply it deliberately.
21
- *
22
- * Implementation note: we scan `.agents/` (markdown + js) for the
23
- * juxtaposition of a `story-init.js` reference (which also matches
24
- * `single-story-init.js` as a suffix) and a backgrounding token
25
- * (`run_in_background: true`, the literal `Monitor` tool name as a
26
- * fan-out target, or `&` shell backgrounding) within a small line window.
2
+ * Flags call sites that background `single-story-init.js` instead of calling
3
+ * it synchronously: a sub-agent exiting during a `Monitor` wait kills init
4
+ * mid-run and leaves a half-initialized worktree. Refuse-and-print, since
5
+ * rewriting a call site would change behaviour the operator may be editing.
27
6
  */
28
7
 
29
8
  import nodeFs from 'node:fs';
@@ -33,15 +12,8 @@ const SCAN_ROOT_DEFAULT = '.agents';
33
12
  const WINDOW_LINES = 20;
34
13
 
35
14
  /**
36
- * Backgrounding tokens. We only match shapes that are unambiguously
37
- * *invocation* syntax, never narrative prose like "do not use Monitor"
38
- * (which legitimately appears in docs warning against the antipattern).
39
- *
40
- * - `run_in_background: true` — Bash tool's backgrounding flag.
41
- * - `detached: true` — child_process.spawn options that detach the
42
- * subprocess from the parent's lifecycle, equivalent to backgrounding.
43
- * - `single-story-init.js &` — POSIX shell ampersand backgrounding
44
- * (the pattern matches the `story-init.js` suffix of both names).
15
+ * Invocation syntax only, never prose like "do not use Monitor" that docs
16
+ * legitimately carry.
45
17
  */
46
18
  const BACKGROUND_TOKENS = [
47
19
  /run_in_background\s*:\s*true/,
@@ -50,15 +22,6 @@ const BACKGROUND_TOKENS = [
50
22
  ];
51
23
 
52
24
  /**
53
- * Walk a directory recursively, yielding absolute file paths for `.js`
54
- * and `.md` sources. Skips `node_modules`, `.worktrees`, and directories
55
- * starting with `.git`.
56
- *
57
- * The optional final `fsImpl` parameter defaults to the real `node:fs`
58
- * (`.agents/rules/test-seams.md` rule 1) and is forwarded to the recursive
59
- * call rather than re-acquired there (rule 4), so a test drives the whole walk
60
- * through a plain stub object instead of module mocking (rule 5).
61
- *
62
25
  * @param {string} dir
63
26
  * @param {typeof nodeFs} [fsImpl]
64
27
  * @returns {string[]}
@@ -92,16 +55,7 @@ export function walkSources(dir, fsImpl = nodeFs) {
92
55
  }
93
56
 
94
57
  /**
95
- * For one file, return an array of `{ line, kind }` offences: every line
96
- * referencing `story-init.js` (including `single-story-init.js`) that has
97
- * a backgrounding token in the same ±WINDOW_LINES window.
98
- *
99
- * The check explicitly excludes the `single-story-init.js` file itself and
100
- * any dedicated check module (this file): the source-of-truth
101
- * implementation legitimately mentions itself.
102
- *
103
- * Pure: it is handed the already-read source, so it needs no filesystem seam
104
- * of its own.
58
+ * Every `story-init.js` line with a backgrounding token within ±WINDOW_LINES.
105
59
  *
106
60
  * @param {string} file
107
61
  * @param {string} src
@@ -109,11 +63,8 @@ export function walkSources(dir, fsImpl = nodeFs) {
109
63
  */
110
64
  export function scanFile(file, src) {
111
65
  const offences = [];
112
- // Don't flag the actual story-init script, self-references, or the
113
- // parallel-tooling helper — the helper documents both Rule 2
114
- // (run_in_background) and the story-init backgrounding anti-pattern in
115
- // adjacent bullets, which collides with the scanner's ±20-line window
116
- // even though there is no real invocation in the prose.
66
+ // Skip the script, this check, and parallel-tooling.md, whose adjacent
67
+ // prose bullets fall inside one window with no real invocation.
117
68
  const basename = path.basename(file);
118
69
  if (
119
70
  basename === 'single-story-init.js' ||
@@ -160,9 +111,7 @@ export default {
160
111
 
161
112
  /**
162
113
  * @param {{ cwd?: string, scanRoot?: string, scope?: string }} [state]
163
- * @param {typeof nodeFs} [fsImpl] Optional final filesystem seam; defaults
164
- * to the real `node:fs` (`.agents/rules/test-seams.md` rule 1) and is
165
- * forwarded to {@link walkSources} rather than re-acquired (rule 4).
114
+ * @param {typeof nodeFs} [fsImpl]
166
115
  */
167
116
  detect(state, fsImpl = nodeFs) {
168
117
  const cwd = state?.cwd ?? process.cwd();
@@ -1,43 +1,8 @@
1
1
  /**
2
- * subagent-agent-tool-required — supported-depth guard (refuse-and-print).
3
- *
4
- * Nested `Agent` dispatch from a sub-agent is **supported** on this Claude
5
- * Code build (verified depth 2, announced max depth 5 — Claude Code
6
- * 2.1.202, re-spiked 2026-07-08; see Epic #4385 / watch #2870). A level-1
7
- * sub-agent carries `Agent` in its primary toolset and can spawn a working
8
- * level-2 sub-agent. Declaring `Agent` in a sub-agent workflow is therefore
9
- * a legitimate design choice, **not** an automatic runtime failure.
10
- *
11
- * What this check guards is the one case that still fails: a fan-out whose
12
- * declared nesting depth exceeds the announced/supported ceiling. A dispatch
13
- * chain deeper than the harness supports will silently fail at runtime, so a
14
- * workflow that declares `Agent` together with a `nesting-depth` beyond the
15
- * ceiling is flagged as a blocker. A sub-agent that declares `Agent` at a
16
- * supported depth (the common case — an undeclared depth is treated as the
17
- * shallow level-1 fan-out) produces no finding.
18
- *
19
- * This inverts the historical guard (Story #4387): the check used to refuse
20
- * `Agent` in *any* sub-agent workflow on the now-false rationale that
21
- * sub-agents cannot dispatch. It no longer strips a real capability; it only
22
- * catches an over-deep fan-out. The self-healing surface is preserved — it is
23
- * re-scoped, not removed.
24
- *
25
- * Scope: 'retro'. Surfaces as audit signal at retro.
26
- *
27
- * The check is `refuse-and-print` — auto-rewriting a workflow's declared
28
- * depth or tool list would silently change runtime behavior in ways the
29
- * operator may not have intended. The fixCommand explains how to bring the
30
- * fan-out back under the ceiling (reduce the declared depth or split the
31
- * deepest level out), and is explicit that stripping `Agent` is NOT the fix.
32
- *
33
- * Implementation note: we scan `.agents/workflows/*.md` for workflow files
34
- * whose frontmatter or body identifies them as a sub-agent role AND whose
35
- * `tools:` declaration includes `Agent`, then read the workflow's declared
36
- * `nesting-depth`. The marker for "sub-agent" is the phrase `sub-agent`
37
- * appearing in the description / overview region. The depth is read from a
38
- * `nesting-depth:` (or `agent-depth:`) frontmatter field, or a
39
- * `<!-- nesting-depth: N -->` body marker; an absent declaration is treated
40
- * as depth 1 (a single, shallow fan-out level).
2
+ * Flags a sub-agent workflow that declares `Agent` with a fan-out deeper than
3
+ * the supported nesting ceiling — such a chain fails silently at runtime.
4
+ * Nested dispatch at a supported depth is legitimate. Refuse-and-print:
5
+ * rewriting depth or tools would change runtime behaviour unasked.
41
6
  */
42
7
 
43
8
  import { readdirSync, readFileSync } from 'node:fs';
@@ -46,21 +11,14 @@ import path from 'node:path';
46
11
  const WORKFLOWS_DIR_DEFAULT = path.join('.agents', 'workflows');
47
12
 
48
13
  /**
49
- * Announced maximum nesting depth the Claude Code harness supports for
50
- * sub-agent fan-out. Depth 2 is independently verified; depths 3–5 are
51
- * announced but not yet re-spiked (Epic #4385 / watch #2870). A workflow
52
- * declaring a fan-out deeper than this ceiling is flagged. Operators can pin
53
- * a stricter (or, once verified, looser) ceiling via `state.supportedDepth`.
14
+ * Harness-announced ceiling (only depth 2 is verified); `state.supportedDepth` overrides.
54
15
  *
55
16
  * @type {number}
56
17
  */
57
18
  export const ANNOUNCED_MAX_DEPTH = 5;
58
19
 
59
20
  /**
60
- * Walk a workflow directory and return absolute `.md` file paths
61
- * (non-recursive — the workflows surface is one level deep; helpers/
62
- * sub-directory holds procedural modules that are not invoked as
63
- * sub-agents in their own right).
21
+ * Non-recursive: `helpers/` modules are never sub-agents themselves.
64
22
  *
65
23
  * @param {string} dir
66
24
  * @returns {string[]}
@@ -78,9 +36,6 @@ function listWorkflowFiles(dir) {
78
36
  }
79
37
 
80
38
  /**
81
- * Extract the frontmatter block (between leading `---` lines) and the
82
- * body. Returns `{ frontmatter, body }` strings (either may be empty).
83
- *
84
39
  * @param {string} src
85
40
  * @returns {{ frontmatter: string, body: string }}
86
41
  */
@@ -89,19 +44,14 @@ function splitFrontmatter(src) {
89
44
  const end = src.indexOf('\n---', 3);
90
45
  if (end === -1) return { frontmatter: '', body: src };
91
46
  const frontmatter = src.slice(3, end);
92
- // Skip past the closing `---` and the trailing newline.
93
47
  const bodyStart = src.indexOf('\n', end + 4);
94
48
  const body = bodyStart === -1 ? '' : src.slice(bodyStart + 1);
95
49
  return { frontmatter, body };
96
50
  }
97
51
 
98
52
  /**
99
- * True if the workflow document declares itself as a sub-agent. We
100
- * accept either the literal phrase `sub-agent` in the
101
- * description/overview region or the explicit phrase `runs as a
102
- * sub-agent`. The marker has to appear early in the document — past
103
- * the first ~100 lines we treat the mention as historical context
104
- * rather than a role declaration.
53
+ * `sub-agent` within the first 100 lines is a role declaration; later
54
+ * mentions are context.
105
55
  *
106
56
  * @param {string} src
107
57
  * @returns {boolean}
@@ -112,34 +62,25 @@ function isSubAgentWorkflow(src) {
112
62
  }
113
63
 
114
64
  /**
115
- * Inspect a workflow's `tools:` declaration (frontmatter OR inline body
116
- * note) for an `Agent` entry. Returns the offending textual fragment
117
- * (for the finding's detail field), or `null` if no `Agent` tool is
118
- * declared.
65
+ * Find an `Agent` entry in a flow- or block-style `tools:` list, in
66
+ * frontmatter or body; returns the fragment for the finding detail.
119
67
  *
120
68
  * @param {{ frontmatter: string, body: string }} parts
121
69
  * @returns {string | null}
122
70
  */
123
71
  function findAgentToolDeclaration(parts) {
124
72
  const { frontmatter, body } = parts;
125
- // Frontmatter YAML — match either `tools: [..., Agent, ...]` (flow
126
- // style) or block style with `- Agent`.
127
73
  const flowMatch = frontmatter.match(/tools\s*:\s*\[(.*?)\]/s);
128
74
  if (flowMatch && /\bAgent\b/.test(flowMatch[1])) {
129
75
  return `frontmatter tools: ${flowMatch[0].slice(0, 120)}`;
130
76
  }
131
- // Block-style: `tools:` followed by `- item` lines. Use `m` flag and
132
- // tolerate the trailing item line having no newline before the
133
- // frontmatter terminator.
77
+ // The last item may lack a newline before the frontmatter terminator.
134
78
  const blockMatch = frontmatter.match(
135
79
  /tools\s*:\s*\n((?:[ \t]*-[ \t]*[^\n]+\n?)+)/,
136
80
  );
137
81
  if (blockMatch && /^[ \t]*-[ \t]*Agent\b/m.test(blockMatch[1])) {
138
82
  return `frontmatter tools (block): ${blockMatch[0].split('\n')[0]}`;
139
83
  }
140
- // Body: same shape, e.g. operators sometimes document the tool list
141
- // in a "## Tools" section. We accept either of the YAML shapes
142
- // appearing in fenced code or inline.
143
84
  const bodyFlow = body.match(/tools\s*:\s*\[(.*?)\]/s);
144
85
  if (bodyFlow && /\bAgent\b/.test(bodyFlow[1])) {
145
86
  return `body tools: ${bodyFlow[0].slice(0, 120)}`;
@@ -152,12 +93,8 @@ function findAgentToolDeclaration(parts) {
152
93
  }
153
94
 
154
95
  /**
155
- * Parse the workflow's declared nesting depth. A sub-agent that declares
156
- * `Agent` may also declare how deep its fan-out reaches via a
157
- * `nesting-depth:` (or `agent-depth:`) frontmatter field, or a
158
- * `<!-- nesting-depth: N -->` marker in the body. Returns the integer
159
- * depth, or `null` when no depth is declared (the caller treats an absent
160
- * declaration as the shallow level-1 fan-out).
96
+ * From a `nesting-depth:`/`agent-depth:` frontmatter field or a
97
+ * `<!-- nesting-depth: N -->` body marker; `null` when undeclared.
161
98
  *
162
99
  * @param {{ frontmatter: string, body: string }} parts
163
100
  * @returns {number | null}
@@ -176,10 +113,6 @@ function parseDeclaredDepth(parts) {
176
113
  }
177
114
 
178
115
  /**
179
- * Resolve the supported depth ceiling for a detect run. Operators may pin a
180
- * stricter (or, once verified, looser) ceiling via `state.supportedDepth`;
181
- * an unset or non-positive-integer override falls back to the announced max.
182
- *
183
116
  * @param {{ supportedDepth?: unknown } | null | undefined} state
184
117
  * @returns {number}
185
118
  */
@@ -227,9 +160,7 @@ export default {
227
160
  const parts = splitFrontmatter(src);
228
161
  const where = findAgentToolDeclaration(parts);
229
162
  if (!where) continue;
230
- // Declaring `Agent` is legitimate. Only a fan-out deeper than the
231
- // supported ceiling is a runtime hazard; an undeclared depth is the
232
- // shallow level-1 fan-out and always within the ceiling.
163
+ // An undeclared depth is the shallow level-1 fan-out.
233
164
  const depth = parseDeclaredDepth(parts) ?? 1;
234
165
  if (depth <= ceiling) continue;
235
166
  offences.push({