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,223 +0,0 @@
1
- // .agents/scripts/lib/baselines/scope-assert.js
2
- //
3
- // Story #5012 — the pure both-directions row-set assertion, plus the
4
- // merge-base attribution that decides which half of a divergence is this
5
- // change set's fault.
6
- //
7
- // `check-baselines.js` answers "did a measured value regress?". Nothing
8
- // answered "does this baseline still describe the tree?" — so a row could
9
- // point at a file deleted six months ago, or an in-scope file could carry no
10
- // row at all, and every gate stayed green. Both directions are checked here:
11
- //
12
- // - **missing** — an in-scope file with no row. Only asserted for kinds
13
- // whose producer emits one row per in-scope file
14
- // (`scope-inventory.js#KIND_SCOPE_POLICY`).
15
- // - **extra** — a row whose file is gone from disk (`absent`) or no longer
16
- // matched by the gate's own `targetDirs` / `ignoreGlobs` (`out-of-scope`).
17
- //
18
- // ## Why attribution exists
19
- //
20
- // Whole-tree equality on the PR path is unusable: the moment anyone lands an
21
- // in-scope file, every open PR reds on divergence its author did not create
22
- // and cannot fix from their branch. So the gate blocks only on divergence
23
- // attributable to `merge-base(base, HEAD)..HEAD`, and reports the inherited
24
- // remainder as a warning that costs nothing to carry.
25
- //
26
- // Attribution can be wrong in one safe direction only, so the resolution
27
- // **fails towards strict**: no resolvable base, a HEAD not ahead of its base,
28
- // or a change set that edits a baseline or the config defining its scope all
29
- // promote every finding to fatal. The last case is the load-bearing one — once
30
- // a branch has rewritten the scope rules themselves, "which side of the
31
- // merge-base introduced this row" is no longer a question the diff can answer.
32
- //
33
- // Pure module: no filesystem, no git, no config resolution. Every input is
34
- // handed in already resolved, which is what lets the whole attribution matrix
35
- // be unit-tested without a fixture repository.
36
-
37
- /** A row whose keyed file no longer exists on disk. */
38
- const REASON_ABSENT = 'absent';
39
- /** A row whose file exists but is no longer inside the gate's scope. */
40
- const REASON_OUT_OF_SCOPE = 'out-of-scope';
41
-
42
- export const EXTRA_REASONS = Object.freeze({
43
- ABSENT: REASON_ABSENT,
44
- OUT_OF_SCOPE: REASON_OUT_OF_SCOPE,
45
- });
46
-
47
- /**
48
- * Strictness reasons, in resolution order. Exported so the CLI can render the
49
- * cause without restating the strings.
50
- */
51
- export const STRICT_REASONS = Object.freeze({
52
- NO_BASE: 'no-resolvable-base',
53
- NOT_AHEAD: 'head-not-ahead-of-base',
54
- BASELINE_EDITED: 'change-set-edits-a-baseline',
55
- SCOPE_CONFIG_EDITED: 'change-set-edits-a-scope-config',
56
- ATTRIBUTABLE: 'attributable-to-merge-base-range',
57
- });
58
-
59
- /**
60
- * Collect the distinct key values a row set carries, skipping malformed rows.
61
- *
62
- * @param {Array<Record<string, unknown>>} rows
63
- * @param {string} keyField
64
- * @returns {Set<string>}
65
- */
66
- function rowKeys(rows, keyField) {
67
- const keys = new Set();
68
- for (const row of Array.isArray(rows) ? rows : []) {
69
- const value = row?.[keyField];
70
- if (typeof value === 'string' && value.length > 0) keys.add(value);
71
- }
72
- return keys;
73
- }
74
-
75
- /**
76
- * Compare a baseline's row set against its in-scope inventory.
77
- *
78
- * Direction gating is the inventory's call, not this function's: a kind whose
79
- * policy omits `missing` produces no missing findings even when its row set is
80
- * far sparser than the tree, because for that kind sparseness is correct.
81
- *
82
- * @param {{
83
- * inventory: { kind: string, keyField: string, directions: readonly string[],
84
- * files: string[] | null, degraded: boolean, reason: string | null },
85
- * rows: Array<Record<string, unknown>>,
86
- * existsOnDisk?: (relPath: string) => boolean,
87
- * }} params
88
- * @returns {{
89
- * kind: string,
90
- * skipped: boolean,
91
- * reason: string | null,
92
- * missing: string[],
93
- * extra: Array<{ path: string, reason: string }>,
94
- * }}
95
- */
96
- export function assertScope({ inventory, rows, existsOnDisk } = {}) {
97
- const kind = inventory?.kind ?? 'unknown';
98
- const directions = inventory?.directions ?? [];
99
- if (directions.length === 0 || inventory?.files === null) {
100
- return {
101
- kind,
102
- skipped: true,
103
- reason: inventory?.reason ?? `${kind} declares no assertable direction`,
104
- missing: [],
105
- extra: [],
106
- };
107
- }
108
-
109
- const keyField = inventory.keyField;
110
- const inScope = new Set(inventory.files);
111
- const keyed = rowKeys(rows, keyField);
112
- const onDisk = typeof existsOnDisk === 'function' ? existsOnDisk : () => true;
113
-
114
- const missing = directions.includes('missing')
115
- ? inventory.files.filter((file) => !keyed.has(file)).sort()
116
- : [];
117
-
118
- const extra = [];
119
- if (directions.includes('extra')) {
120
- for (const key of [...keyed].sort()) {
121
- if (inScope.has(key)) continue;
122
- extra.push({
123
- path: key,
124
- reason: onDisk(key) ? REASON_OUT_OF_SCOPE : REASON_ABSENT,
125
- });
126
- }
127
- }
128
-
129
- return { kind, skipped: false, reason: null, missing, extra };
130
- }
131
-
132
- /**
133
- * Decide whether this run blocks on every finding or only on the attributable
134
- * ones. Fails towards strict — each early return below is a case where the
135
- * merge-base range cannot be trusted to explain the divergence.
136
- *
137
- * @param {{
138
- * base?: string | null,
139
- * aheadOfBase?: boolean,
140
- * changedFiles?: string[],
141
- * baselinePaths?: string[],
142
- * scopeConfigPaths?: string[],
143
- * }} params
144
- * @returns {{ strict: boolean, reason: string }}
145
- */
146
- export function resolveStrictness({
147
- base,
148
- aheadOfBase,
149
- changedFiles = [],
150
- baselinePaths = [],
151
- scopeConfigPaths = [],
152
- } = {}) {
153
- if (typeof base !== 'string' || base.length === 0) {
154
- return { strict: true, reason: STRICT_REASONS.NO_BASE };
155
- }
156
- if (aheadOfBase !== true) {
157
- return { strict: true, reason: STRICT_REASONS.NOT_AHEAD };
158
- }
159
- const changed = new Set(changedFiles);
160
- if (baselinePaths.some((file) => changed.has(file))) {
161
- return { strict: true, reason: STRICT_REASONS.BASELINE_EDITED };
162
- }
163
- if (scopeConfigPaths.some((file) => changed.has(file))) {
164
- return { strict: true, reason: STRICT_REASONS.SCOPE_CONFIG_EDITED };
165
- }
166
- return { strict: false, reason: STRICT_REASONS.ATTRIBUTABLE };
167
- }
168
-
169
- /**
170
- * Split a kind's findings into the fatal set and the warning set.
171
- *
172
- * Under `strict`, everything is fatal. Otherwise a finding is fatal only when
173
- * this change set created it:
174
- *
175
- * - a **missing** row for a file the range ADDED — the branch introduced an
176
- * in-scope file and left it unmeasured;
177
- * - an **extra** row for a file the range DELETED or renamed away — the
178
- * branch removed the file and left its row behind.
179
- *
180
- * Everything else is inherited: real, worth reporting, and not this author's
181
- * to fix from this branch.
182
- *
183
- * @param {{
184
- * missing?: string[],
185
- * extra?: Array<{ path: string, reason: string }>,
186
- * added?: string[],
187
- * removed?: string[],
188
- * strict?: boolean,
189
- * }} params
190
- * @returns {{
191
- * fatal: { missing: string[], extra: Array<{ path: string, reason: string }> },
192
- * warning: { missing: string[], extra: Array<{ path: string, reason: string }> },
193
- * fatalCount: number,
194
- * warningCount: number,
195
- * }}
196
- */
197
- export function attributeDivergence({
198
- missing = [],
199
- extra = [],
200
- added = [],
201
- removed = [],
202
- strict = false,
203
- } = {}) {
204
- const addedSet = new Set(added);
205
- const removedSet = new Set(removed);
206
- const isFatalMissing = (file) => strict || addedSet.has(file);
207
- const isFatalExtra = (finding) => strict || removedSet.has(finding.path);
208
-
209
- const fatal = {
210
- missing: missing.filter(isFatalMissing),
211
- extra: extra.filter(isFatalExtra),
212
- };
213
- const warning = {
214
- missing: missing.filter((file) => !isFatalMissing(file)),
215
- extra: extra.filter((finding) => !isFatalExtra(finding)),
216
- };
217
- return {
218
- fatal,
219
- warning,
220
- fatalCount: fatal.missing.length + fatal.extra.length,
221
- warningCount: warning.missing.length + warning.extra.length,
222
- };
223
- }
@@ -1,314 +0,0 @@
1
- // .agents/scripts/lib/baselines/scope-inventory.js
2
- //
3
- // Story #5012 — the ONE in-scope file inventory the honesty surface reads.
4
- //
5
- // A ratchet gate can be green while measuring almost nothing: nothing checks
6
- // that a committed baseline's row set still describes the tree it claims to
7
- // describe. Both instruments that now do — `check-baseline-scope.js` (assert)
8
- // and `prune-baseline-orphans.js` (remedy) — resolve "which files is this kind
9
- // supposed to have rows for?" through this module, so the gate and the pruner
10
- // cannot disagree about scope and start fighting each other.
11
- //
12
- // ## Recompute from the gate's own config, never from a second walker
13
- //
14
- // The inventory is derived from **the same configuration the kind's refresh
15
- // scorer reads**, through the same helpers:
16
- //
17
- // - `coverage` — `.c8rc.cjs` `include` / `exclude`, applied with
18
- // `coverage-baseline.js#buildScopePredicate`, exactly as
19
- // `refresh-service.js#buildDefaultCoverageScorer` does.
20
- // - every other file-keyed kind — `delivery.quality.gates.<kind>.targetDirs`
21
- // / `.ignoreGlobs`, walked with `maintainability-utils.js#scanDirectory`,
22
- // exactly as `refresh-service.js#buildDefaultMaintainabilityScorer` does.
23
- //
24
- // A second walker written here would report the two implementations
25
- // disagreeing as divergence — the same failure mode
26
- // `check-baseline-drift.js` avoids by re-scoring through
27
- // `resolveDefaultScorer` rather than a private scorer.
28
- //
29
- // ## Measurement-free by contract
30
- //
31
- // Nothing in this module runs a scorer, reads `coverage/coverage-final.json`,
32
- // or needs a test run to have happened. It walks directories and matches
33
- // globs. That is what makes the gate runnable on any checkout, which is in
34
- // turn what makes hard-failing on a stale row defensible.
35
-
36
- import { createRequire } from 'node:module';
37
- import path from 'node:path';
38
-
39
- import { buildScopePredicate } from '../coverage-baseline.js';
40
- import { scanDirectory } from '../maintainability-utils.js';
41
-
42
- /**
43
- * Per-kind classification of which divergence directions may be asserted.
44
- *
45
- * **Only a kind whose producer emits one row per in-scope file may assert the
46
- * MISSING direction.** This is not a conservatism knob — it is arithmetic.
47
- * Measured against this repository on 2026-08-05, asserting MISSING densely
48
- * yields 128 phantom rows for `crap` (rows are per-method and coverage-gated,
49
- * so a file with no scorable method legitimately has none) and 510 for
50
- * `duplication` (a row exists only where a clone was found). A gate that
51
- * reports 638 phantom findings on a healthy tree is a gate nobody reads.
52
- *
53
- * `lint` and `mutation` are sparse for the same reason — a clean file has no
54
- * lint row, an untested file has no mutation row. `lighthouse` (keyed on
55
- * `route`) and `bundle-size` (keyed on `bundle`) are not file-keyed at all, so
56
- * neither direction is meaningful: their keys name artefacts, not paths on
57
- * disk, and a directory walk can say nothing about them.
58
- *
59
- * @type {Readonly<Record<string, { keyField: string, directions: readonly string[] }>>}
60
- */
61
- export const KIND_SCOPE_POLICY = Object.freeze({
62
- coverage: Object.freeze({
63
- keyField: 'path',
64
- directions: Object.freeze(['missing', 'extra']),
65
- }),
66
- maintainability: Object.freeze({
67
- keyField: 'path',
68
- directions: Object.freeze(['missing', 'extra']),
69
- }),
70
- crap: Object.freeze({
71
- keyField: 'path',
72
- directions: Object.freeze(['extra']),
73
- }),
74
- duplication: Object.freeze({
75
- keyField: 'path',
76
- directions: Object.freeze(['extra']),
77
- }),
78
- lint: Object.freeze({
79
- keyField: 'path',
80
- directions: Object.freeze(['extra']),
81
- }),
82
- mutation: Object.freeze({
83
- keyField: 'path',
84
- directions: Object.freeze(['extra']),
85
- }),
86
- lighthouse: Object.freeze({
87
- keyField: 'route',
88
- directions: Object.freeze([]),
89
- }),
90
- 'bundle-size': Object.freeze({
91
- keyField: 'bundle',
92
- directions: Object.freeze([]),
93
- }),
94
- });
95
-
96
- /** Every kind the honesty surface knows about, in report order. */
97
- export const SCOPE_KINDS = Object.freeze(Object.keys(KIND_SCOPE_POLICY));
98
-
99
- /**
100
- * The directions `kind` may assert. Unknown kinds assert nothing — a kind this
101
- * module has never heard of has no scope model, and inventing one would be the
102
- * phantom-row failure above with extra steps.
103
- *
104
- * @param {string} kind
105
- * @returns {readonly string[]}
106
- */
107
- export function directionsFor(kind) {
108
- return KIND_SCOPE_POLICY[kind]?.directions ?? [];
109
- }
110
-
111
- /**
112
- * The row field `kind` keys on — `path` for the file-keyed kinds, `route` for
113
- * lighthouse, `bundle` for bundle-size. Mirrors `kinds/<kind>.js#keyField`;
114
- * kept here so a caller can classify without importing the kernel.
115
- *
116
- * @param {string} kind
117
- * @returns {string}
118
- */
119
- export function keyFieldFor(kind) {
120
- return KIND_SCOPE_POLICY[kind]?.keyField ?? 'path';
121
- }
122
-
123
- /**
124
- * True when `kind` keys its rows on a repo-relative file path, so a directory
125
- * walk can be compared against its row set at all.
126
- *
127
- * @param {string} kind
128
- * @returns {boolean}
129
- */
130
- export function isFileKeyed(kind) {
131
- return keyFieldFor(kind) === 'path' && Object.hasOwn(KIND_SCOPE_POLICY, kind);
132
- }
133
-
134
- /** Glob metacharacters that end a pattern's literal prefix. */
135
- const GLOB_META = /[*?[\]{}!+@()]/;
136
-
137
- /**
138
- * Derive directory roots to walk from a list of include globs, by taking each
139
- * pattern's literal leading path segments.
140
- *
141
- * The coverage gate's schema is closed and declares no `targetDirs` — its
142
- * scope lives entirely in `.c8rc.cjs`. Without this derivation the coverage
143
- * walk has no root to start from, so there is nothing to compare the row set
144
- * against and the whole MISSING direction goes silently inert for the one kind
145
- * whose producer is densest.
146
- *
147
- * `'.agents/scripts/**'` yields `.agents/scripts`; a pattern that is glob from
148
- * its first segment (`'**​/*.js'`) yields `.`, the repo root.
149
- *
150
- * @param {string[]} globs
151
- * @returns {string[]} De-duplicated roots, repo-relative POSIX.
152
- */
153
- export function deriveWalkRoots(globs) {
154
- const roots = new Set();
155
- for (const glob of Array.isArray(globs) ? globs : []) {
156
- if (typeof glob !== 'string' || glob.length === 0) continue;
157
- const literal = [];
158
- for (const segment of glob.split('/')) {
159
- if (GLOB_META.test(segment)) break;
160
- literal.push(segment);
161
- }
162
- roots.add(literal.join('/') || '.');
163
- }
164
- return [...roots];
165
- }
166
-
167
- /**
168
- * Walk `roots` under `cwd` and return canonical repo-relative POSIX paths.
169
- *
170
- * Delegates to `scanDirectory`, which already owns the supported-extension set
171
- * and the ignored-directory set (`node_modules`, `.git`, `temp`, `.worktrees`,
172
- * …) that every scorer walks with. Passing `ignoreGlobs` straight through
173
- * means an ignored file is dropped by the identical matcher the scorer uses.
174
- *
175
- * @param {{ cwd: string, roots: string[], ignoreGlobs?: string[] }} params
176
- * @returns {string[]}
177
- */
178
- function walkRoots({ cwd, roots, ignoreGlobs = [] }) {
179
- const absolute = [];
180
- for (const root of roots) {
181
- const abs = path.isAbsolute(root) ? root : path.resolve(cwd, root);
182
- scanDirectory(abs, absolute, { cwd, ignoreGlobs });
183
- }
184
- return absolute.map((abs) =>
185
- path.relative(cwd, abs).split(path.sep).join('/'),
186
- );
187
- }
188
-
189
- /**
190
- * Build the coverage inventory from `.c8rc.cjs`.
191
- *
192
- * Roots come from the literal prefixes of `include`; the walked set is then
193
- * filtered through the same `buildScopePredicate` the coverage scorer applies,
194
- * so `exclude` is honoured by one implementation rather than two.
195
- *
196
- * @param {{ cwd: string, requireFn?: (id: string) => object }} params
197
- * @returns {{ files: string[] | null, roots: string[], degraded: boolean, reason: string | null }}
198
- */
199
- function coverageInventory({ cwd, requireFn }) {
200
- const load = requireFn ?? createRequire(path.join(cwd, 'noop.cjs'));
201
- let config;
202
- try {
203
- config = load(path.resolve(cwd, '.c8rc.cjs'));
204
- } catch (err) {
205
- return {
206
- files: null,
207
- roots: [],
208
- degraded: true,
209
- reason: `.c8rc.cjs unreadable: ${err?.message ?? err}`,
210
- };
211
- }
212
- const include = Array.isArray(config?.include) ? config.include : [];
213
- const exclude = Array.isArray(config?.exclude) ? config.exclude : [];
214
- if (include.length === 0) {
215
- return {
216
- files: null,
217
- roots: [],
218
- degraded: true,
219
- reason: '.c8rc.cjs declares no include globs',
220
- };
221
- }
222
- const roots = deriveWalkRoots(include);
223
- const inScope = buildScopePredicate({ include, exclude });
224
- return {
225
- files: walkRoots({ cwd, roots }).filter(inScope),
226
- roots,
227
- degraded: false,
228
- reason: null,
229
- };
230
- }
231
-
232
- /**
233
- * Build the inventory for a `targetDirs`-configured kind (everything except
234
- * coverage). Reads the gate's own `targetDirs` / `ignoreGlobs` off the
235
- * normalized quality block — the same two keys its refresh scorer reads.
236
- *
237
- * @param {{ kind: string, cwd: string, gate: object }} params
238
- * @returns {{ files: string[] | null, roots: string[], degraded: boolean, reason: string | null }}
239
- */
240
- function targetDirsInventory({ kind, cwd, gate }) {
241
- const roots = Array.isArray(gate?.targetDirs) ? gate.targetDirs : [];
242
- const ignoreGlobs = Array.isArray(gate?.ignoreGlobs) ? gate.ignoreGlobs : [];
243
- if (roots.length === 0) {
244
- return {
245
- files: null,
246
- roots: [],
247
- degraded: true,
248
- reason: `delivery.quality.gates.${kind}.targetDirs is empty or unset`,
249
- };
250
- }
251
- return {
252
- files: walkRoots({ cwd, roots, ignoreGlobs }),
253
- roots,
254
- degraded: false,
255
- reason: null,
256
- };
257
- }
258
-
259
- /**
260
- * Resolve the set of files `kind` is configured to have rows for.
261
- *
262
- * Never throws: an unreadable or absent scope config degrades to
263
- * `{ files: null, degraded: true, reason }`. Callers treat a degraded
264
- * inventory as "scope unknown" — the gate reports it and skips that kind's
265
- * scope directions, the pruner falls back to orphan-only pruning. Neither may
266
- * infer emptiness from it: a `files: []` inventory would make every committed
267
- * row look out-of-scope and hand the pruner a licence to delete the baseline.
268
- *
269
- * @param {{
270
- * kind: string,
271
- * cwd?: string,
272
- * quality?: object,
273
- * requireFn?: (id: string) => object,
274
- * }} params
275
- * @returns {{
276
- * kind: string,
277
- * keyField: string,
278
- * directions: readonly string[],
279
- * files: string[] | null,
280
- * roots: string[],
281
- * degraded: boolean,
282
- * reason: string | null,
283
- * }}
284
- */
285
- export function buildScopeInventory({
286
- kind,
287
- cwd = process.cwd(),
288
- quality,
289
- requireFn,
290
- } = {}) {
291
- const base = {
292
- kind,
293
- keyField: keyFieldFor(kind),
294
- directions: directionsFor(kind),
295
- };
296
- if (!isFileKeyed(kind)) {
297
- return {
298
- ...base,
299
- files: null,
300
- roots: [],
301
- degraded: false,
302
- reason: `${kind} is not file-keyed (rows key on "${base.keyField}")`,
303
- };
304
- }
305
- const resolved =
306
- kind === 'coverage'
307
- ? coverageInventory({ cwd, requireFn })
308
- : targetDirsInventory({
309
- kind,
310
- cwd,
311
- gate: quality?.gates?.[kind] ?? {},
312
- });
313
- return { ...base, ...resolved };
314
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * Resolves c8's CLI entry point so callers can spawn it via
3
- * `process.execPath <c8Cli>` (shell:false) instead of routing through
4
- * the `npx.cmd` shim, which would force shell:true under
5
- * CVE-2024-27980's .cmd/.bat policy and re-open CWE-78.
6
- *
7
- * `bin/c8.js` is not exported from c8's package.json, so the lookup
8
- * goes through `package.json` (always in the exports map) and
9
- * `path.join` to its sibling bin file.
10
- */
11
-
12
- import { createRequire } from 'node:module';
13
- import path from 'node:path';
14
-
15
- const require = createRequire(import.meta.url);
16
-
17
- export const C8_CLI = path.join(
18
- path.dirname(require.resolve('c8/package.json')),
19
- 'bin',
20
- 'c8.js',
21
- );
@@ -1,51 +0,0 @@
1
- /* node:coverage ignore file -- AJV schema declaration (data-as-code) */
2
-
3
- import { gateBase, NULLABLE_NONEMPTY_SAFE_STRING } from './shared.js';
4
-
5
- const LIGHTHOUSE_ROUTE = {
6
- type: 'object',
7
- description: 'One route the Lighthouse run scores.',
8
- required: ['path'],
9
- properties: {
10
- path: {
11
- type: 'string',
12
- minLength: 1,
13
- description: 'Route path appended to `baseUrl`.',
14
- },
15
- formFactor: {
16
- type: 'string',
17
- enum: ['mobile', 'desktop'],
18
- description: 'Emulated form factor for this route.',
19
- },
20
- },
21
- additionalProperties: false,
22
- };
23
-
24
- export const LIGHTHOUSE_GATE = {
25
- type: 'object',
26
- description:
27
- 'Lighthouse category-score ratchet for web targets. Off by default — it needs a running deployment.',
28
- properties: {
29
- ...gateBase({
30
- enabled: false,
31
- baselinePath: 'baselines/lighthouse.json',
32
- tolerance: { kind: 'absolute', value: 0 },
33
- floors: {
34
- '*': { performance: 0, accessibility: 0, bestPractices: 0, seo: 0 },
35
- },
36
- }),
37
- baseUrl: {
38
- ...NULLABLE_NONEMPTY_SAFE_STRING,
39
- description:
40
- 'Origin the routes are resolved against. `null` leaves the gate unusable, which is why it ships disabled.',
41
- default: null,
42
- },
43
- routes: {
44
- type: 'array',
45
- items: LIGHTHOUSE_ROUTE,
46
- description: 'Routes to score on each run.',
47
- default: [],
48
- },
49
- },
50
- additionalProperties: false,
51
- };
@@ -1,18 +0,0 @@
1
- /* node:coverage ignore file -- AJV schema declaration (data-as-code) */
2
-
3
- import { gateBase } from './shared.js';
4
-
5
- export const LINT_GATE = {
6
- type: 'object',
7
- description:
8
- 'Lint-count ratchet. Floors are absolute error/warning counts; the baseline pins the current count so a regression is visible even while the floor is not yet met.',
9
- properties: {
10
- ...gateBase({
11
- enabled: true,
12
- baselinePath: 'baselines/lint.json',
13
- tolerance: { kind: 'absolute', value: 0 },
14
- floors: { '*': { errorCount: 0 } },
15
- }),
16
- },
17
- additionalProperties: false,
18
- };
@@ -1,70 +0,0 @@
1
- // .agents/scripts/lib/dynamic-workflow/architecture-report-contract.js
2
- import { assertSectionsContract } from './report-contract-core.js';
3
-
4
- /**
5
- * The `audit-architecture` report contract (Epic #3597, Story #3612).
6
- *
7
- * This is the **single source of truth** for the report shape that BOTH the
8
- * sequential lens (`.agents/workflows/audit-architecture.md` Step 3) and the
9
- * orchestrated dynamic-workflow path
10
- * (`.claude/workflows/audit-architecture.workflow.js`) MUST emit to
11
- * `{{auditOutputDir}}/audit-architecture-results.md`. Keeping it here lets the
12
- * contract-tier test assert report conformance against one definition rather
13
- * than re-deriving headings from prose in two places.
14
- *
15
- * Changing the report contract is explicitly **out of scope** for this Story —
16
- * the orchestrated path emits the lens's existing report contract unchanged.
17
- * This module documents the existing shape, it does not introduce a new one.
18
- *
19
- * @module dynamic-workflow/architecture-report-contract
20
- */
21
-
22
- /** The artifact filename the lens writes under `auditOutputDir`. */
23
- export const REPORT_ARTIFACT_BASENAME = 'audit-architecture-results.md';
24
-
25
- /**
26
- * The required top-level (`##`) section headings, in document order, that the
27
- * lens markdown's Step 3 template defines. A conformant report MUST contain
28
- * each of these headings; the orchestrated path assembles its sub-agent
29
- * findings into exactly this skeleton.
30
- */
31
- export const REQUIRED_SECTIONS = Object.freeze([
32
- 'Executive Summary',
33
- 'Triage Summary',
34
- 'Architecture Guardrail Coverage',
35
- 'Detailed Findings',
36
- ]);
37
-
38
- /** The H1 title the report opens with. */
39
- export const REPORT_TITLE = 'Architecture & Clean Code Review';
40
-
41
- /**
42
- * The required field labels inside each `### <finding>` block under
43
- * `## Detailed Findings`. Mirrors the strict per-finding structure in the
44
- * lens template.
45
- */
46
- export const FINDING_FIELDS = Object.freeze([
47
- 'Category',
48
- 'Dimension',
49
- 'Current State',
50
- 'Recommendation & Rationale',
51
- 'Agent Prompt',
52
- ]);
53
-
54
- /**
55
- * Assert that a rendered markdown report conforms to the contract: it has the
56
- * H1 title and every required `##` section heading. Returns a structured
57
- * result rather than throwing, so callers (tests, the orchestrated path's
58
- * self-check) can report precisely which sections are missing.
59
- *
60
- * Pure function — string analysis only.
61
- *
62
- * @param {string} markdown - The rendered report body.
63
- * @returns {{ conformant: boolean, missingSections: string[], hasTitle: boolean }}
64
- */
65
- export function assertReportContract(markdown) {
66
- return assertSectionsContract(markdown, {
67
- title: REPORT_TITLE,
68
- requiredSections: REQUIRED_SECTIONS,
69
- });
70
- }