mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. 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
- }