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,26 +1,9 @@
1
1
  /**
2
- * CLI: ratchet on cyclomatic complexity against
3
- * the fixed cyclomatic ceiling of 12 (Story #4923; the `cyclomaticMustFix`
4
- * config key was retired in Story #5313).
5
- *
6
- * The must-fix ceiling was documented as blocking (`code-quality-guardrails.md`
7
- * promises "the close-validation chain refuses the merge") while being read by
8
- * nothing. This is the consumer that makes the promise true. It joins the
9
- * standalone-ratchet family — `check-arch-cycles.js`, `check-dead-exports.js`,
10
- * `check-context-budget.js` — which the CI `baselines` job runs as a required
11
- * check, and it follows their contract exactly:
12
- *
13
- * - Reads the committed breach baseline at `baselines/cyclomatic.json`
14
- * (override with `--baseline <path>`).
15
- * - Walks the maintainability gate's `targetDirs` / `ignoreGlobs` and scores
16
- * every function with the in-repo escomplex kernel — no coverage artifact
17
- * required, so the verdict is available on a cold checkout.
18
- * - Exit 0 when clean, improved, or shrinking; exit 1 when a file gains an
19
- * over-ceiling function or its worst function gets worse.
20
- *
21
- * `--update` rewrites the baseline from the current tree. That is the
22
- * sanctioned motion after a deliberate refactor lands, and the only way the
23
- * recorded breach count is allowed to rise.
2
+ * CLI: ratchet on the fixed cyclomatic ceiling of 12 against
3
+ * `baselines/cyclomatic.json`. Scores every function in the maintainability
4
+ * gate's `targetDirs` with the in-repo escomplex kernel — no coverage artifact,
5
+ * so it works on a cold checkout. Exit 1 when a file gains an over-ceiling
6
+ * function or its worst function worsens.
24
7
  */
25
8
 
26
9
  import fs from 'node:fs';
