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,418 +0,0 @@
1
- /**
2
- * model-attribution.js — per-ticket model attribution comments + rollup
3
- * (Story #2813).
4
- *
5
- * Records which Claude model executed a given ticket as a structured comment
6
- * on that ticket. Epic-level mixes are computed at query time by walking the
7
- * child tickets' comments — no Epic-scope emission is written.
8
- *
9
- * Surface:
10
- *
11
- * - {@link resolveModelIdentity} — pure resolver that picks an identity
12
- * from the fallback chain (SDK metadata → env var → 'unknown'
13
- * sentinel) and tags the source. Pure: no IO, no Date.now().
14
- * - {@link buildModelAttributionPayload} — shape the canonical payload
15
- * from a resolved identity + ticketId + timestamp.
16
- * - {@link validateModelAttributionPayload} — hand-rolled validator
17
- * matching `.agents/schemas/model-attribution.schema.json`. Returns
18
- * `{ ok: true }` or `{ ok: false, errors: string[] }`.
19
- * - {@link renderModelAttributionBody} — markdown body + fenced JSON
20
- * block (same fence convention as the other structured comments in
21
- * this repo so the shared `parseFencedJsonComment` can read it back).
22
- * - {@link emitModelAttribution} — idempotent upsert against a Task
23
- * ticket. Throws on validator failure (no comment written).
24
- * - {@link parseModelAttributionComment} — readback helper for the
25
- * rollup walker; returns `null` on missing/malformed payloads.
26
- * - {@link rollupModelAttribution} — given a Story or Epic ticket id,
27
- * walks `getSubTickets`, collects attribution comments, returns
28
- * `{ totalChildren, byModel: {...}, missing: N }`.
29
- */
30
-
31
- import { parseFencedJsonComment } from './structured-comment-parser.js';
32
- import { findStructuredComment, upsertStructuredComment } from './ticketing.js';
33
-
34
- export const MODEL_ATTRIBUTION_TYPE = 'model-attribution';
35
-
36
- /**
37
- * Sentinel returned by {@link resolveModelIdentity} when neither the SDK
38
- * metadata nor the runtime env var supplied a model id. Exported so tests
39
- * and downstream consumers can compare without re-spelling the literal.
40
- */
41
- export const UNKNOWN_MODEL_ID = 'unknown';
42
-
43
- /**
44
- * Env vars consulted as the second-priority resolver source. Listed in
45
- * priority order — the first one set wins.
46
- */
47
- const ENV_VAR_CANDIDATES = Object.freeze(['CLAUDE_MODEL', 'ANTHROPIC_MODEL']);
48
-
49
- /**
50
- * Derive the coarse family label from a canonical model id. Used for the
51
- * rollup-friendly `family` field. Returns `null` when the id does not
52
- * match a recognised family pattern (the rollup helper falls back to the
53
- * full id in that case so unknown models still aggregate distinctly).
54
- *
55
- * Recognises Anthropic Claude families: Opus, Sonnet, Haiku.
56
- *
57
- * @param {string} id
58
- * @returns {string | null}
59
- */
60
- export function deriveFamily(id) {
61
- if (typeof id !== 'string') return null;
62
- const lower = id.toLowerCase();
63
- if (lower.includes('opus')) return 'Opus';
64
- if (lower.includes('sonnet')) return 'Sonnet';
65
- if (lower.includes('haiku')) return 'Haiku';
66
- return null;
67
- }
68
-
69
- /**
70
- * Resolve the active model identity using the documented fallback chain:
71
- *
72
- * 1. `sdkMetadata.modelId` (or `.model`) when present and non-empty.
73
- * 2. `CLAUDE_MODEL` / `ANTHROPIC_MODEL` env vars (first non-empty wins).
74
- * 3. The `UNKNOWN_MODEL_ID` sentinel.
75
- *
76
- * Pure: accepts the env bag as an injectable argument so tests can pin
77
- * the resolver without mutating `process.env`. Production callers default
78
- * to `process.env`.
79
- *
80
- * @param {object} [opts]
81
- * @param {object|null} [opts.sdkMetadata] — SDK response metadata.
82
- * @param {Record<string, string|undefined>} [opts.env=process.env]
83
- * @returns {{ id: string, family: string|null, source: 'sdk-metadata'|'env'|'unknown', sdkMetadata?: object }}
84
- */
85
- export function resolveModelIdentity(opts = {}) {
86
- const { sdkMetadata = null, env = process.env } = opts;
87
-
88
- const sdkId =
89
- sdkMetadata && typeof sdkMetadata === 'object'
90
- ? (typeof sdkMetadata.modelId === 'string' && sdkMetadata.modelId) ||
91
- (typeof sdkMetadata.model === 'string' && sdkMetadata.model) ||
92
- null
93
- : null;
94
- if (sdkId) {
95
- return {
96
- id: sdkId,
97
- family: deriveFamily(sdkId),
98
- source: 'sdk-metadata',
99
- sdkMetadata,
100
- };
101
- }
102
-
103
- for (const name of ENV_VAR_CANDIDATES) {
104
- const value = env?.[name];
105
- if (typeof value === 'string' && value.length > 0) {
106
- return {
107
- id: value,
108
- family: deriveFamily(value),
109
- source: 'env',
110
- };
111
- }
112
- }
113
-
114
- return {
115
- id: UNKNOWN_MODEL_ID,
116
- family: null,
117
- source: 'unknown',
118
- };
119
- }
120
-
121
- /**
122
- * Build the canonical payload object from a resolved identity. Separated
123
- * from {@link emitModelAttribution} so callers (and tests) can shape the
124
- * payload without triggering the upsert side-effect.
125
- *
126
- * @param {{
127
- * ticketId: number,
128
- * identity: ReturnType<typeof resolveModelIdentity>,
129
- * recordedAt?: string,
130
- * }} args
131
- * @returns {object}
132
- */
133
- export function buildModelAttributionPayload(args) {
134
- const { ticketId, identity, recordedAt } = args ?? {};
135
- const payload = {
136
- kind: MODEL_ATTRIBUTION_TYPE,
137
- ticketId,
138
- model: identity?.family
139
- ? { id: identity.id, family: identity.family }
140
- : { id: identity?.id },
141
- source: identity?.source,
142
- recordedAt: recordedAt ?? new Date().toISOString(),
143
- };
144
- if (identity?.sdkMetadata && typeof identity.sdkMetadata === 'object') {
145
- payload.sdkMetadata = identity.sdkMetadata;
146
- }
147
- return payload;
148
- }
149
-
150
- const VALID_SOURCES = new Set(['sdk-metadata', 'env', 'unknown']);
151
- const ISO_8601_RE =
152
- /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
153
-
154
- /**
155
- * Per-field validators for {@link validateModelAttributionPayload}. Each
156
- * returns an array of error strings for its field (empty when the field is
157
- * valid), so the top-level validator collapses to a flat-map over the field
158
- * list — no per-field branching in the orchestrating body. Story #4075
159
- * (CLI-orchestration CC reduction): keeps each validator pure and
160
- * single-responsibility.
161
- */
162
- function validateKind(payload) {
163
- return payload.kind === MODEL_ATTRIBUTION_TYPE
164
- ? []
165
- : [`kind must be "${MODEL_ATTRIBUTION_TYPE}"`];
166
- }
167
-
168
- function validateTicketId(payload) {
169
- return Number.isInteger(payload.ticketId) && payload.ticketId > 0
170
- ? []
171
- : ['ticketId must be a positive integer'];
172
- }
173
-
174
- function validateModel(payload) {
175
- const { model } = payload;
176
- if (!model || typeof model !== 'object' || Array.isArray(model)) {
177
- return ['model must be an object'];
178
- }
179
- const errors = [];
180
- if (typeof model.id !== 'string' || model.id.length === 0) {
181
- errors.push('model.id must be a non-empty string');
182
- }
183
- if (
184
- model.family !== undefined &&
185
- (typeof model.family !== 'string' || model.family.length === 0)
186
- ) {
187
- errors.push('model.family, when present, must be a non-empty string');
188
- }
189
- return errors;
190
- }
191
-
192
- function validateSource(payload) {
193
- return typeof payload.source === 'string' && VALID_SOURCES.has(payload.source)
194
- ? []
195
- : [`source must be one of: ${[...VALID_SOURCES].join(', ')}`];
196
- }
197
-
198
- function validateRecordedAt(payload) {
199
- return typeof payload.recordedAt === 'string' &&
200
- ISO_8601_RE.test(payload.recordedAt)
201
- ? []
202
- : ['recordedAt must be an ISO-8601 timestamp string'];
203
- }
204
-
205
- function validateSdkMetadata(payload) {
206
- const { sdkMetadata } = payload;
207
- if (sdkMetadata === undefined) return [];
208
- const valid =
209
- sdkMetadata !== null &&
210
- typeof sdkMetadata === 'object' &&
211
- !Array.isArray(sdkMetadata);
212
- return valid ? [] : ['sdkMetadata, when present, must be an object'];
213
- }
214
-
215
- const PAYLOAD_FIELD_VALIDATORS = Object.freeze([
216
- validateKind,
217
- validateTicketId,
218
- validateModel,
219
- validateSource,
220
- validateRecordedAt,
221
- validateSdkMetadata,
222
- ]);
223
-
224
- /**
225
- * Hand-rolled validator matching
226
- * `.agents/schemas/model-attribution.schema.json`. Returns
227
- * `{ ok: true }` on success, `{ ok: false, errors: string[] }` on
228
- * failure. The error strings are stable enough to assert against in
229
- * tests.
230
- *
231
- * The codebase does not pull in `ajv` for runtime schema validation
232
- * (signals + structured comments use hand-rolled shape guards — see
233
- * `lib/signals/schema.js`). We follow the same pattern here so the
234
- * schema file stays the documented SSOT and the validator is the
235
- * runtime gate.
236
- *
237
- * @param {unknown} payload
238
- * @returns {{ ok: true } | { ok: false, errors: string[] }}
239
- */
240
- export function validateModelAttributionPayload(payload) {
241
- if (
242
- payload === null ||
243
- typeof payload !== 'object' ||
244
- Array.isArray(payload)
245
- ) {
246
- return { ok: false, errors: ['payload must be a plain object'] };
247
- }
248
- const errors = PAYLOAD_FIELD_VALIDATORS.flatMap((validate) =>
249
- validate(payload),
250
- );
251
- return errors.length ? { ok: false, errors } : { ok: true };
252
- }
253
-
254
- /**
255
- * Render the markdown body that gets upserted as the structured comment.
256
- * Body is a one-line summary followed by the canonical payload inside a
257
- * fenced ```json``` block so downstream readers can use the shared
258
- * `parseFencedJsonComment` helper without bespoke parsing.
259
- *
260
- * @param {object} payload — already validated.
261
- * @returns {string}
262
- */
263
- export function renderModelAttributionBody(payload) {
264
- const id = payload.model?.id ?? UNKNOWN_MODEL_ID;
265
- const family = payload.model?.family ? ` (${payload.model.family})` : '';
266
- const sourceLabel =
267
- payload.source === 'sdk-metadata'
268
- ? 'SDK metadata'
269
- : payload.source === 'env'
270
- ? 'env var'
271
- : 'unknown source';
272
- const header = `🤖 Model attribution: \`${id}\`${family} · via ${sourceLabel}`;
273
- return [header, '', '```json', JSON.stringify(payload, null, 2), '```'].join(
274
- '\n',
275
- );
276
- }
277
-
278
- /**
279
- * Emit (idempotently) the model-attribution comment onto a Task ticket.
280
- * Validates the payload before any IO — a malformed payload throws and
281
- * writes nothing to the provider.
282
- *
283
- * @param {{
284
- * provider: import('../ITicketingProvider.js').ITicketingProvider,
285
- * ticketId: number,
286
- * sdkMetadata?: object|null,
287
- * env?: Record<string, string|undefined>,
288
- * recordedAt?: string,
289
- * }} args
290
- * @returns {Promise<{ payload: object, body: string }>}
291
- */
292
- export async function emitModelAttribution(args) {
293
- const { provider, ticketId, sdkMetadata, env, recordedAt } = args ?? {};
294
- if (!provider || typeof provider.postComment !== 'function') {
295
- throw new TypeError(
296
- 'emitModelAttribution requires a provider with postComment',
297
- );
298
- }
299
- if (!Number.isInteger(ticketId) || ticketId <= 0) {
300
- throw new TypeError(
301
- 'emitModelAttribution requires a positive integer ticketId',
302
- );
303
- }
304
- const identity = resolveModelIdentity({ sdkMetadata, env });
305
- const payload = buildModelAttributionPayload({
306
- ticketId,
307
- identity,
308
- recordedAt,
309
- });
310
- const result = validateModelAttributionPayload(payload);
311
- if (!result.ok) {
312
- throw new Error(
313
- `model-attribution payload failed validation: ${result.errors.join('; ')}`,
314
- );
315
- }
316
- const body = renderModelAttributionBody(payload);
317
- await upsertStructuredComment(
318
- provider,
319
- ticketId,
320
- MODEL_ATTRIBUTION_TYPE,
321
- body,
322
- );
323
- return { payload, body };
324
- }
325
-
326
- /**
327
- * Read back a model-attribution comment from a ticket. Returns the
328
- * parsed payload, or `null` when the comment is missing or its payload
329
- * fails validation (malformed payloads are treated as "no attribution"
330
- * so a single corrupt comment does not poison the whole rollup).
331
- *
332
- * @param {{
333
- * provider: import('../ITicketingProvider.js').ITicketingProvider,
334
- * ticketId: number,
335
- * }} args
336
- * @returns {Promise<object|null>}
337
- */
338
- export async function parseModelAttributionComment(args) {
339
- const { provider, ticketId } = args ?? {};
340
- const comment = await findStructuredComment(
341
- provider,
342
- ticketId,
343
- MODEL_ATTRIBUTION_TYPE,
344
- );
345
- if (!comment) return null;
346
- const parsed = parseFencedJsonComment(comment);
347
- if (!parsed) return null;
348
- const result = validateModelAttributionPayload(parsed);
349
- return result.ok ? parsed : null;
350
- }
351
-
352
- /**
353
- * Walk the immediate child tickets of a parent (e.g. an Epic's Stories),
354
- * read each child's model-attribution comment (when present), and
355
- * aggregate per-model counts. Children with no attribution comment are
356
- * counted under `missing`.
357
- *
358
- * Rollup is keyed by `model.family` when present, otherwise by
359
- * `model.id` so unknown families still aggregate distinctly. The
360
- * envelope also exposes the per-id breakdown for callers that want a
361
- * finer-grained view.
362
- *
363
- * @param {{
364
- * provider: import('../ITicketingProvider.js').ITicketingProvider,
365
- * parentId: number,
366
- * }} args
367
- * @returns {Promise<{
368
- * parentId: number,
369
- * totalChildren: number,
370
- * missing: number,
371
- * byModel: Record<string, number>,
372
- * byId: Record<string, number>,
373
- * }>}
374
- */
375
- export async function rollupModelAttribution(args) {
376
- const { provider, parentId } = args ?? {};
377
- if (!provider || typeof provider.getSubTickets !== 'function') {
378
- throw new TypeError(
379
- 'rollupModelAttribution requires a provider with getSubTickets',
380
- );
381
- }
382
- if (!Number.isInteger(parentId) || parentId <= 0) {
383
- throw new TypeError(
384
- 'rollupModelAttribution requires a positive integer parentId',
385
- );
386
- }
387
- const children = (await provider.getSubTickets(parentId)) ?? [];
388
- const byModel = {};
389
- const byId = {};
390
- let missing = 0;
391
- for (const child of children) {
392
- const childId = Number(child?.id);
393
- if (!Number.isInteger(childId) || childId <= 0) {
394
- missing += 1;
395
- continue;
396
- }
397
- const payload = await parseModelAttributionComment({
398
- provider,
399
- ticketId: childId,
400
- });
401
- if (!payload) {
402
- missing += 1;
403
- continue;
404
- }
405
- const familyKey =
406
- payload.model?.family ?? payload.model?.id ?? UNKNOWN_MODEL_ID;
407
- const idKey = payload.model?.id ?? UNKNOWN_MODEL_ID;
408
- byModel[familyKey] = (byModel[familyKey] ?? 0) + 1;
409
- byId[idKey] = (byId[idKey] ?? 0) + 1;
410
- }
411
- return {
412
- parentId,
413
- totalChildren: children.length,
414
- missing,
415
- byModel,
416
- byId,
417
- };
418
- }
@@ -1,33 +0,0 @@
1
- /**
2
- * story-plan-state.js — read the v2 Story planning checkpoint.
3
- *
4
- * `plan-persist.js` upserts one `story-plan-state` structured comment per
5
- * created Story carrying the persist receipt (when the plan completed, how many
6
- * Stories it created, and their ids). Story #4542 removed the risk fields it
7
- * used to carry: the planner-authored verdict, the envelope derived from it,
8
- * and the review routing computed from that envelope. Nothing read any of them
9
- * back — review depth is now derived from the diff at close time
10
- * (`review-depth.js#deriveChangeLevel`), so no checkpoint read sits on the
11
- * delivery path at all.
12
- */
13
-
14
- import { parseFencedJsonComment } from './structured-comment-parser.js';
15
- import { findStructuredComment } from './ticketing.js';
16
-
17
- /**
18
- * Read the v2 Story planning checkpoint. Missing/malformed comments degrade
19
- * to null — an unplanned Story simply has no persist receipt.
20
- */
21
- export async function readStoryPlanState({
22
- provider,
23
- storyId,
24
- findCommentFn = findStructuredComment,
25
- }) {
26
- const comment = await findCommentFn(
27
- provider,
28
- Number(storyId),
29
- 'story-plan-state',
30
- );
31
- const state = parseFencedJsonComment(comment);
32
- return state && typeof state === 'object' ? state : null;
33
- }
@@ -1,67 +0,0 @@
1
- /**
2
- * structured-comment-parser.js — shared parser for fenced-JSON structured
3
- * comments.
4
- *
5
- * Several callers (the deleted epic-runner Checkpointer/ProgressReporter,
6
- * `parseStoryRunProgressComment` / `parsePhaseTimingsComment`, wave-gate's
7
- * local `extractJsonBlock`) need to extract the `{...}` payload from the
8
- * fenced ```json``` block of a structured comment body. They had each open-
9
- * coded the same `/```json\s*\n([\s\S]*?)\n```/` regex + `JSON.parse` +
10
- * try/catch dance — small enough to copy, large enough to drift.
11
- *
12
- * This helper centralizes that single regex so a future change to the
13
- * fence format (e.g. tolerating CRLF, surrounding whitespace, alternate
14
- * fence languages) lives in exactly one place. The functions are
15
- * deliberately permissive about input shape: anything that isn't the
16
- * expected type returns `null` rather than throwing, matching what the
17
- * existing callers already do — they all treat parse failure as "no
18
- * payload available" and fall back to a default state.
19
- *
20
- * Acceptance contract for this helper:
21
- * - returns the parsed JSON value when the body contains a valid fenced
22
- * ```json``` block;
23
- * - returns `null` for missing comment, missing body, missing fence, or
24
- * malformed JSON inside the fence;
25
- * - never throws.
26
- */
27
-
28
- const JSON_FENCE_RE = /```json\s*\n([\s\S]*?)\n```/;
29
-
30
- /**
31
- * Extract the parsed JSON object from the first fenced ```json``` block in
32
- * a raw string. Returns `null` for any malformed or missing input — callers
33
- * treat that as "no payload" and fall back.
34
- *
35
- * Use this variant when the caller already holds the raw comment body as a
36
- * string (e.g. after extracting `.body` themselves). Use
37
- * `parseFencedJsonComment` when working with a comment-like object.
38
- *
39
- * @param {unknown} text — the raw string to scan.
40
- * @returns {unknown | null} the parsed JSON value (typically an object),
41
- * or `null` when extraction fails.
42
- */
43
- export function parseFencedJson(text) {
44
- if (typeof text !== 'string') return null;
45
- const match = text.match(JSON_FENCE_RE);
46
- if (!match) return null;
47
- try {
48
- return JSON.parse(match[1]);
49
- } catch {
50
- return null;
51
- }
52
- }
53
-
54
- /**
55
- * Extract the parsed JSON object from the first fenced ```json``` block in
56
- * a structured comment's `body`. Returns `null` for any malformed or
57
- * missing input — callers treat that as "no payload" and fall back.
58
- *
59
- * @param {{ body?: unknown } | null | undefined} comment — a comment-like
60
- * object. Only the string `body` field is consulted.
61
- * @returns {unknown | null} the parsed JSON value (typically an object),
62
- * or `null` when extraction fails.
63
- */
64
- export function parseFencedJsonComment(comment) {
65
- if (!comment || typeof comment.body !== 'string') return null;
66
- return parseFencedJson(comment.body);
67
- }
@@ -1,88 +0,0 @@
1
- /**
2
- * pinned-override-notes.js — keep a load-bearing dependency note honest.
3
- *
4
- * `package.json` carries a `"//"` block of prose notes keyed by dotted config
5
- * path. Two of them are safety notes about a pinned `overrides` entry: they
6
- * record WHY the pin exists, which advisories removing it reintroduces, and
7
- * that the `overrides` range and the direct `dependencies` range MUST move in
8
- * lockstep because npm has no way to reference one from the other.
9
- *
10
- * A note like that is consulted precisely when someone is deciding whether a
11
- * bump is safe — so a stale version inside it hands out wrong premises about
12
- * a coupling the note itself calls a trap. Nothing enforced either claim, and
13
- * both had drifted: the note described `^4.2.0` while the pin had moved twice.
14
- *
15
- * This module derives the checks from the `"//"` keys themselves rather than
16
- * naming any package, so a second pinned override gets the same guarantee by
17
- * writing its note.
18
- */
19
-
20
- /** A `"//"` key that documents a pinned override, e.g. `overrides.js-yaml`. */
21
- const OVERRIDE_NOTE_KEY = /^overrides\.(.+)$/;
22
-
23
- import { resolvePin, scoreNote } from './pinned-override-resolve.js';
24
-
25
- /**
26
- * Audit one package document's pinned-override notes.
27
- *
28
- * Findings per documented override, each naming the drift rather than just
29
- * asserting a mismatch:
30
- * - `lockstep` — `overrides.<name>` and `dependencies.<name>` disagree. The
31
- * companion note declares they must not; a split silently gives the
32
- * direct and transitive resolutions different floors.
33
- * - `stale-note` — the note quotes at least one range but not the one in
34
- * force, so its stated version is behind the pin it describes. A note
35
- * quoting no range at all is not scored: prose that names no version
36
- * cannot go stale.
37
- * - `unsupported-shape` — the note's key resolves to something that is not a
38
- * range (a nested override object, or a `$name` reference to a dependency
39
- * that does not exist). Distinct from `orphan-note`: the pin is *there*,
40
- * the note just does not name it, and telling an author to "delete the note
41
- * or restore the pin" would be wrong advice.
42
- *
43
- * @param {{ '//'?: Record<string,string>, overrides?: Record<string,string>, dependencies?: Record<string,string> }} pkg
44
- * @returns {{ findings: Array<{ kind: string, name: string, detail: string }>, checked: string[] }}
45
- */
46
- export function auditPinnedOverrideNotes(pkg) {
47
- const overrides = pkg?.overrides ?? {};
48
- const dependencies = pkg?.dependencies ?? {};
49
- const findings = [];
50
- const checked = [];
51
-
52
- for (const { key, name, text } of documentedOverrides(pkg)) {
53
- const resolved = resolvePin({ overrides, dependencies, name });
54
- if (isCheckable(resolved)) checked.push(name);
55
- findings.push(
56
- ...scoreNote({ key, name, text, resolved, direct: dependencies[name] }),
57
- );
58
- }
59
-
60
- return { findings, checked };
61
- }
62
-
63
- /**
64
- * The `"//"` entries that document an override, as `{ key, name, text }`.
65
- * Every other note in the block — a peer-dependency rationale, say — is not
66
- * this gate's business and is skipped rather than scored.
67
- *
68
- * @param {object} pkg
69
- * @returns {Array<{ key: string, name: string, text: unknown }>}
70
- */
71
- function documentedOverrides(pkg) {
72
- return Object.entries(pkg?.['//'] ?? {})
73
- .map(([key, text]) => ({ key, text, match: OVERRIDE_NOTE_KEY.exec(key) }))
74
- .filter((entry) => entry.match !== null)
75
- .map(({ key, text, match }) => ({ key, text, name: match[1] }));
76
- }
77
-
78
- /**
79
- * Was the note's override resolved to a range at all? Only then does the name
80
- * belong in `checked` — the list is what tells a caller which pins this gate
81
- * actually stands behind.
82
- *
83
- * @param {{ kind: string }} resolved
84
- * @returns {boolean}
85
- */
86
- function isCheckable(resolved) {
87
- return resolved.kind !== 'missing' && resolved.kind !== 'unsupported';
88
- }