mandrel 1.57.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 (843) hide show
  1. package/.agents/README.md +954 -0
  2. package/.agents/docs/SDLC.md +1420 -0
  3. package/.agents/docs/agentrc-reference.json +278 -0
  4. package/.agents/docs/configuration.md +1040 -0
  5. package/.agents/docs/workflows.md +59 -0
  6. package/.agents/instructions.md +384 -0
  7. package/.agents/personas/architect.md +107 -0
  8. package/.agents/personas/devops-engineer.md +36 -0
  9. package/.agents/personas/engineer-mobile.md +119 -0
  10. package/.agents/personas/engineer-web.md +110 -0
  11. package/.agents/personas/engineer.md +90 -0
  12. package/.agents/personas/product.md +88 -0
  13. package/.agents/personas/project-manager.md +110 -0
  14. package/.agents/personas/qa-engineer.md +91 -0
  15. package/.agents/personas/refactorer.md +110 -0
  16. package/.agents/personas/security-engineer.md +112 -0
  17. package/.agents/personas/sre.md +86 -0
  18. package/.agents/personas/technical-writer.md +100 -0
  19. package/.agents/personas/ux-designer.md +95 -0
  20. package/.agents/rules/api-conventions.md +75 -0
  21. package/.agents/rules/changelog-style.md +238 -0
  22. package/.agents/rules/gherkin-standards.md +146 -0
  23. package/.agents/rules/git-conventions.md +146 -0
  24. package/.agents/rules/orchestration-error-handling.md +35 -0
  25. package/.agents/rules/security-baseline.md +92 -0
  26. package/.agents/rules/shell-conventions.md +70 -0
  27. package/.agents/rules/test-seams.md +59 -0
  28. package/.agents/rules/testing-standards.md +177 -0
  29. package/.agents/runtime-deps.json +18 -0
  30. package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
  31. package/.agents/schemas/agentrc.schema.json +1583 -0
  32. package/.agents/schemas/audit-results.schema.json +69 -0
  33. package/.agents/schemas/audit-rules.json +134 -0
  34. package/.agents/schemas/audit-rules.schema.json +69 -0
  35. package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
  36. package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
  37. package/.agents/schemas/baselines/coverage.schema.json +50 -0
  38. package/.agents/schemas/baselines/crap.schema.json +52 -0
  39. package/.agents/schemas/baselines/duplication.schema.json +62 -0
  40. package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
  41. package/.agents/schemas/baselines/lint.schema.json +47 -0
  42. package/.agents/schemas/baselines/maintainability.schema.json +71 -0
  43. package/.agents/schemas/baselines/mutation.schema.json +52 -0
  44. package/.agents/schemas/crap-baseline.schema.json +57 -0
  45. package/.agents/schemas/crap-report.schema.json +102 -0
  46. package/.agents/schemas/dispatch-manifest.json +232 -0
  47. package/.agents/schemas/epic-perf-report.schema.json +89 -0
  48. package/.agents/schemas/epic-spec.schema.json +183 -0
  49. package/.agents/schemas/friction-event.schema.json +56 -0
  50. package/.agents/schemas/lifecycle/README.md +18 -0
  51. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
  52. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
  53. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
  54. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
  55. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
  56. package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
  57. package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
  58. package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
  59. package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
  60. package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
  61. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
  62. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
  63. package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
  64. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
  65. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
  66. package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
  67. package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
  68. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
  69. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
  70. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
  71. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
  72. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
  73. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
  74. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
  75. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
  76. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
  77. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
  78. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
  79. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
  80. package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
  81. package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
  82. package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
  83. package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
  84. package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
  85. package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
  86. package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
  87. package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
  88. package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
  89. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
  90. package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
  91. package/.agents/schemas/mi-report.schema.json +58 -0
  92. package/.agents/schemas/model-attribution.schema.json +49 -0
  93. package/.agents/schemas/qa-finding.schema.json +133 -0
  94. package/.agents/schemas/qa-ledger.schema.json +89 -0
  95. package/.agents/schemas/risk-verdict.schema.json +53 -0
  96. package/.agents/schemas/signal-event.schema.json +58 -0
  97. package/.agents/schemas/skill.schema.json +31 -0
  98. package/.agents/schemas/skills-index.schema.json +81 -0
  99. package/.agents/schemas/story-perf-summary.schema.json +73 -0
  100. package/.agents/schemas/validation-evidence.schema.json +78 -0
  101. package/.agents/scripts/README.md +93 -0
  102. package/.agents/scripts/acceptance-eval.js +284 -0
  103. package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
  104. package/.agents/scripts/agents-bootstrap-github.js +634 -0
  105. package/.agents/scripts/analyze-execution.js +369 -0
  106. package/.agents/scripts/assert-branch.js +83 -0
  107. package/.agents/scripts/audit-labels-bootstrap.js +253 -0
  108. package/.agents/scripts/audit-to-stories.js +257 -0
  109. package/.agents/scripts/bootstrap.js +1378 -0
  110. package/.agents/scripts/check-baselines.js +81 -0
  111. package/.agents/scripts/check-dead-exports.js +311 -0
  112. package/.agents/scripts/check-doc-links.js +401 -0
  113. package/.agents/scripts/check-gherkin-placeholders.js +663 -0
  114. package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
  115. package/.agents/scripts/check-lifecycle-lint.js +379 -0
  116. package/.agents/scripts/check-prepush-recovery.js +90 -0
  117. package/.agents/scripts/check-windows-git-perf.js +138 -0
  118. package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
  119. package/.agents/scripts/coverage-capture.js +112 -0
  120. package/.agents/scripts/detect-merges.js +111 -0
  121. package/.agents/scripts/diagnose-friction.js +257 -0
  122. package/.agents/scripts/diagnose.js +240 -0
  123. package/.agents/scripts/dispatcher.js +295 -0
  124. package/.agents/scripts/drain-pending-cleanup.js +147 -0
  125. package/.agents/scripts/epic-audit-prepare.js +419 -0
  126. package/.agents/scripts/epic-audit-recheck.js +241 -0
  127. package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
  128. package/.agents/scripts/epic-deliver-preflight.js +407 -0
  129. package/.agents/scripts/epic-deliver-prepare.js +383 -0
  130. package/.agents/scripts/epic-execute-record-wave.js +463 -0
  131. package/.agents/scripts/epic-plan-clarity.js +201 -0
  132. package/.agents/scripts/epic-plan-decompose.js +79 -0
  133. package/.agents/scripts/epic-plan-healthcheck.js +363 -0
  134. package/.agents/scripts/epic-plan-spec-validate.js +111 -0
  135. package/.agents/scripts/epic-plan-spec.js +198 -0
  136. package/.agents/scripts/epic-reconcile.js +637 -0
  137. package/.agents/scripts/evidence-gate.js +235 -0
  138. package/.agents/scripts/generate-config-docs.js +516 -0
  139. package/.agents/scripts/generate-lifecycle-docs.js +224 -0
  140. package/.agents/scripts/generate-skills-index.js +252 -0
  141. package/.agents/scripts/generate-workflows-doc.js +168 -0
  142. package/.agents/scripts/git-cleanup.js +124 -0
  143. package/.agents/scripts/git-pr-quality-gate.js +203 -0
  144. package/.agents/scripts/git-rebase-and-resolve.js +234 -0
  145. package/.agents/scripts/hierarchy-gate.js +176 -0
  146. package/.agents/scripts/hydrate-context.js +179 -0
  147. package/.agents/scripts/install-matrix-assert.js +282 -0
  148. package/.agents/scripts/lib/Graph.js +326 -0
  149. package/.agents/scripts/lib/ITicketingProvider.js +349 -0
  150. package/.agents/scripts/lib/Logger.js +194 -0
  151. package/.agents/scripts/lib/audit-suite/cli.js +64 -0
  152. package/.agents/scripts/lib/audit-suite/findings.js +164 -0
  153. package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
  154. package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
  155. package/.agents/scripts/lib/audit-suite/index.js +22 -0
  156. package/.agents/scripts/lib/audit-suite/runner.js +233 -0
  157. package/.agents/scripts/lib/audit-suite/selector.js +235 -0
  158. package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
  159. package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
  160. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
  161. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
  162. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
  163. package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
  164. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
  165. package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
  166. package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
  167. package/.agents/scripts/lib/baseline-loader.js +0 -0
  168. package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
  169. package/.agents/scripts/lib/baseline-snapshot.js +716 -0
  170. package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
  171. package/.agents/scripts/lib/baselines/components.js +126 -0
  172. package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
  173. package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
  174. package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
  175. package/.agents/scripts/lib/baselines/envelope.js +368 -0
  176. package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
  177. package/.agents/scripts/lib/baselines/git-base.js +0 -0
  178. package/.agents/scripts/lib/baselines/kernel.js +111 -0
  179. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
  180. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
  181. package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
  182. package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
  183. package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
  184. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
  185. package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
  186. package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
  187. package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
  188. package/.agents/scripts/lib/baselines/path-canon.js +279 -0
  189. package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
  190. package/.agents/scripts/lib/baselines/reader.js +321 -0
  191. package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
  192. package/.agents/scripts/lib/baselines/scope.js +291 -0
  193. package/.agents/scripts/lib/baselines/writer.js +312 -0
  194. package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
  195. package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
  196. package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
  197. package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
  198. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
  199. package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
  200. package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
  201. package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
  202. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
  203. package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
  204. package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
  205. package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
  206. package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
  207. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
  208. package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
  209. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
  210. package/.agents/scripts/lib/bootstrap/summary.js +75 -0
  211. package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
  212. package/.agents/scripts/lib/branch-name-guard.js +98 -0
  213. package/.agents/scripts/lib/c8-cli-path.js +21 -0
  214. package/.agents/scripts/lib/changed-files.js +184 -0
  215. package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
  216. package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
  217. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
  218. package/.agents/scripts/lib/checks/index.js +288 -0
  219. package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
  220. package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
  221. package/.agents/scripts/lib/checks/state.js +558 -0
  222. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
  223. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
  224. package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
  225. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
  226. package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
  227. package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
  228. package/.agents/scripts/lib/cli/standard-args.js +351 -0
  229. package/.agents/scripts/lib/cli-args.js +286 -0
  230. package/.agents/scripts/lib/cli-utils.js +69 -0
  231. package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
  232. package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
  233. package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
  234. package/.agents/scripts/lib/close-validation.js +897 -0
  235. package/.agents/scripts/lib/codebase-snapshot.js +513 -0
  236. package/.agents/scripts/lib/command-header.js +33 -0
  237. package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
  238. package/.agents/scripts/lib/config/baselines.js +60 -0
  239. package/.agents/scripts/lib/config/ci.js +30 -0
  240. package/.agents/scripts/lib/config/commands.js +36 -0
  241. package/.agents/scripts/lib/config/defaults.js +119 -0
  242. package/.agents/scripts/lib/config/explain.js +348 -0
  243. package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
  244. package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
  245. package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
  246. package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
  247. package/.agents/scripts/lib/config/gates/index.js +36 -0
  248. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
  249. package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
  250. package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
  251. package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
  252. package/.agents/scripts/lib/config/gates/shared.js +117 -0
  253. package/.agents/scripts/lib/config/github.js +122 -0
  254. package/.agents/scripts/lib/config/lifecycle.js +40 -0
  255. package/.agents/scripts/lib/config/limits.js +211 -0
  256. package/.agents/scripts/lib/config/paths.js +73 -0
  257. package/.agents/scripts/lib/config/preflight.js +58 -0
  258. package/.agents/scripts/lib/config/quality.js +665 -0
  259. package/.agents/scripts/lib/config/retro.js +77 -0
  260. package/.agents/scripts/lib/config/runners.js +105 -0
  261. package/.agents/scripts/lib/config/runtime.js +167 -0
  262. package/.agents/scripts/lib/config/shared.js +46 -0
  263. package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
  264. package/.agents/scripts/lib/config/temp-paths.js +373 -0
  265. package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
  266. package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
  267. package/.agents/scripts/lib/config-resolver.js +298 -0
  268. package/.agents/scripts/lib/config-schema-shared.js +32 -0
  269. package/.agents/scripts/lib/config-schema.js +20 -0
  270. package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
  271. package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
  272. package/.agents/scripts/lib/config-settings-schema.js +420 -0
  273. package/.agents/scripts/lib/coverage-baseline.js +352 -0
  274. package/.agents/scripts/lib/coverage-capture.js +195 -0
  275. package/.agents/scripts/lib/coverage-utils.js +239 -0
  276. package/.agents/scripts/lib/cpu-pool.js +223 -0
  277. package/.agents/scripts/lib/crap-engine.js +119 -0
  278. package/.agents/scripts/lib/crap-utils.js +479 -0
  279. package/.agents/scripts/lib/degraded-mode.js +69 -0
  280. package/.agents/scripts/lib/dependency-parser.js +129 -0
  281. package/.agents/scripts/lib/duplicate-search.js +189 -0
  282. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
  283. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
  284. package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
  285. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
  286. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
  287. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
  288. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
  289. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
  290. package/.agents/scripts/lib/env-loader.js +52 -0
  291. package/.agents/scripts/lib/epic-merge-lock.js +239 -0
  292. package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
  293. package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
  294. package/.agents/scripts/lib/error-redactor.js +125 -0
  295. package/.agents/scripts/lib/errors/index.js +67 -0
  296. package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
  297. package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
  298. package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
  299. package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
  300. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
  301. package/.agents/scripts/lib/findings/classify-finding.js +195 -0
  302. package/.agents/scripts/lib/findings/promote-finding.js +353 -0
  303. package/.agents/scripts/lib/findings/route-finding.js +283 -0
  304. package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
  305. package/.agents/scripts/lib/findings/severity.js +102 -0
  306. package/.agents/scripts/lib/gates/baseline-store.js +106 -0
  307. package/.agents/scripts/lib/gates/friction.js +43 -0
  308. package/.agents/scripts/lib/gh-exec.js +553 -0
  309. package/.agents/scripts/lib/git/cached-fetch.js +0 -0
  310. package/.agents/scripts/lib/git/sync-from-base.js +162 -0
  311. package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
  312. package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
  313. package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
  314. package/.agents/scripts/lib/git-utils.js +363 -0
  315. package/.agents/scripts/lib/github-url.js +29 -0
  316. package/.agents/scripts/lib/install-cmd-parser.js +51 -0
  317. package/.agents/scripts/lib/issue-link-parser.js +74 -0
  318. package/.agents/scripts/lib/json-utils.js +60 -0
  319. package/.agents/scripts/lib/label-constants.js +169 -0
  320. package/.agents/scripts/lib/label-taxonomy.js +200 -0
  321. package/.agents/scripts/lib/maintainability-engine.js +164 -0
  322. package/.agents/scripts/lib/maintainability-utils.js +343 -0
  323. package/.agents/scripts/lib/mandrel-catalog.js +170 -0
  324. package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
  325. package/.agents/scripts/lib/mutation/config-detector.js +119 -0
  326. package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
  327. package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
  328. package/.agents/scripts/lib/notifications/notifier.js +75 -0
  329. package/.agents/scripts/lib/observability/active-story-env.js +182 -0
  330. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
  331. package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
  332. package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
  333. package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
  334. package/.agents/scripts/lib/observability/signals-writer.js +296 -0
  335. package/.agents/scripts/lib/observability/source-classifier.js +103 -0
  336. package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
  337. package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
  338. package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
  339. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
  340. package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
  341. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
  342. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
  343. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
  344. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
  345. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
  346. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
  347. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
  348. package/.agents/scripts/lib/orchestration/code-review.js +652 -0
  349. package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
  350. package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
  351. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
  352. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
  353. package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
  354. package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
  355. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
  356. package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
  357. package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
  358. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
  359. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
  360. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
  361. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
  362. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
  363. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
  364. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
  365. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
  366. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
  367. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
  368. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
  369. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
  370. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
  371. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
  372. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
  373. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
  374. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
  375. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
  376. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
  377. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
  378. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
  379. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
  380. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
  381. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
  382. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
  383. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
  384. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
  385. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
  386. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
  387. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
  388. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
  389. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
  390. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
  391. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
  392. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
  393. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
  394. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
  395. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
  396. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
  397. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
  398. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
  399. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
  400. package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
  401. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
  402. package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
  403. package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
  404. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
  405. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
  406. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
  407. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
  408. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
  409. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
  410. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
  411. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
  412. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
  413. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
  414. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
  415. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
  416. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
  417. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
  418. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
  419. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
  420. package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
  421. package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
  422. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
  423. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
  424. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
  425. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
  426. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
  427. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
  428. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
  429. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
  430. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
  431. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
  432. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
  433. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
  434. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
  435. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
  436. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
  437. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
  438. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
  439. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
  440. package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
  441. package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
  442. package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
  443. package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
  444. package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
  445. package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
  446. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
  447. package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
  448. package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
  449. package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
  450. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
  451. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
  452. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
  453. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
  454. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
  455. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
  456. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
  457. package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
  458. package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
  459. package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
  460. package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
  461. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
  462. package/.agents/scripts/lib/orchestration/recut.js +56 -0
  463. package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
  464. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
  465. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
  466. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
  467. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
  468. package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
  469. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
  470. package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
  471. package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
  472. package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
  473. package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
  474. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
  475. package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
  476. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
  477. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
  478. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
  479. package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
  480. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
  481. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
  482. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
  483. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
  484. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
  485. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
  486. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
  487. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
  488. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
  489. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
  490. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
  491. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
  492. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
  493. package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
  494. package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
  495. package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
  496. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
  497. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
  498. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
  499. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
  500. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
  501. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
  502. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
  503. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
  504. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
  505. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
  506. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
  507. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
  508. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
  509. package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
  510. package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
  511. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
  512. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
  513. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
  514. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
  515. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
  516. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
  517. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
  518. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
  519. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
  520. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
  521. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
  522. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
  523. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
  524. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
  525. package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
  526. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
  527. package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
  528. package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
  529. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
  530. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
  531. package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
  532. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
  533. package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
  534. package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
  535. package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
  536. package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
  537. package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
  538. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
  539. package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
  540. package/.agents/scripts/lib/path-security.js +25 -0
  541. package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
  542. package/.agents/scripts/lib/preflight-runner.js +196 -0
  543. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
  544. package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
  545. package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
  546. package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
  547. package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
  548. package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
  549. package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
  550. package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
  551. package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
  552. package/.agents/scripts/lib/provider-factory.js +80 -0
  553. package/.agents/scripts/lib/push-epic-retry.js +209 -0
  554. package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
  555. package/.agents/scripts/lib/qa/coverage-report.js +181 -0
  556. package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
  557. package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
  558. package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
  559. package/.agents/scripts/lib/qa/qa-session.js +197 -0
  560. package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
  561. package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
  562. package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
  563. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
  564. package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
  565. package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
  566. package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
  567. package/.agents/scripts/lib/signals/detectors/common.js +36 -0
  568. package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
  569. package/.agents/scripts/lib/signals/detectors/index.js +14 -0
  570. package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
  571. package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
  572. package/.agents/scripts/lib/signals/index.js +39 -0
  573. package/.agents/scripts/lib/signals/read.js +268 -0
  574. package/.agents/scripts/lib/signals/schema.js +225 -0
  575. package/.agents/scripts/lib/signals/span-tree.js +290 -0
  576. package/.agents/scripts/lib/signals/write.js +19 -0
  577. package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
  578. package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
  579. package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
  580. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
  581. package/.agents/scripts/lib/single-story-sweep.js +329 -0
  582. package/.agents/scripts/lib/skills/parse-skill.js +202 -0
  583. package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
  584. package/.agents/scripts/lib/spec/index.js +36 -0
  585. package/.agents/scripts/lib/spec/loader.js +425 -0
  586. package/.agents/scripts/lib/spec/state.js +217 -0
  587. package/.agents/scripts/lib/story-body/story-body.js +743 -0
  588. package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
  589. package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
  590. package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
  591. package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
  592. package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
  593. package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
  594. package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
  595. package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
  596. package/.agents/scripts/lib/story-lifecycle.js +186 -0
  597. package/.agents/scripts/lib/story-plan.js +246 -0
  598. package/.agents/scripts/lib/task-utils.js +26 -0
  599. package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
  600. package/.agents/scripts/lib/test-env.js +30 -0
  601. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
  602. package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
  603. package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
  604. package/.agents/scripts/lib/test-isolate/runner.js +483 -0
  605. package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
  606. package/.agents/scripts/lib/test-profile/render-report.js +45 -0
  607. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
  608. package/.agents/scripts/lib/test-tiers.js +94 -0
  609. package/.agents/scripts/lib/util/concurrent-map.js +59 -0
  610. package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
  611. package/.agents/scripts/lib/util/phase-timer.js +163 -0
  612. package/.agents/scripts/lib/util/poll-loop.js +86 -0
  613. package/.agents/scripts/lib/util/with-timeout.js +32 -0
  614. package/.agents/scripts/lib/validation-evidence.js +323 -0
  615. package/.agents/scripts/lib/wave-runner/tick.js +665 -0
  616. package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
  617. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
  618. package/.agents/scripts/lib/workers/crap-worker.js +197 -0
  619. package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
  620. package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
  621. package/.agents/scripts/lib/workspace-provisioner.js +189 -0
  622. package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
  623. package/.agents/scripts/lib/worktree/inspector.js +140 -0
  624. package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
  625. package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
  626. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
  627. package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
  628. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
  629. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
  630. package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
  631. package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
  632. package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
  633. package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
  634. package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
  635. package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
  636. package/.agents/scripts/lib/worktree-manager.js +243 -0
  637. package/.agents/scripts/lifecycle-diff.js +206 -0
  638. package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
  639. package/.agents/scripts/lifecycle-emit.js +479 -0
  640. package/.agents/scripts/lint-baseline.js +507 -0
  641. package/.agents/scripts/lint-label-vocabulary.js +237 -0
  642. package/.agents/scripts/loc-delta.js +205 -0
  643. package/.agents/scripts/notify.js +307 -0
  644. package/.agents/scripts/package.json +3 -0
  645. package/.agents/scripts/post-structured-comment.js +127 -0
  646. package/.agents/scripts/pr-watch-with-update.js +152 -0
  647. package/.agents/scripts/providers/github/auth.js +65 -0
  648. package/.agents/scripts/providers/github/board-add.js +63 -0
  649. package/.agents/scripts/providers/github/branch-protection.js +186 -0
  650. package/.agents/scripts/providers/github/cache.js +72 -0
  651. package/.agents/scripts/providers/github/comments.js +131 -0
  652. package/.agents/scripts/providers/github/compose.js +111 -0
  653. package/.agents/scripts/providers/github/errors.js +242 -0
  654. package/.agents/scripts/providers/github/issues.js +242 -0
  655. package/.agents/scripts/providers/github/labels.js +179 -0
  656. package/.agents/scripts/providers/github/mappers.js +126 -0
  657. package/.agents/scripts/providers/github/merge-methods.js +82 -0
  658. package/.agents/scripts/providers/github/project-board.js +47 -0
  659. package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
  660. package/.agents/scripts/providers/github/prs.js +103 -0
  661. package/.agents/scripts/providers/github/request-helpers.js +110 -0
  662. package/.agents/scripts/providers/github/sub-issues.js +369 -0
  663. package/.agents/scripts/providers/github/tickets.js +381 -0
  664. package/.agents/scripts/providers/github/transient-retry.js +62 -0
  665. package/.agents/scripts/providers/github.js +157 -0
  666. package/.agents/scripts/quality-preview.js +327 -0
  667. package/.agents/scripts/quality-watch.js +223 -0
  668. package/.agents/scripts/render-manifest.js +143 -0
  669. package/.agents/scripts/resync-status-column.js +176 -0
  670. package/.agents/scripts/retro-run.js +167 -0
  671. package/.agents/scripts/run-audit-suite.js +97 -0
  672. package/.agents/scripts/run-coverage.js +103 -0
  673. package/.agents/scripts/run-lint.js +94 -0
  674. package/.agents/scripts/run-test-profile.js +126 -0
  675. package/.agents/scripts/run-tests.js +185 -0
  676. package/.agents/scripts/run-verify.js +56 -0
  677. package/.agents/scripts/select-audits.js +155 -0
  678. package/.agents/scripts/signals-view.js +294 -0
  679. package/.agents/scripts/single-story-close.js +83 -0
  680. package/.agents/scripts/single-story-confirm-merge.js +183 -0
  681. package/.agents/scripts/single-story-init.js +692 -0
  682. package/.agents/scripts/stories-wave-tick.js +415 -0
  683. package/.agents/scripts/story-close.js +246 -0
  684. package/.agents/scripts/story-deliver-prepare.js +267 -0
  685. package/.agents/scripts/story-init.js +516 -0
  686. package/.agents/scripts/story-phase.js +327 -0
  687. package/.agents/scripts/story-plan.js +284 -0
  688. package/.agents/scripts/sync-agentrc.js +71 -0
  689. package/.agents/scripts/sync-branch-from-base.js +138 -0
  690. package/.agents/scripts/sync-claude-commands.js +151 -0
  691. package/.agents/scripts/test-isolate.js +222 -0
  692. package/.agents/scripts/test-wrapper.js +108 -0
  693. package/.agents/scripts/update-coverage-baseline.js +129 -0
  694. package/.agents/scripts/update-crap-baseline.js +177 -0
  695. package/.agents/scripts/update-duplication-baseline.js +134 -0
  696. package/.agents/scripts/update-maintainability-baseline.js +183 -0
  697. package/.agents/scripts/update-mutation-baseline.js +189 -0
  698. package/.agents/scripts/update-ticket-state.js +107 -0
  699. package/.agents/scripts/validate-docs-freshness.js +259 -0
  700. package/.agents/scripts/validate-skills.js +278 -0
  701. package/.agents/scripts/wave-tick.js +335 -0
  702. package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
  703. package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
  704. package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
  705. package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
  706. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
  707. package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
  708. package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
  709. package/.agents/skills/core/code-simplification/SKILL.md +389 -0
  710. package/.agents/skills/core/context-engineering/SKILL.md +309 -0
  711. package/.agents/skills/core/context-engineering/examples.md +58 -0
  712. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
  713. package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
  714. package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
  715. package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
  716. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
  717. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
  718. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
  719. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
  720. package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
  721. package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
  722. package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
  723. package/.agents/skills/core/idea-refinement/examples.md +437 -0
  724. package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
  725. package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
  726. package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
  727. package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
  728. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
  729. package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
  730. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
  731. package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
  732. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
  733. package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
  734. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
  735. package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
  736. package/.agents/skills/core/scope-triage/SKILL.md +127 -0
  737. package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
  738. package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
  739. package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
  740. package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
  741. package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
  742. package/.agents/skills/skills.index.json +596 -0
  743. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
  744. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
  745. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
  746. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
  747. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
  748. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
  749. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
  750. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
  751. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
  752. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
  753. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
  754. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
  755. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
  756. package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
  757. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
  758. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
  759. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
  760. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
  761. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
  762. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
  763. package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
  764. package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
  765. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
  766. package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
  767. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
  768. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
  769. package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
  770. package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
  771. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
  772. package/.agents/starter-agentrc.json +22 -0
  773. package/.agents/templates/agent-protocol.md +72 -0
  774. package/.agents/templates/docs/architecture.md +30 -0
  775. package/.agents/templates/docs/decisions.md +24 -0
  776. package/.agents/templates/epic-from-idea.md +21 -0
  777. package/.agents/templates/single-story-body.md +17 -0
  778. package/.agents/workflows/agents-update.md +415 -0
  779. package/.agents/workflows/audit-architecture.md +312 -0
  780. package/.agents/workflows/audit-clean-code.md +179 -0
  781. package/.agents/workflows/audit-dependencies.md +91 -0
  782. package/.agents/workflows/audit-devops.md +110 -0
  783. package/.agents/workflows/audit-lighthouse.md +260 -0
  784. package/.agents/workflows/audit-performance.md +161 -0
  785. package/.agents/workflows/audit-privacy.md +104 -0
  786. package/.agents/workflows/audit-quality.md +191 -0
  787. package/.agents/workflows/audit-security.md +156 -0
  788. package/.agents/workflows/audit-seo.md +118 -0
  789. package/.agents/workflows/audit-sre.md +139 -0
  790. package/.agents/workflows/audit-to-stories.md +257 -0
  791. package/.agents/workflows/audit-ux-ui.md +102 -0
  792. package/.agents/workflows/epic-deliver.md +864 -0
  793. package/.agents/workflows/epic-plan.md +998 -0
  794. package/.agents/workflows/explain.md +118 -0
  795. package/.agents/workflows/git-cleanup.md +250 -0
  796. package/.agents/workflows/git-commit-all.md +15 -0
  797. package/.agents/workflows/git-merge-pr.md +377 -0
  798. package/.agents/workflows/git-pr-all.md +278 -0
  799. package/.agents/workflows/git-push.md +60 -0
  800. package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
  801. package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
  802. package/.agents/workflows/helpers/agents-sync-config.md +129 -0
  803. package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
  804. package/.agents/workflows/helpers/code-review.md +370 -0
  805. package/.agents/workflows/helpers/diagnose.md +117 -0
  806. package/.agents/workflows/helpers/epic-audit.md +295 -0
  807. package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
  808. package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
  809. package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
  810. package/.agents/workflows/helpers/epic-testing.md +125 -0
  811. package/.agents/workflows/helpers/parallel-tooling.md +88 -0
  812. package/.agents/workflows/helpers/signals.md +112 -0
  813. package/.agents/workflows/helpers/single-story-deliver.md +636 -0
  814. package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
  815. package/.agents/workflows/onboard.md +207 -0
  816. package/.agents/workflows/qa-assist.md +293 -0
  817. package/.agents/workflows/qa-explore.md +350 -0
  818. package/.agents/workflows/qa-run-harness.md +288 -0
  819. package/.agents/workflows/story-deliver.md +327 -0
  820. package/.agents/workflows/story-plan.md +233 -0
  821. package/LICENSE +21 -0
  822. package/README.md +193 -0
  823. package/bin/mandrel.js +56 -0
  824. package/bin/postinstall.js +195 -0
  825. package/lib/cli/__tests__/migrate.test.js +268 -0
  826. package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
  827. package/lib/cli/__tests__/sync.test.js +372 -0
  828. package/lib/cli/__tests__/update-major.test.js +217 -0
  829. package/lib/cli/__tests__/update.test.js +696 -0
  830. package/lib/cli/__tests__/version-check.test.js +398 -0
  831. package/lib/cli/doctor.js +124 -0
  832. package/lib/cli/explain.js +107 -0
  833. package/lib/cli/migrate.js +260 -0
  834. package/lib/cli/registry.js +830 -0
  835. package/lib/cli/sync-commands.js +50 -0
  836. package/lib/cli/sync.js +200 -0
  837. package/lib/cli/uninstall.js +795 -0
  838. package/lib/cli/update.js +854 -0
  839. package/lib/cli/version-check.js +206 -0
  840. package/lib/migrations/README.md +69 -0
  841. package/lib/migrations/__tests__/index.test.js +216 -0
  842. package/lib/migrations/index.js +164 -0
  843. package/package.json +105 -0