@@ -39,8 +22,6 @@ import {
39
22
  import { resolveScanScope } from './lib/cyclomatic-scope.js';
40
23
 
41
24
  /**
42
- * Parse `--baseline <path>`, `--json`, and `--update`.
43
- *
44
25
  * @param {string[]} argv
45
26
  * @returns {{ baselinePath: string | null, json: boolean, update: boolean }}
46
27
  */
@@ -66,10 +47,8 @@ function parseArgv(argv = []) {
66
47
  }
67
48
 
68
49
  /**
69
- * Read a breach baseline envelope from disk. Returns `null` when the file is
70
- * missing or unparseable — the caller treats that as an empty baseline, which
71
- * makes the very first run report every existing breach as `added` rather than
72
- * silently passing.
50
+ * `null` when missing or unparseable — treated as empty, so a first run
51
+ * reports every breach rather than silently passing.
73
52
  *
74
53
  * @param {string} baselinePath
75
54
  * @returns {{ ceiling?: number, rows?: Array<object> } | null}
@@ -85,9 +64,7 @@ function loadCyclomaticBaseline(baselinePath) {
85
64
  }
86
65
 
87
66
  /**
88
- * `--update`: rewrite the baseline from the current (whole-tree) scan. The
89
- * sanctioned motion after a deliberate refactor lands, and the only way the
90
- * recorded breach count is allowed to rise.
67
+ * `--update`: the only way the recorded breach count may rise.
91
68
  *
92
69
  * @param {{ scan: object, ceiling: number, baselinePath: string, writeFileImpl: Function, stdout: { write: (s: string) => void } }} args
93
70
  * @returns {number} Always 0 — writing a baseline cannot fail the ratchet.
@@ -108,8 +85,6 @@ function writeUpdatedBaseline({
108
85
  }
109
86
 
110
87
  /**
111
- * `--json`: the machine-readable comparison envelope.
112
- *
113
88
  * @param {{ policy: object, baseline: object|null, baselineRows: Array<object>, baselinePath: string, scan: object, diff: object, exitCode: number }} args
114
89
  * @returns {string}
115
90
  */
@@ -142,10 +117,8 @@ function renderJsonReport({
142
117
  }
143
118
 
144
119
  /**
145
- * Announce a baseline the comparison cannot fully trust: absent, or recorded
146
- * at a ceiling the config no longer uses. Both are warnings rather than
147
- * failures — the diff still runs, and staying silent is what would let an
148
- * operator read a meaningless verdict as a clean one.
120
+ * Warn (not fail) on an absent baseline or one recorded at another ceiling,
121
+ * so a meaningless verdict is never read as clean.
149
122
  *
150
123
  * @param {{ baseline: object|null, mustFix: number, baselinePath: string, stderr: { write: (s: string) => void } }} args
151
124
  * @returns {void}
@@ -165,9 +138,6 @@ function warnAboutBaseline({ baseline, mustFix, baselinePath, stderr }) {
165
138
  }
166
139
 
167
140
  /**
168
- * Top-level CLI entry. Exported so tests can drive the whole pipeline through
169
- * the injected seams below without spawning a process.
170
- *
171
141
  * @param {{
172
142
  * argv?: string[],
173
143
  * cwd?: string,
@@ -199,10 +169,8 @@ export async function runCli({
199
169
  baselinePath ?? DEFAULT_CYCLOMATIC_BASELINE,
200
170
  );
201
171
 
202
- // Read the baseline before scanning: its rows are half the diff scope
203
- // (Story #5109). `--update` rewrites the baseline from the whole tree, and
204
- // `BASELINE_SCOPE=full` is the operator's explicit "re-derive everything",
205
- // so both opt out of scoping entirely.
172
+ // Before scanning: baseline rows are half the scan scope. `--update` and
173
+ // `BASELINE_SCOPE=full` scan the whole tree.
206
174
  const baseline = loadBaselineImpl(resolvedBaselinePath);
207
175
  const baselineRows = Array.isArray(baseline?.rows) ? baseline.rows : [];
208
176
  const scopeFiles = resolveScanScope({ cwd, config, update, baselineRows });
@@ -1,42 +1,13 @@
1
1
  /**
2
- * CLI: ratchet-down dead-export gate built on knip.
2
+ * CLI: ratchet-down dead-export gate built on knip. Diffs knip's unused
3
+ * exports — plus a `{ file, symbol: '*' }` row per module nothing imports —
4
+ * against `baselines/dead-exports.json` by `(file, symbol)`. Exit 1 only on an
5
+ * added row; a knip spawn/parse failure is advisory (exit 0 + warning) so a
6
+ * broken knip cannot block CI.
3
7
  *
4
- * Story #1852 (Epic #1831) shipped the advisory form. Story #3627 (Epic #3599)
5
- * converts it to a **ratchet-down gate**: exit 1 when `added.length > 0`
6
- * (new dead exports are not allowed), exit 0 when the diff is clean or when
7
- * only removals are detected (the baseline is shrinking, which is the success
8
- * signal). Knip spawn failures remain advisory (exit 0 + stderr warning) so a
9
- * misconfigured knip installation cannot block CI when we have no current
10
- * snapshot to compare against.
11
- *
12
- * Story #4575 adds the **production pass** (`--production`), the test-only-
13
- * importer discount: default mode counts a test as an importer, so
14
- * production-dead code hides behind its own tests. See
15
- * `lib/dead-exports-mode.js` for why the two passes carry separate baselines.
16
- *
17
- * Story #5001 widens what the ratchet can see: knip's `files` category (a
18
- * module nothing imports) now maps to a `{ file, symbol: '*' }` row alongside
19
- * the per-export rows, and `knip.json` lists `.agents/scripts/*.js` entry
20
- * points explicitly instead of by blanket glob — so a top-level CLI that
21
- * nothing invokes surfaces as dead instead of being declared live by the glob.
22
- *
23
- * Contract:
24
- * - Reads the committed baseline at `baselines/dead-exports.json` — or
25
- * `baselines/dead-exports-production.json` under `--production`
26
- * (override either with `--baseline <path>`). Envelope shape:
27
- * { $schema, kernelVersion, generatedAt, rows: [{ file, symbol }] }
28
- * - Spawns `npx knip --reporter json --no-progress` (plus `--production`),
29
- * parses stdout, extracts `{ file, symbol }` rows from `issues[].exports[]`
30
- * **and** `issues[].files[]` — the latter as one `{ file, symbol: '*' }`
31
- * whole-file row per module nothing imports (Story #5001).
32
- * - Diffs current vs. baseline by `(file, symbol)` identity.
33
- * - Prints `+ <file>: <symbol>` for each added dead export and
34
- * `- <file>: <symbol>` for each removed one, then a summary line.
35
- * - With `--json`: writes the structured envelope to stdout and skips the
36
- * human summary. The envelope still includes `added`, `removed`,
37
- * `baselineRows`, `currentRows`, and `exitCode`.
38
- * - Exit codes: 0 = clean or removals-only; 1 = added exports detected.
39
- * Knip spawn/parse failure exits 0 (advisory) with a stderr warning.
8
+ * `--production` discounts test-only importers (production-dead code hides
9
+ * behind its own tests) and uses its own baseline — see
10
+ * `lib/dead-exports-mode.js`.
40
11
  */
41
12
 
42
13
  import fs from 'node:fs';
@@ -51,9 +22,7 @@ import {
51
22
  import { resolveDeadExportsMode } from './lib/dead-exports-mode.js';
52
23
 
53
24
  /**
54
- * Parse argv for `--baseline <path>`, `--json`, `--knip-output <path>`, and
55
- * `--production`. `--knip-output` is a test seam: pass a pre-captured knip JSON
56
- * file instead of spawning knip. Exported so unit tests can pin the parser.
25
+ * `--knip-output` is a test seam: a pre-captured knip JSON instead of a spawn.
57
26
  *
58
27
  * @param {string[]} argv
59
28
  * @returns {{ baselinePath: string | null, json: boolean, knipOutputPath: string | null, production: boolean }}
@@ -87,9 +56,7 @@ export function parseArgv(argv = []) {
87
56
  }
88
57
 
89
58
  /**
90
- * Pure helper: read a baseline envelope from disk. Returns the parsed object
91
- * or `null` when the file is missing or unparseable. Exported for tests so
92
- * they can feed fixture paths.
59
+ * `null` when missing or unparseable.
93
60
  *
94
61
  * @param {string} baselinePath
95
62
  * @returns {{ kernelVersion?: string, generatedAt?: string, rows?: Array<{file: string, symbol: string}> } | null}
@@ -107,11 +74,7 @@ export function loadBaseline(baselinePath) {
107
74
  }
108
75
 
109
76
  /**
110
- * Pure helper: diff two `{ file, symbol }` row sets. Returns `added` (in
111
- * current but not baseline) and `removed` (in baseline but not current).
112
- * Identity is `<file>\0<symbol>`. Exported as the AC's "diff helper" — the
113
- * sibling test exercises both the added and removed branches against fixture
114
- * baselines without spawning knip.
77
+ * Diff two row sets by `(file, symbol)`, sorted for stable output.
115
78
  *
116
79
  * @param {Array<{ file: string, symbol: string }>} baselineRows
117
80
  * @param {Array<{ file: string, symbol: string }>} currentRows
@@ -126,7 +89,6 @@ export function diffRows(baselineRows, currentRows) {
126
89
  const currentSet = new Set((currentRows ?? []).map(key));
127
90
  const added = (currentRows ?? []).filter((r) => !baselineSet.has(key(r)));
128
91
  const removed = (baselineRows ?? []).filter((r) => !currentSet.has(key(r)));
129
- // Sort deterministically so output is stable across runs.
130
92
  const sortFn = (a, b) =>
131
93
  a.file.localeCompare(b.file) || a.symbol.localeCompare(b.symbol);
132
94
  return {
@@ -136,15 +98,8 @@ export function diffRows(baselineRows, currentRows) {
136
98
  }
137
99
 
138
100
  /**
139
- * Pure helper: render the human-readable diff. Lines:
140
- * `+ <file>: <symbol>` for added rows
141
- * `- <file>: <symbol>` for removed rows
142
- * Followed by a one-line summary even on a clean diff so operators see the
143
- * "no drift" signal. When added rows are present the summary includes a
144
- * "(gate fail)" marker so the ratchet violation is visible in CI output.
145
- *
146
- * `label` distinguishes the two passes in CI logs, which run back to back and
147
- * would otherwise emit two identical-looking summaries.
101
+ * `+`/`-` rows then a summary line. `label` tells the two back-to-back passes
102
+ * apart in CI logs.
148
103
  *
149
104
  * @param {{ added: Array, removed: Array }} diff
150
105
  * @param {string} [label='dead-exports']
@@ -162,9 +117,6 @@ export function renderDiff(diff, label = 'dead-exports') {
162
117
  }
163
118
 
164
119
  /**
165
- * Top-level CLI entry. Exported so tests can drive the full pipeline through
166
- * injected hooks without spawning knip.
167
- *
168
120
  * @param {{
169
121
  * argv?: string[],
170
122
  * cwd?: string,
@@ -213,9 +165,6 @@ export async function runCli({
213
165
  const currentRows = extractRowsFromKnip(knipEnvelope);
214
166
  const diff = diffRows(baselineRows, currentRows);
215
167
 
216
- // Ratchet-down gate: fail when new dead exports are introduced. Removals are
217
- // the success signal (baseline shrinking). Knip spawn failures stay advisory
218
- // so a misconfigured knip installation cannot block CI without a snapshot.
219
168
  const exitCode = knipError === null && diff.added.length > 0 ? 1 : 0;
220
169
 
221
170
  if (json) {
@@ -1,40 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // .agents/scripts/check-doc-links.js
4
- //
5
- // Story #2662 — Internal-link and slash-command resolver for active docs.
6
- //
7
- // Scans every `*.md` under `docs/` and `.agents/` (excluding
8
- // `docs/CHANGELOG.md`) and validates:
9
- //
10
- // 1. Every Markdown relative-path link `[text](relative/path[#anchor])`
11
- // resolves to a real file on disk (anchors are not validated, only
12
- // stripped). Absolute URLs (http(s)://, mailto:, etc.) and pure
13
- // in-document anchors (`#section`) are skipped.
14
- //
15
- // 2. Every `/<slash-command>` token in prose resolves to
16
- // `.agents/workflows/<command>.md`. A small allowlist tolerates
17
- // non-slash-command tokens such as `/temp/`, `/dev/`, and common URL
18
- // path fragments (e.g. `/issues/`, `/blob/`, `/pulls/`).
19
- //
20
- // 3. No active doc mentions any retired slash command. The retired-command
21
- // blocklist is seeded with `agents-bootstrap-github`,
22
- // `single-story-plan` (renamed to `/mandrel-plan`), and `mandrel`
23
- // (retired in favor of the generated `.agents/docs/workflows.md`
24
- // catalog) and takes precedence over the workflow-resolution check —
25
- // a retired token is always a non-zero exit even if a stale workflow
26
- // file happens to exist.
27
- //
28
- // 4. Story #4801 — every relative link originating under `.agents/**`
29
- // resolves to a target that still exists once the tree is materialized
30
- // into a *consumer* project. See `escapesPayload` for the boundary rule.
31
- //
32
- // Exit codes:
33
- // 0 every link and slash-command token resolves cleanly.
34
- // 1 at least one violation; details are written to stderr (file:line).
35
- //
36
- // Helpers (region scanner, token tokenizer, etc.) are intentionally inlined
37
- // per the parent Story's design constraint.
3
+ // Resolves relative Markdown links and `/slash-command` tokens across active
4
+ // docs (anchors stripped, not validated), rejects retired commands even when a
5
+ // stale workflow file exists, and rejects `.agents/**` links that escape the
6
+ // materialized payload.
38
7
 
39
8
  import fs from 'node:fs';
40
9
  import path from 'node:path';
@@ -48,39 +17,23 @@ const __filename = fileURLToPath(import.meta.url);
48
17
  const __dirname = path.dirname(__filename);
49
18
  const REPO_ROOT = path.resolve(__dirname, '..', '..');
50
19
 
51
- // --- Static config ---------------------------------------------------------
52
-
53
- // Retired slash-command tokens that MUST NOT appear in any active doc.
54
- // Tokens are stored WITHOUT the leading slash.
20
+ // Stored without the leading slash, as are the sets below.
55
21
  export const RETIRED_COMMANDS = new Set([
56
22
  'agents-bootstrap-github',
57
23
  'single-story-plan',
58
24
  'mandrel',
59
- // #4482 — dead workflow surface retired (host-native equivalents).
60
25
  'explain',
61
26
  'git-merge-pr',
62
27
  ]);
63
28
 
64
- // Command spellings a *historical* record may still name, keyed by the file
65
- // allowed to name them. A decisions log that cannot quote the name a command
66
- // had is a broken record: an ADR describes the world as it was, so freezing
67
- // its prose is the point. Scoped per-file and per-token rather than
68
- // allowlisted globally — everywhere else these are simply wrong, and a typo
69
- // like `/mandrl-plan` must still fail here. Story #5126 renamed `/plan` →
70
- // `/mandrel-plan` and `/deliver` → `/mandrel-deliver`; the ADRs that decided
71
- // the Story-only model still name them as they were called then.
29
+ // Old command names a historical record (an ADR) may still quote, scoped
30
+ // per-file and per-token so a typo elsewhere still fails.
72
31
  export const SUPERSEDED_COMMAND_SPELLINGS = new Map([
73
32
  ['docs/decisions.md', new Set(['plan', 'deliver'])],
74
33
  ]);
75
34
 
76
- // Tokens that look like `/foo` in prose but are not slash commands. Tokens
77
- // are stored WITHOUT the leading slash. The list focuses on common URL path
78
- // fragments and on-disk path roots that appear in tutorial prose. The
79
- // scanner additionally suppresses tokens whose surrounding context makes
80
- // them obviously non-command (see `isCodeFence` and the URL-context heuristic
81
- // in `extractSlashTokens`).
35
+ // `/foo` tokens in prose that are path roots or URL fragments, not commands.
82
36
  export const SLASH_ALLOWLIST = new Set([
83
- // workspace/conventional roots
84
37
  'temp',
85
38
  'dev',
86
39
  'tmp',
@@ -97,7 +50,6 @@ export const SLASH_ALLOWLIST = new Set([
97
50
  'proc',
98
51
  'sys',
99
52
  'c',
100
- // common GitHub / git URL path fragments
101
53
  'issues',
102
54
  'pull',
103
55
  'pulls',
@@ -121,7 +73,6 @@ export const SLASH_ALLOWLIST = new Set([
121
73
  'milestones',
122
74
  'projects',
123
75
  'tags',
124
- // generic URL path fragments
125
76
  'docs',
126
77
  'guide',
127
78
  'reference',
@@ -136,33 +87,18 @@ export const SLASH_ALLOWLIST = new Set([
136
87
  'src',
137
88
  'lib',
138
89
  'node_modules',
139
- // common framework / tool URL roots
140
90
  'workflows',
141
91
  'features',
142
92
  'main',
143
93
  ]);
144
94
 
145
- // --- Payload boundary (Story #4801) ----------------------------------------
146
-
147
- // `mandrel sync` materializes ONLY the package's `.agents/` payload into a
148
- // consumer's project, at `<projectRoot>/.agents` (see `lib/cli/sync.js`:
149
- // `destRoot = path.join(projectRoot, '.agents')`). `bin/` and `lib/` ship
150
- // inside the npm tarball but stay under `node_modules/mandrel/`, and the
151
- // framework's own `tests/`, `docs/` (bar the CHANGELOG) and `.claude/` trees
152
- // ship nowhere at all. So a relative link that escapes `.agents/` resolves
153
- // cleanly in THIS repo and dangles in every consumer — which is exactly why
154
- // the checker cannot catch this class by `fs.existsSync` alone.
155
- //
156
- // This is why the boundary is `.agents/` and NOT `package.json#files`: the
157
- // latter lists `lib/` and `bin/`, which are packaged but never materialized
158
- // at a consumer's repo root.
95
+ // `mandrel sync` materializes only `.agents/` into a consumer (`bin/`, `lib/`
96
+ // stay in node_modules; tests/docs ship nowhere), so a link escaping it
97
+ // resolves here yet dangles for every consumer — existence alone can't catch it.
159
98
  export const MATERIALIZED_ROOT = '.agents';
160
99
 
161
- // Repo-root-relative paths OUTSIDE `.agents/` that a Mandrel *consumer*
162
- // legitimately owns, so a doc under `.agents/**` may still link to them.
163
- // Deliberately explicit rather than pattern-derived: whether a given repo-root
164
- // path is consumer-owned or framework-only is a judgment per path, not a rule.
165
- // A new escaping link fails closed until it is justified and added here.
100
+ // Consumer-owned paths outside `.agents/`, listed explicitly so a new escaping
101
+ // link fails closed until justified here.
166
102
  export const CONSUMER_OWNED_PATHS = new Set([
167
103
  'package.json',
168
104
  '.agentrc.json',
@@ -171,19 +107,12 @@ export const CONSUMER_OWNED_PATHS = new Set([
171
107
  'docs/decisions.md',
172
108
  ]);
173
109
 
174
- // Directory prefixes (repo-root-relative, trailing slash) whose whole subtree
175
- // is consumer-owned.
176
110
  export const CONSUMER_OWNED_PREFIXES = Object.freeze(['baselines/']);
177
111
 
178
112
  /**
179
- * True when `relTarget` is unreachable from a materialized consumer tree.
180
- *
181
- * Only links whose SOURCE lives under `.agents/**` are subject to the rule —
182
- * `docs/**` is framework-repo-only, ships nowhere, and keeps today's
183
- * existence-only semantics.
184
- *
185
- * @param {string} relFile repo-relative POSIX path of the linking document
186
- * @param {string} relTarget repo-relative POSIX path the link resolves to
113
+ * Only links whose source is under `.agents/**` are subject to the rule.
114
+ * @param {string} relFile
115
+ * @param {string} relTarget
187
116
  */
188
117
  export function escapesPayload(relFile, relTarget) {
189
118
  if (!relFile.startsWith(`${MATERIALIZED_ROOT}/`)) return false;
@@ -199,8 +128,6 @@ export function escapesPayload(relFile, relTarget) {
199
128
  return true;
200
129
  }
201
130
 
202
- // --- File discovery --------------------------------------------------------
203
-
204
131
  function isExcludedRelPath(relPath) {
205
132
  if (relPath === 'docs/CHANGELOG.md') return true;
206
133
  return false;
@@ -226,12 +153,9 @@ function walkMarkdown(dirAbs, repoRoot, out) {
226
153
  }
227
154
 
228
155
  /**
229
- * Collect every non-excluded `*.md` under each `scanRoots` entry.
230
- *
231
- * @param {string} rootAbs absolute repo root
232
- * @param {string[]} scanRoots repo-relative subtrees to walk
233
- * @param {string[]} [exclude] minimatch globs; a repo-relative POSIX path
234
- * matching any of them is dropped from the scan
156
+ * @param {string} rootAbs
157
+ * @param {string[]} scanRoots
158
+ * @param {string[]} [exclude] minimatch globs over repo-relative POSIX paths
235
159
  */
236
160
  export function discoverMarkdown(rootAbs, scanRoots, exclude = []) {
237
161
  const out = [];
@@ -249,13 +173,8 @@ export function discoverMarkdown(rootAbs, scanRoots, exclude = []) {
249
173
  return filtered;
250
174
  }
251
175
 
252
- // --- Region masking --------------------------------------------------------
253
-
254
- // Returns a copy of `source` where the contents of every fenced code block
255
- // and every inline code span are replaced by spaces. Newlines are preserved
256
- // so that line numbers stay aligned for downstream tokenizers. Fenced blocks
257
- // are matched on `` ``` `` or `~~~` openers at column 0 (with optional
258
- // indentation) and the closing fence MUST match the opener marker.
176
+ // Blanks fenced blocks and inline code spans, preserving newlines so line
177
+ // numbers stay aligned; a closing fence must match its opener's marker.
259
178
  export function maskCodeRegions(source) {
260
179
  const lines = source.split('\n');
261
180
  const out = new Array(lines.length);
@@ -265,7 +184,6 @@ export function maskCodeRegions(source) {
265
184
  const line = lines[i];
266
185
  const fenceMatch = line.match(/^(\s{0,3})(`{3,}|~{3,})/);
267
186
  if (inFence) {
268
- // Blank the line; keep an empty string so newline survives the join.
269
187
  out[i] = '';
270
188
  if (
271
189
  fenceMatch?.[2].startsWith(fenceMarker[0]) &&
@@ -282,17 +200,11 @@ export function maskCodeRegions(source) {
282
200
  out[i] = '';
283
201
  continue;
284
202
  }
285
- // Strip inline code spans (`...`). We do not need to honor escaped
286
- // backticks for this checker — slash tokens inside inline code are not
287
- // command references regardless.
288
203
  out[i] = line.replace(/`[^`\n]*`/g, (m) => ' '.repeat(m.length));
289
204
  }
290
205
  return out.join('\n');
291
206
  }
292
207
 
293
- // --- Link extraction -------------------------------------------------------
294
-
295
- // Returns absolute char offset → 1-indexed line number lookup.
296
208
  function offsetToLine(source, offset) {
297
209
  let line = 1;
298
210
  for (let i = 0; i < offset && i < source.length; i++) {
@@ -301,10 +213,7 @@ function offsetToLine(source, offset) {
301
213
  return line;
302
214
  }
303
215
 
304
- // Match Markdown inline links `[text](target)`. We deliberately keep the
305
- // regex simple: `text` may not contain `]`, and `target` may not contain
306
- // whitespace or `)`. Reference-style links are out of scope for this
307
- // checker (the repo uses inline links exclusively).
216
+ // Inline links only; reference-style links are out of scope.
308
217
  const LINK_RE = /\[([^\]]*)\]\(([^)\s]+)\)/g;
309
218
 
310
219
  export function extractLinks(masked) {
@@ -337,13 +246,8 @@ function stripAnchorAndQuery(target) {
337
246
  return t;
338
247
  }
339
248
 
340
- // Percent-decode a link target's path portion (Story #5090). A correctly
341
- // encoded Markdown destination escapes URL-reserved characters — a
342
- // file-based router's `[token]` segment is written `%5Btoken%5D`, the form
343
- // CommonMark renderers require — but the filesystem knows only the decoded
344
- // name. The decode is one-way and total: a malformed escape (`%zz`) degrades
345
- // to the raw string instead of throwing `URIError`, so an undecodable target
346
- // is resolved exactly as it was before.
249
+ // The filesystem knows only decoded names (`%5Btoken%5D` → `[token]`); a
250
+ // malformed escape falls back to the raw string instead of throwing.
347
251
  function decodeLinkPath(pathOnly) {
348
252
  if (!pathOnly.includes('%')) return pathOnly;
349
253
  try {
@@ -353,25 +257,9 @@ function decodeLinkPath(pathOnly) {
353
257
  }
354
258
  }
355
259
 
356
- // --- Slash-token extraction ------------------------------------------------
357
-
358
- // Tokens look like `/<lowercase-alphanum-with-hyphens>`. We exclude tokens
359
- // preceded by a word character or another slash (URL paths, `http://...`),
360
- // and tokens immediately followed by a word/`-` character (so we match the
361
- // whole command, not a prefix).
362
- // A slash token is `/<name>` where:
363
- // - the preceding char is NOT a word char, `/`, `:`, `.`, `>`, `]`, `)`,
364
- // so we don't match URL path segments or fragments embedded in paths
365
- // like `temp/run-<id>/lifecycle.ndjson` (preceded by `>`) or
366
- // `temp/run-[ID]/tickets.json` (preceded by `]`).
367
- // - the following char is NOT a word char, `-`, or `.`, so file
368
- // extensions like `/tickets.json` and identifier suffixes don't match.
369
- // The optional `(?::[a-z][a-z0-9-]*)?` tail captures the namespaced
370
- // `/loops:<name>` command form (Story #4289). Without it the matcher would
371
- // stop at `loops` and try to resolve `.agents/workflows/loops.md`, which does
372
- // not exist — loop units live under `loops/<name>.md`. The resolver below
373
- // splits the captured `loops:<name>` token on the `:` to resolve the
374
- // namespaced path.
260
+ // The lookbehind rejects path segments (`run-<id>/x`, `run-[ID]/x`, URLs);
261
+ // the lookahead rejects extensions and prefixes. The optional `:name` tail
262
+ // captures namespaced `/loops:<name>` commands.
375
263
  const SLASH_TOKEN_RE =
376
264
  /(?<![\w/:.>\])])\/([a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)?)(?![\w.-])/g;
377
265
 
@@ -389,15 +277,9 @@ export function extractSlashTokens(masked) {
389
277
  return out;
390
278
  }
391
279
 
392
- // --- Per-file check --------------------------------------------------------
393
-
394
280
  /**
395
- * The slash tokens `relFile` may name without resolving to a workflow: the
396
- * global allowlist, plus any superseded spelling this particular file is
397
- * allowed to quote.
398
- *
399
- * @param {string} relFile Repo-relative path of the file being checked.
400
- * @returns {Set<string>} Tokens to skip, stored without the leading slash.
281
+ * @param {string} relFile
282
+ * @returns {Set<string>}
401
283
  */
402
284
  function slashAllowlistFor(relFile) {
403
285
  const superseded = SUPERSEDED_COMMAND_SPELLINGS.get(relFile);
@@ -413,15 +295,9 @@ export function checkFile(absPath, repoRoot) {
413
295
  const relFile = path.relative(repoRoot, absPath).split(path.sep).join('/');
414
296
  const workflowsDir = path.join(repoRoot, '.agents', 'workflows');
415
297
 
416
- // Tokenize the masked source once and reuse the array across both the
417
- // retired-command sweep and the slash-command resolution pass below.
418
298
  const slashTokens = extractSlashTokens(masked);
419
299
 
420
- // 1. Retired-command sweep — runs against the masked source so command
421
- // references inside fenced examples don't trip us, but we still catch
422
- // every prose mention. Retired-command checks ALWAYS take precedence:
423
- // even if the token would otherwise be allowlisted or resolved, a hit
424
- // here is a non-zero exit.
300
+ // Retired commands win over the allowlist and over resolution.
425
301
  for (const { token, line } of slashTokens) {
426
302
  if (RETIRED_COMMANDS.has(token)) {
427
303
  violations.push({
@@ -433,26 +309,19 @@ export function checkFile(absPath, repoRoot) {
433
309
  }
434
310
  }
435
311
 
436
- // 2. Relative-link resolution.
437
312
  for (const { target, line } of extractLinks(masked)) {
438
313
  if (isExternalOrInternalAnchor(target)) continue;
439
314
  const rawPathOnly = stripAnchorAndQuery(target);
440
- if (!rawPathOnly) continue; // pure anchor that survived earlier check
441
- // Decode AFTER anchor/query stripping — so an escaped `%23` cannot
442
- // collapse into an anchor delimiter and truncate the target — and BEFORE
443
- // resolution, so the payload-boundary branch below reports the decoded
444
- // path rather than the escaped one.
315
+ if (!rawPathOnly) continue;
316
+ // Decode after stripping, so an escaped `%23` cannot become an anchor.
445
317
  const pathOnly = decodeLinkPath(rawPathOnly);
446
318
  let resolved;
447
319
  if (pathOnly.startsWith('/')) {
448
- // Treat root-absolute paths as repo-root relative.
449
320
  resolved = path.join(repoRoot, pathOnly);
450
321
  } else {
451
322
  resolved = path.resolve(fileDir, pathOnly);
452
323
  }
453
- // Payload boundary (Story #4801) takes precedence over existence: a link
454
- // that escapes the materialized tree is a defect even when the target
455
- // exists here, and reporting both kinds for one link would double-count.
324
+ // Boundary wins over existence; one link reports one kind.
456
325
  const relTarget = path
457
326
  .relative(repoRoot, resolved)
458
327
  .split(path.sep)
@@ -480,19 +349,11 @@ export function checkFile(absPath, repoRoot) {
480
349
  }
481
350
  }
482
351
 
483
- // 3. Slash-command resolution. Skip retired hits (already reported),
484
- // allowlisted tokens, and a superseded spelling in the one file allowed
485
- // to quote it (SUPERSEDED_COMMAND_SPELLINGS). A command is valid if it resolves to a top-level
486
- // workflow file OR to a helpers/ module (helpers are not projected into
487
- // the `.claude/commands/` tree but are still legitimate named workflows
488
- // that parent workflows invoke by prose reference).
352
+ // A helpers/ module is a valid command target too.
489
353
  const slashAllowlist = slashAllowlistFor(relFile);
490
354
  for (const { token, line } of slashTokens) {
491
355
  if (RETIRED_COMMANDS.has(token)) continue;
492
356
  if (slashAllowlist.has(token)) continue;
493
- // Namespaced loop commands (`/loops:<name>`, Story #4289) resolve to a
494
- // loop unit under `.agents/workflows/loops/<name>.md`. Split on the `:`
495
- // and resolve the namespaced path rather than a flat `loops:<name>.md`.
496
357
  if (token.includes(':')) {
497
358
  const [ns, name] = token.split(':');
498
359
  const nsFile = path.join(workflowsDir, ns, `${name}.md`);
@@ -521,18 +382,13 @@ export function checkFile(absPath, repoRoot) {
521
382
  return violations;
522
383
  }
523
384
 
524
- // --- Public entry point ----------------------------------------------------
525
-
526
385
  export const DEFAULT_SCAN_ROOTS = Object.freeze(['docs', '.agents']);
527
386
 
528
387
  /**
529
- * Run the checker programmatically. Returns `{ exitCode, violations }`.
530
- * `exitCode` is 0 when every doc is clean, 1 otherwise.
531
- *
532
388
  * @param {object} [options]
533
- * @param {string} [options.repoRoot] Defaults to the framework repo root.
534
- * @param {string[]} [options.scanRoots] Defaults to `['docs', '.agents']`.
535
- * @param {string[]} [options.exclude] minimatch globs dropped from the scan.
389
+ * @param {string} [options.repoRoot]
390
+ * @param {string[]} [options.scanRoots]
391
+ * @param {string[]} [options.exclude]
536
392
  */
537
393
  export function runCheck(options = {}) {
538
394
  const repoRoot = options.repoRoot ?? REPO_ROOT;
@@ -555,11 +411,7 @@ function formatViolation(v) {
555
411
  return `${v.file}:${v.line}: [${v.kind}] ${v.message}`;
556
412
  }
557
413
 
558
- /**
559
- * Translate argv into `runCheck` options. Repeatable `--scan-root` replaces
560
- * the default scan set entirely; repeatable `--exclude` filters whatever was
561
- * scanned. Absent flags reproduce the pre-#4801 defaults exactly.
562
- */
414
+ /** `--scan-root` replaces the default set; `--exclude` filters what was scanned. */
563
415
  export function parseArgs(argv) {
564
416
  const { values } = parseStandardCliArgs({
565
417
  argv,