@@ -0,0 +1,293 @@
1
+ ---
2
+ description: Human-led QA assist loop — ingest one operator observation, enrich it with repro + root-cause (file:line) + a coverage verdict, ask clarifying questions when it is ambiguous, and append a redacted ledger item to a persistent, resumable rolling session under temp/qa/
3
+ ---
4
+
5
+ # /qa-assist
6
+
7
+ Drive a **human-led QA-assist session** as a human-in-the-loop (HITL) loop:
8
+ **Intake → Enrich → Record**. The operator reports a single observation (a
9
+ bug they hit, a flaky behavior, a "this feels off"); the agent (acting as the
10
+ QA engineer) enriches that observation into a structured, triage-ready ledger
11
+ item — a clean repro, a root-cause locus (`file:line`), and a coverage
12
+ verdict — **asking clarifying questions whenever the observation is
13
+ ambiguous**, and only after explicit operator confirmation appends it to a
14
+ **persistent, resumable rolling session** under `temp/qa/`.
15
+
16
+ Unlike [`/qa-explore`](qa-explore.md) (where the *agent* drives open-ended
17
+ exploration of a named surface and captures many observations), `/qa-assist`
18
+ is **human-led and single-observation-at-a-time**: the human owns the signal,
19
+ the agent owns the enrichment. It is the front door for "I just saw something
20
+ weird — help me capture it well." Each observation is recorded as a
21
+ `QaLedgerItem` against the
22
+ [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json) contract, the same
23
+ ledger `/qa-explore` and the triage/promotion path consume — so a `/qa-assist`
24
+ item flows through the identical dedup, classification, and promotion machinery
25
+ later.
26
+
27
+ This is a **prose workflow**, not a Node orchestrator: the host LLM executes
28
+ the procedure; deterministic Node helpers under `.agents/scripts/lib/qa/` and
29
+ `.agents/scripts/lib/findings/` do the contract resolution, session/ledger
30
+ resolution, context hydration, redaction, coverage verdict, classification,
31
+ dedup/route, and promotion. **The agent consumes the shared core helpers; it
32
+ never reimplements those decisions in prose.**
33
+
34
+ > **When to run**: a developer or operator hits something mid-flight and wants
35
+ > it captured as a high-quality, triage-ready finding without breaking stride —
36
+ > a one-off bug report, a "is this even covered by a test?" question, or a
37
+ > rolling personal QA backlog they top up across a working session.
38
+ >
39
+ > **Persona**: `qa-engineer` · **Skills**: `core/qa-coverage-mapping`
40
+
41
+ ## Persona
42
+
43
+ Adopt the **`qa-engineer`** persona
44
+ ([`.agents/personas/qa-engineer.md`](../personas/qa-engineer.md)) for the whole
45
+ run. You are the quality gatekeeper: you value coverage, hermetic
46
+ environments, deterministic results, and — per that persona's Golden Rule —
47
+ you **never invent the signal**. The human owns what was observed; you enrich
48
+ it. Re-read that persona file as your first action so the
49
+ Intake/Enrich/Record loop is governed by it.
50
+
51
+ ## Slash Command
52
+
53
+ ```text
54
+ /qa-assist [observation]
55
+ ```
56
+
57
+ ### Arguments
58
+
59
+ | Name | Required | Shape / Example | Notes |
60
+ | ------------- | -------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
61
+ | `observation` | no | `"sync-commands wipes .claude on a reused name"` | The human observation to enrich. If omitted, **ask** the operator to describe what they saw. |
62
+
63
+ If no `observation` is supplied, **stop and ask** the operator to describe
64
+ what they observed — the `qa-engineer` Golden Rule forbids inventing the
65
+ signal. Do not synthesize an observation on the operator's behalf.
66
+
67
+ ## Project contract
68
+
69
+ Resolve the consumer's `qa` contract before enriching, via
70
+ [`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js):
71
+
72
+ ```js
73
+ import { resolveQaContract } from '../scripts/lib/qa/resolve-qa-contract.js';
74
+ const contract = resolveQaContract(config); // throws loudly if unbound
75
+ ```
76
+
77
+ The resolver fails **loudly** when the project has not bound the QA harness
78
+ (no `qa` block in `.agentrc.json`) — there is no silent fallback. If it throws
79
+ the "this project has not bound the QA harness" message, surface that verbatim
80
+ to the operator and stop; do not pretend a contract exists.
81
+
82
+ ## Session & ledger (temp/qa/) — persistent, resumable, rolling
83
+
84
+ `/qa-assist` **defaults to a persistent rolling session**: the same session
85
+ is resumed across invocations so an operator can top up the same ledger over a
86
+ working day. Resolve the session and its ledger path **once**, up front, via
87
+ [`qa-session.js`](../scripts/lib/qa/qa-session.js):
88
+
89
+ ```js
90
+ import { resolveQaSession } from '../scripts/lib/qa/qa-session.js';
91
+ const { sessionId, ledgerPath, reused, untriaged } = resolveQaSession({ config });
92
+ ```
93
+
94
+ - The ledger is always written under **`temp/qa/<sessionId>.ndjson`**
95
+ (`<tempRoot>/qa/`, resolved from `project.paths.tempRoot`). It is one
96
+ `QaLedgerItem` per line (ndjson). **Never** write the ledger anywhere else,
97
+ and never commit it — `temp/` is gitignored per
98
+ [`.agents/instructions.md` § 6](../instructions.md).
99
+ - When `reused` is `true`, a prior session of the same id exists: **append**,
100
+ never overwrite, and surface the carried `untriaged` items as the rolling
101
+ backlog so the operator sees what is still open. Pass `--session-id <id>`
102
+ (or `QA_SESSION_ID`) to resume or fork a named session. This is the
103
+ resumable-rolling-session contract — a `/qa-assist` run is additive to the
104
+ prior ledger by default.
105
+
106
+ ## Phase gates (HITL)
107
+
108
+ Every phase transition **and every write** is gated on **explicit operator
109
+ confirmation**. Do not advance Intake → Enrich, or Enrich → Record, until the
110
+ operator says so. State each gate as a question, present the artifact (the
111
+ restated observation, then the enriched ledger item), and wait. This is a HITL
112
+ workflow — the agent never appends to the ledger, files a ticket, or advances
113
+ a phase autonomously. If the operator does not confirm, stop and hold.
114
+
115
+ ---
116
+
117
+ ## Phase 1 — Intake
118
+
119
+ Goal: understand **exactly what the human observed** before enriching it.
120
+ This phase is where ambiguity is resolved by **asking**, not guessing.
121
+
122
+ 1. Re-read the `qa-engineer` persona and resolve the `qa` contract and session
123
+ (above). Surface the rolling `untriaged` backlog so the operator knows what
124
+ is already open in this session.
125
+ 2. **Restate the observation** back to the operator in your own words — the
126
+ surface it touches, the action taken, the actual result, and the expected
127
+ result. This restatement is the agent's read of the signal.
128
+ 3. **Ask clarifying questions when the observation is ambiguous.** If you
129
+ cannot confidently fill in any of {surface, exact steps, actual result,
130
+ expected result, environment} from what the operator gave you, **stop and
131
+ ask** — do not paper over the gap with an assumption. Typical gaps:
132
+ - Which surface / command / flow? (so the coverage verdict targets the
133
+ right symbol)
134
+ - What were the exact steps, and is it reproducible or intermittent?
135
+ - What did you expect instead, and why is that the contract?
136
+ - What environment (OS, shell, branch, fresh vs. reused state)?
137
+ 4. **Gate:** present the restated observation and ask the operator to confirm
138
+ it is accurate (or correct it). Do **not** proceed to Enrich until they
139
+ confirm the restatement is faithful.
140
+
141
+ ---
142
+
143
+ ## Phase 2 — Enrich
144
+
145
+ Goal: turn the confirmed observation into a high-quality, triage-ready finding —
146
+ a clean repro, a root-cause locus, and a coverage verdict. Delegate every
147
+ decision to the shared core helpers.
148
+
149
+ 1. **Redact first.** Before any evidence string touches disk or reaches
150
+ GitHub, scrub it through
151
+ [`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js):
152
+
153
+ ```js
154
+ import { redactEvidence } from '../scripts/lib/qa/redact-evidence.js';
155
+ const evidence = redactEvidence(rawObservation);
156
+ ```
157
+
158
+ This is mandatory per [`security-baseline.md`](../rules/security-baseline.md)
159
+ (§ Data Leakage & Logging, § Secrets Management) — bearer tokens, session
160
+ cookies, and emails are masked. The pass is idempotent, so redact eagerly,
161
+ before the repro and root-cause notes are written anywhere.
162
+
163
+ 2. **Establish a clean repro.** From the confirmed steps, write the minimal
164
+ deterministic reproduction. If the steps are still non-deterministic or
165
+ incomplete, return to Intake and ask — a finding without a repro is not yet
166
+ ready to record.
167
+
168
+ 3. **Hydrate the QA context** to locate the root cause, via
169
+ [`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js). It
170
+ resolves the Epic/Feature context tickets, the feature-file set, the
171
+ surface map, and recent git log so you can name the **root-cause locus as
172
+ `file:line`** rather than guessing:
173
+
174
+ ```js
175
+ import { hydrateQaContext } from '../scripts/lib/qa/qa-context-hydrator.js';
176
+ const context = await hydrateQaContext({ epicNumber, githubPort, gitPort, surfaceMap });
177
+ ```
178
+
179
+ Record the root cause as a concrete `file:line` reference. If you cannot
180
+ pin it, say so explicitly in the ledger item rather than inventing a locus.
181
+
182
+ 4. **Compute the coverage verdict** for the surface the observation points at,
183
+ via [`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js) — the
184
+ deterministic seam behind the
185
+ [`core/qa-coverage-mapping`](../skills/core/qa-coverage-mapping/SKILL.md)
186
+ skill. Read that skill for how to assemble the `surface` input (symbol +
187
+ the unit/contract/acceptance tests around it) and how to read the per-tier
188
+ `{present|absent}` verdict. Optionally render a human-readable coverage
189
+ summary via [`coverage-report.js`](../scripts/lib/qa/coverage-report.js).
190
+
191
+ 5. **Propose the missing test** (if any) from that verdict, via
192
+ [`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js). It
193
+ names the lowest absent tier (the cheapest gap the signal leaked through),
194
+ or returns `null` when every tier is covered. Record the proposal's
195
+ `description` as the ledger item's `missingTest` (or `null`).
196
+
197
+ 6. **Classify** the finding via
198
+ [`classify-finding.js`](../scripts/lib/findings/classify-finding.js) so the
199
+ tentative `class` resolves to the correct focus/meta label set
200
+ (`tooling-dx` carries `meta::framework-gap`; `enhancement` carries
201
+ `meta::consumer-improvement`). The helper **throws** on an absent/unknown
202
+ class — fix the finding's class rather than defaulting.
203
+
204
+ 7. **Gate:** present the enriched candidate `QaLedgerItem` (redacted evidence,
205
+ repro, root-cause `file:line`, coverage verdict, `class`, `severity`,
206
+ `missingTest`) and ask the operator to confirm it is accurate before any
207
+ write. Do **not** append to the ledger until they confirm.
208
+
209
+ ---
210
+
211
+ ## Phase 3 — Record
212
+
213
+ Goal: persist the enriched, confirmed finding to the rolling session ledger —
214
+ and optionally route or promote it — with the operator deciding each write.
215
+
216
+ 1. **Append a `QaLedgerItem`** to `temp/qa/<sessionId>.ndjson`, conforming to
217
+ [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json): a stable `id`
218
+ (`L1`, `L2`, … appended after any carried backlog), the redacted
219
+ `evidence`, the repro and root-cause `file:line` notes, the `coverage`
220
+ label, the confirmed `class` and `severity`, the `missingTest`, and a
221
+ `disposition` (default untriaged unless the operator decides now). This
222
+ append is a **write** — confirm it at the Phase 2 → Record gate before it
223
+ happens.
224
+
225
+ 2. **Optionally dedup / route** the finding against existing GitHub Issues via
226
+ [`route-finding.js`](../scripts/lib/findings/route-finding.js) (the
227
+ **single** dedup implementation shared with `/qa-explore` and
228
+ `audit-to-stories`), backed by
229
+ [`semantic-issue-search.js`](../scripts/lib/findings/semantic-issue-search.js)
230
+ for candidate recall:
231
+
232
+ ```js
233
+ import { routeFinding, fingerprintFooter } from '../scripts/lib/findings/route-finding.js';
234
+ const { decision, matchedIssue, fingerprint } =
235
+ await routeFinding(finding, { searchIssues });
236
+ ```
237
+
238
+ `decision` is one of `new` / `update-existing` / `duplicate` /
239
+ `regression-of-closed`. Stamp the `fingerprintFooter(sha)` marker into any
240
+ Issue body so future runs dedup against it.
241
+
242
+ 3. **Optionally promote** the finding to a follow-up ticket via
243
+ [`promote-finding.js`](../scripts/lib/findings/promote-finding.js), which
244
+ clusters, routes, and files through the same ports — never hand-roll the
245
+ promotion:
246
+
247
+ ```js
248
+ import { promoteFindings } from '../scripts/lib/findings/promote-finding.js';
249
+ const promotions = await promoteFindings(ledgerItems, { searchIssues, createStory });
250
+ ```
251
+
252
+ 4. **Gate:** any ledger append, ticket-filing, or label mutation is a write —
253
+ confirm **each one** with the operator before it happens. Redaction has
254
+ already run, so nothing unredacted reaches disk or GitHub.
255
+
256
+ After recording, summarize: the finding recorded, its coverage verdict and
257
+ `missingTest`, any route/promotion decision
258
+ (`new`/`update-existing`/`duplicate`/`regression-of-closed`), and the rolling
259
+ backlog a resumed session will pick up.
260
+
261
+ ---
262
+
263
+ ## Constraints
264
+
265
+ - **Human-led, single-observation.** The operator owns the signal; the agent
266
+ enriches it. Never invent an observation; **ask clarifying questions** when
267
+ the observation is ambiguous instead of assuming.
268
+ - **Every phase transition and every write is operator-gated.** Intake →
269
+ Enrich, Enrich → Record, and each ledger append / ticket-filing / label
270
+ mutation require explicit confirmation. Never advance, append, file a
271
+ ticket, or mutate a label autonomously.
272
+ - **Persistent, resumable rolling session.** `/qa-assist` defaults to resuming
273
+ the same session and **appending** to its ledger; a reused session carries
274
+ the un-triaged backlog forward via
275
+ [`qa-session.js`](../scripts/lib/qa/qa-session.js) and never overwrites a
276
+ prior ledger.
277
+ - **The ledger lives under `temp/qa/` only**, one `QaLedgerItem` per ndjson
278
+ line, conforming to [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json).
279
+ Never commit it.
280
+ - **Redact before persist.** Every evidence string passes through
281
+ [`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js) before it
282
+ reaches disk or GitHub, per [`security-baseline.md`](../rules/security-baseline.md).
283
+ - **Consume the shared core; never reimplement.** Context hydration
284
+ ([`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js)),
285
+ coverage verdict ([`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js)),
286
+ coverage report ([`coverage-report.js`](../scripts/lib/qa/coverage-report.js)),
287
+ missing-test ([`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js)),
288
+ classification ([`classify-finding.js`](../scripts/lib/findings/classify-finding.js)),
289
+ dedup/route ([`route-finding.js`](../scripts/lib/findings/route-finding.js)),
290
+ semantic search ([`semantic-issue-search.js`](../scripts/lib/findings/semantic-issue-search.js)),
291
+ promotion ([`promote-finding.js`](../scripts/lib/findings/promote-finding.js)),
292
+ and session resolution ([`qa-session.js`](../scripts/lib/qa/qa-session.js))
293
+ are deterministic — never re-derive them in prose.
@@ -0,0 +1,350 @@
1
+ ---
2
+ description: Agent-led exploratory-QA loop — the agent Plans a surface with an explicit static-vs-drive method choice, drives it (browser MCP or static), and captures ledger items read-only, then Triages — a bounded per-surface session, HITL-gated at every phase transition, routed through the shared dedup/coverage/classification/missing-test/redaction/session core under temp/qa/
3
+ ---
4
+
5
+ # /qa-explore
6
+
7
+ Drive a **bounded, agent-led exploratory-QA session** as a human-in-the-loop
8
+ (HITL) loop: **Plan → Capture → Triage**. The operator names a single surface;
9
+ the agent (acting as the QA engineer) **plans** how it will reach that surface,
10
+ **drives** it itself — through the browser MCP by default, or statically as a
11
+ documented interim — and records each observation as a structured ledger item
12
+ under a strictly read-only capture invariant. Only after explicit operator
13
+ confirmation does it triage the ledger into routed, classified, dedup'd
14
+ follow-up dispositions.
15
+
16
+ This is the **agent-led** front-end of exploratory QA: **the agent drives, the
17
+ operator watches and gates.** Its human-led sibling is
18
+ [`/qa-assist`](qa-assist.md) — there the *human* drives a single observation and
19
+ the agent scribes/enriches. No human-driven flow lives in `/qa-explore`; if you
20
+ want to capture something *you* observed, use `/qa-assist` instead.
21
+
22
+ Unlike [`/qa-run-harness`](qa-run-harness.md) (which steps a known set of
23
+ Gherkin `.feature` scenarios through a browser), `/qa-explore` is **open-ended
24
+ exploration**: the agent probes the surface for product bugs, environment-setup
25
+ friction, tooling/DX gaps, missing tests, and enhancement ideas — each captured
26
+ as a `QaLedgerItem` against the
27
+ [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json) contract.
28
+
29
+ This is a **prose workflow**, not a Node orchestrator: the host LLM executes
30
+ the procedure; deterministic Node helpers under `.agents/scripts/lib/qa/` and
31
+ `.agents/scripts/lib/findings/` do the contract resolution, session/ledger
32
+ resolution, redaction, coverage verdict, missing-test proposal, classification,
33
+ and dedup/route decisions. The agent never invents those decisions in prose.
34
+
35
+ > **When to run**: ad-hoc agent-driven exploration of a freshly delivered Story
36
+ > or Feature, a regression sweep over a risky surface before `/epic-deliver`, or
37
+ > a structured agent-driven bug-hunt the operator wants captured into a
38
+ > triageable ledger.
39
+ >
40
+ > **Persona**: `qa-engineer` · **Skills**: `core/qa-coverage-mapping`,
41
+ > `stack/qa/qa-explore-driving`
42
+
43
+ ## Persona
44
+
45
+ Adopt the **`qa-engineer`** persona
46
+ ([`.agents/personas/qa-engineer.md`](../personas/qa-engineer.md)) for the whole
47
+ run. You are the quality gatekeeper: you value coverage, hermetic
48
+ environments, and deterministic results. Re-read that persona file as your
49
+ first action so the Plan/Capture/Triage loop is governed by it.
50
+
51
+ ## Driving conventions skill
52
+
53
+ Before you drive a surface, read the
54
+ [`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
55
+ skill. It is the conventions reference this procedure depends on for the
56
+ **how** of agent-driven exploration:
57
+
58
+ - **Navigation-first driving (the default).** Drive the running app through the
59
+ browser MCP, starting at a root and reaching each surface only via UI
60
+ affordances — never URL-jump to a deep link. Browser instrumentation lives in
61
+ [`core/browser-testing-with-devtools`](../skills/core/browser-testing-with-devtools/SKILL.md).
62
+ - **Static driving (the documented interim).** When a live runtime is not
63
+ reachable, walk the surface from source, route definitions, and rendered
64
+ markup — chosen explicitly at Plan time, never as a silent fallback.
65
+ - **Authenticated driving depends on consumer persona-seeding infrastructure
66
+ this framework does not deliver.** Without it, drive only the unauthenticated
67
+ surface or fall back to static, never enter real credentials, and record the
68
+ gap.
69
+ - **Broken navigation is a finding, not a workaround.** A missing affordance, a
70
+ nav 404, or a guard redirect loop is recorded and you move on — you do not
71
+ route around it with a direct URL.
72
+
73
+ The driving method (drive vs. static) is a **Plan-phase decision recorded in the
74
+ ledger**; do not switch methods mid-surface without a new Plan note.
75
+
76
+ ## Slash Command
77
+
78
+ ```text
79
+ /qa-explore <surface>
80
+ ```
81
+
82
+ ### Arguments
83
+
84
+ | Name | Required | Shape / Example | Notes |
85
+ | --------- | -------- | ---------------------------------- | -------------------------------------------------------------------------------------- |
86
+ | `surface` | yes | `feature:login`, `area:onboarding` | A human label for the single surface to explore. Recorded as each ledger item's `coverage`. |
87
+
88
+ If no `surface` is supplied, **stop and ask** the operator to name one — the
89
+ `qa-engineer` Golden Rule forbids inventing scope. `/qa-explore` is **bounded
90
+ to one surface per session**: explore exactly the named surface, do not wander
91
+ into adjacent surfaces, and start a fresh session for a different surface.
92
+
93
+ ## Project contract
94
+
95
+ Resolve the consumer's `qa` contract before exploring, via
96
+ [`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js):
97
+
98
+ ```js
99
+ import { resolveQaContract } from '../scripts/lib/qa/resolve-qa-contract.js';
100
+ const contract = resolveQaContract(config); // throws loudly if unbound
101
+ ```
102
+
103
+ The resolver fails **loudly** when the project has not bound the QA harness
104
+ (no `qa` block in `.agentrc.json`) — there is no silent fallback. If it throws
105
+ the "this project has not bound the QA harness" message, surface that verbatim
106
+ to the operator and stop; do not pretend a contract exists.
107
+
108
+ ## Session & ledger (temp/qa/)
109
+
110
+ Resolve the session and its ledger path **once**, up front, via
111
+ [`qa-session.js`](../scripts/lib/qa/qa-session.js):
112
+
113
+ ```js
114
+ import { resolveQaSession } from '../scripts/lib/qa/qa-session.js';
115
+ const { sessionId, ledgerPath, reused, untriaged } = resolveQaSession({ config });
116
+ ```
117
+
118
+ - The ledger is always written under **`temp/qa/<sessionId>.ndjson`**
119
+ (`<tempRoot>/qa/`, resolved from `project.paths.tempRoot`). It is one
120
+ `QaLedgerItem` per line (ndjson). **Never** write the ledger anywhere else,
121
+ and never commit it — `temp/` is gitignored per
122
+ [`.agents/instructions.md` § 6](../instructions.md).
123
+ - When `reused` is `true`, a prior session of the same id exists: **append**,
124
+ never overwrite, and carry the `untriaged` items forward as the rolling
125
+ backlog (resume safety). Pass `--session-id <id>` (or `QA_SESSION_ID`) to
126
+ resume a named session.
127
+
128
+ ## Bounded per-surface session
129
+
130
+ A `/qa-explore` run is a **single bounded session over one named surface**, not
131
+ an open-ended sweep:
132
+
133
+ - **One surface.** The session explores exactly the `surface` argument. Driving
134
+ the named surface may legitimately touch sub-surfaces reachable from it
135
+ navigation-first, but the session does not pivot to a different top-level
136
+ surface — that is a new session.
137
+ - **Bounded by the operator's gate.** Capture continues until the operator says
138
+ exploration is complete (the Capture → Triage gate), not until the agent has
139
+ exhausted the app. The agent proposes when it believes the surface is
140
+ covered; the operator decides.
141
+ - **Resumable, not unbounded.** A reused session appends to the same ledger and
142
+ carries its untriaged backlog forward; it does not widen the surface.
143
+
144
+ ## Phase gates (HITL)
145
+
146
+ Every phase transition is gated on **explicit operator confirmation**. Do not
147
+ advance Plan → Capture, or Capture → Triage, until the operator says so. State
148
+ each gate as a question, present the artifact (the plan with its chosen driving
149
+ method, then the captured ledger), and wait. This is a HITL workflow — the
150
+ agent drives and captures, but it never files tickets, promotes findings, or
151
+ advances phases autonomously. If the operator does not confirm, stop and hold.
152
+
153
+ ---
154
+
155
+ ## Phase 1 — Plan
156
+
157
+ Goal: agree on **what** will be explored and **how the agent will drive it**
158
+ before touching the surface.
159
+
160
+ 1. Re-read the `qa-engineer` persona and the
161
+ [`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
162
+ skill, and resolve the `qa` contract and session (above).
163
+ 2. **Choose the driving method explicitly** for the named `surface`:
164
+ - **Drive (default):** the live runtime is reachable, so the agent will
165
+ drive it through the browser MCP, navigation-first (start at a root, reach
166
+ the surface via UI affordances, never URL-jump).
167
+ - **Static (documented interim):** the live runtime is *not* reachable —
168
+ most commonly because authenticated driving needs consumer persona-seeding
169
+ infrastructure that does not exist — so the agent will walk the surface
170
+ from source, routes, and rendered markup. This is a deliberate Plan-time
171
+ decision with a recorded reason, never a silent fallback when the browser
172
+ MCP hiccups.
173
+
174
+ Record the chosen method and reason on the ledger (e.g.
175
+ `method: static, reason: no reachable authenticated runtime`).
176
+ 3. Draft an **exploration plan** for the named `surface`:
177
+ - the sub-surfaces / flows / states the agent intends to drive,
178
+ - the classes of signal it is hunting (product bug, environment-setup,
179
+ tooling-dx, test-gap, enhancement — the
180
+ [ledger `class` enum](../schemas/qa-ledger.schema.json)),
181
+ - the chosen driving method and its rationale,
182
+ - any rolling backlog (`untriaged`) carried forward from a resumed session.
183
+ 4. Present the plan, the chosen driving method, and the resolved `ledgerPath`
184
+ (under `temp/qa/`) to the operator.
185
+ 5. **Gate:** ask the operator to confirm the plan and the driving method (or
186
+ amend the surface/scope/method). Do **not** proceed to Capture until they
187
+ confirm.
188
+
189
+ ---
190
+
191
+ ## Phase 2 — Capture (agent drives, READ-ONLY)
192
+
193
+ Goal: **the agent drives the confirmed surface itself** and records its
194
+ observations. **This phase is strictly read-only.**
195
+
196
+ > **Read-only invariant.** The agent observes; it never mutates. Per
197
+ > [`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
198
+ > § 3 (inviolable per
199
+ > [`security-baseline.md`](../rules/security-baseline.md)), do **not** edit
200
+ > source, run write commands, file or label GitHub issues, change tickets,
201
+ > submit destructive forms, or alter the product under test. The only write
202
+ > Capture performs is **appending ledger lines to
203
+ > `temp/qa/<sessionId>.ndjson`** — session scratch, not a repository or product
204
+ > mutation. Any action that would change state belongs in Triage (and only
205
+ > after the operator confirms). When a surface's only path forward is a
206
+ > mutating action, record the boundary as the finding and stop — do not cross
207
+ > it.
208
+
209
+ **Drive the surface using the method chosen in Plan:**
210
+
211
+ - **Drive (default):** reach the surface navigation-first through the browser
212
+ MCP — start at a root, click the affordances a real user would, and observe
213
+ the rendered state, console, and network signal. Never URL-jump to establish
214
+ a starting state; a broken affordance, nav 404, or guard redirect loop is
215
+ itself a **finding**, not a workaround. Never enter real credentials to reach
216
+ an authenticated surface and never fabricate a session — drive only the
217
+ unauthenticated surface (or capture the authenticated surface statically) and
218
+ record the persona-seeding gap.
219
+ - **Static (documented interim):** walk the surface from source, route
220
+ definitions, and rendered markup. Treat its coverage as partial and say so in
221
+ the ledger — a static pass does not close the same coverage a driven pass
222
+ would.
223
+
224
+ For each observation the agent makes while driving:
225
+
226
+ 1. **Redact first.** Before any evidence string touches disk, scrub it through
227
+ [`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js):
228
+
229
+ ```js
230
+ import { redactEvidence } from '../scripts/lib/qa/redact-evidence.js';
231
+ const evidence = redactEvidence(rawObservation);
232
+ ```
233
+
234
+ This is mandatory per [`security-baseline.md`](../rules/security-baseline.md)
235
+ (§ Data Leakage & Logging, § Secrets Management) — bearer tokens, session
236
+ cookies, Authorization headers, and emails are masked. The pass is
237
+ idempotent, so redact eagerly; captured console and network evidence is
238
+ untrusted until scrubbed.
239
+
240
+ 2. **Compute the coverage verdict** for the surface the observation points at,
241
+ via [`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js) — the
242
+ deterministic seam behind the
243
+ [`core/qa-coverage-mapping`](../skills/core/qa-coverage-mapping/SKILL.md)
244
+ skill. Read that skill for how to assemble the `surface` input (symbol +
245
+ the unit/contract/acceptance tests around it) and how to read the per-tier
246
+ `{present|absent}` verdict.
247
+
248
+ 3. **Propose the missing test** (if any) from that verdict, via
249
+ [`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js). It
250
+ names the lowest absent tier (the cheapest gap the signal leaked through),
251
+ or returns `null` when every tier is covered. Record the proposal's
252
+ `description` as the ledger item's `missingTest` (or `null`).
253
+
254
+ 4. **Append a `QaLedgerItem`** to `temp/qa/<sessionId>.ndjson`, conforming to
255
+ [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json): a stable
256
+ `id` (`L1`, `L2`, … in capture order), the redacted `evidence`, the
257
+ `coverage` label (the `surface`, or `unknown`), a tentative `class` and
258
+ `severity`, the `missingTest`, and `disposition` left untriaged for now.
259
+
260
+ 5. Continue driving until the agent believes the surface is covered, then
261
+ propose that exploration is complete.
262
+
263
+ 6. **Gate:** present the captured ledger (item count, classes, the driving
264
+ method used, the rolling backlog) and ask the operator to confirm moving to
265
+ Triage. Do **not** triage until they confirm.
266
+
267
+ ---
268
+
269
+ ## Phase 3 — Triage
270
+
271
+ Goal: turn the captured ledger into routed, classified, dedup'd dispositions —
272
+ with the operator deciding each `file` / `defer` / `dismiss`.
273
+
274
+ For each untriaged ledger item:
275
+
276
+ 1. **Classify** it via
277
+ [`classify-finding.js`](../scripts/lib/findings/classify-finding.js). The
278
+ item's `class` resolves to the focus/meta label set Triage applies when
279
+ promoting it (`tooling-dx` carries `meta::framework-gap`; `enhancement`
280
+ carries `meta::consumer-improvement`). The helper **throws** on an
281
+ absent/unknown class — fix the ledger item's class rather than defaulting.
282
+
283
+ 2. **Dedup / route** it against existing GitHub Issues via
284
+ [`route-finding.js`](../scripts/lib/findings/route-finding.js):
285
+
286
+ ```js
287
+ import { routeFinding, fingerprintFooter } from '../scripts/lib/findings/route-finding.js';
288
+ const { decision, matchedIssue, fingerprint } =
289
+ await routeFinding(finding, { searchIssues });
290
+ ```
291
+
292
+ `decision` is one of `new` / `update-existing` / `duplicate` /
293
+ `regression-of-closed`. This is the **single** dedup implementation shared
294
+ with `/qa-assist` and `audit-to-stories`; stamp the `fingerprintFooter(sha)`
295
+ marker into any Issue body so future runs dedup against it. Wire the
296
+ `searchIssues` port to the GitHub provider (querying both open and closed
297
+ Issues).
298
+
299
+ 3. **Decide the disposition** with the operator: `file` (promote to a
300
+ follow-up ticket with the classified labels + fingerprint footer), `defer`
301
+ (carry forward to a later session as backlog), or `dismiss` (non-actionable).
302
+ Record the chosen `disposition` back onto the ledger item.
303
+
304
+ 4. **Gate:** any ticket-filing or label mutation is a write — confirm each one
305
+ with the operator before it happens. Capture stayed read-only precisely so
306
+ that every state change lands here, deliberately and confirmed.
307
+
308
+ After triage, write the updated dispositions back to the ledger (still under
309
+ `temp/qa/`), and summarize: items captured, the driving method used, classes,
310
+ routes (`new`/`update-existing`/`duplicate`/`regression-of-closed`), filed
311
+ tickets, and the deferred rolling backlog that a resumed session will pick up.
312
+
313
+ ---
314
+
315
+ ## Constraints
316
+
317
+ - **Agent-led, bounded per surface.** The agent drives one named surface per
318
+ session and proposes when it is covered; the operator gates the boundary.
319
+ Human-driven single-observation capture lives in
320
+ [`/qa-assist`](qa-assist.md) — no human-driven flow lives here.
321
+ - **Pick the driving method at Plan time.** Drive (browser MCP,
322
+ navigation-first) is the default; static is the documented interim, chosen
323
+ explicitly with a recorded reason, never a silent fallback. Do not switch
324
+ methods mid-surface without a new Plan note. See
325
+ [`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md).
326
+ - **Capture is read-only.** The only Capture write is appending ledger lines
327
+ under `temp/qa/`. No source edits, no ticket mutations, no product writes,
328
+ no destructive form submissions. Never enter real credentials or fabricate a
329
+ session; record the persona-seeding gap instead.
330
+ - **Broken navigation is a finding, not a workaround.** Never URL-jump around a
331
+ missing affordance, a nav 404, or a guard redirect loop — record it and move
332
+ on.
333
+ - **Every phase transition is operator-gated.** Plan → Capture and
334
+ Capture → Triage each require explicit confirmation. Never advance, file a
335
+ ticket, or mutate a label autonomously.
336
+ - **The ledger lives under `temp/qa/` only**, one `QaLedgerItem` per ndjson
337
+ line, conforming to [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json).
338
+ Never commit it.
339
+ - **Redact before persist.** Every evidence string passes through
340
+ [`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js) before it
341
+ reaches disk or GitHub, per [`security-baseline.md`](../rules/security-baseline.md).
342
+ - **Delegate decisions to the helpers.** Coverage verdict
343
+ ([`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js)),
344
+ missing-test ([`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js)),
345
+ classification ([`classify-finding.js`](../scripts/lib/findings/classify-finding.js)),
346
+ and dedup/route ([`route-finding.js`](../scripts/lib/findings/route-finding.js))
347
+ are deterministic — never re-derive them in prose.
348
+ - **Resume safely.** A reused session appends and carries the un-triaged
349
+ backlog forward via [`qa-session.js`](../scripts/lib/qa/qa-session.js); it
350
+ never overwrites a prior ledger.