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,50 @@
1
+ ---
2
+ name: playwright
3
+ description:
4
+ Robust E2E browser testing with Playwright. Use when writing browser-driven
5
+ tests — leverage auto-waiting (no `waitForTimeout`), prefer user-visible
6
+ locators (`getByRole`, `getByText`, `getByLabel`) over CSS/XPath, reuse
7
+ `storageState` for auth, and enable trace-on-first-retry for CI debugging.
8
+ vendor: playwright
9
+ ---
10
+
11
+ # Skill: Playwright
12
+
13
+ ## Policy Capsule
14
+
15
+ - Rely on Playwright's auto-waiting; never use `waitForTimeout` or hardcoded sleeps to paper over flakes.
16
+ - Prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS selectors or XPath.
17
+ - Reuse `storageState` to seed authenticated scenarios; do not repeat login flows in every test.
18
+ - Use `toHaveScreenshot()` for critical visual surfaces; treat snapshot diffs as intentional reviews, not auto-refreshes.
19
+ - Write tests independent of one another so they run in parallel; clean up shared state in fixtures, not afterwards.
20
+ - Enable `trace: 'on-first-retry'` (or `'retain-on-failure'`) so CI failures are debuggable in the Trace Viewer.
21
+ - Use a unique data set per test run, or tear down state explicitly, to prevent cross-test contamination.
22
+
23
+ Standard operating procedures for robust, end-to-end (E2E) browser testing.
24
+
25
+ ## 1. Core Principles
26
+
27
+ - **End-to-End focus:** Test the application as a user would, through the
28
+ browser.
29
+ - **Auto-waiting:** Leverage Playwright's built-in auto-waiting instead of
30
+ hardcoded `waitForTimeout` calls.
31
+ - **Resilience:** Write tests that survive minor UI changes (e.g., color tweaks)
32
+ by using robust selectors.
33
+
34
+ ## 2. Technical Standards
35
+
36
+ - **Locators:** Use user-visible locators (e.g., `getByRole`, `getByText`,
37
+ `getByLabel`) over brittle CSS selectors or XPath.
38
+ - **State Management:** Use `storageState` to reuse authentication between
39
+ tests, avoiding repetitive login flows.
40
+ - **Visual Testing:** Use `toHaveScreenshot()` for critical UI layouts to detect
41
+ visual regressions.
42
+
43
+ ## 3. Best Practices
44
+
45
+ - **Parallelism:** Ensure tests are independent so they can run concurrently to
46
+ reduce CI time.
47
+ - **Tracing:** Enable trace recording on failure to quickly debug CI issues with
48
+ the Playwright Trace Viewer.
49
+ - **Test Data:** Use a unique data set per test run or clean up state to prevent
50
+ cross-contamination.
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: playwright-bdd
3
+ description:
4
+ Wires Gherkin `.feature` files to Playwright via the `playwright-bdd`
5
+ library. Use when running BDD scenarios on a Playwright runtime — pairs
6
+ with the `gherkin-authoring` skill (scenario prose) and the `playwright`
7
+ skill (browser conventions). Drives execution by tag expression with
8
+ trace-first debugging and Playwright-native sharding.
9
+ vendor: playwright
10
+ ---
11
+
12
+ # Skill: playwright-bdd
13
+
14
+ ## Policy Capsule
15
+
16
+ - Complete the pre-authoring grep-for-existing-steps checklist before writing any new scenario text; record the matches in your output.
17
+ - Keep `.feature` files free of Playwright API calls — scenarios describe intent, step definitions translate to browser actions.
18
+ - Generate step bindings into a dedicated directory (e.g. `.features-gen/`) and add it to `.gitignore`; never commit generated specs.
19
+ - Drive runs by tag expression (`--grep "@smoke and not @flaky"`), not filename globs; use the canonical `@smoke`/`@risk-high`/`@platform-*`/`@domain-*` taxonomy.
20
+ - Inject fixtures via `createBdd` rather than pulling singletons from module scope; reset persistent state through fixture teardown, not stray `After` hooks.
21
+ - Reuse `storageState` for authenticated scenarios — create a logged-in user fixture instead of repeating login steps in `Background`.
22
+ - Keep `trace: 'on-first-retry'` (or `'retain-on-failure'`) enabled; reproduce failures by `@scenario-id` tag, not by title.
23
+ - Shard with Playwright's native `--shard=i/N`; never partition by tag expression across CI jobs.
24
+
25
+ Guidance for running Gherkin `.feature` files against Playwright via
26
+ `playwright-bdd`. Pairs with the `gherkin-authoring` skill (scenario prose) and
27
+ the `playwright` skill (browser-level conventions); this skill covers the wiring
28
+ between them.
29
+
30
+ > **Version:** consumers pick their own `playwright-bdd` version. This skill
31
+ > documents behavioral constraints, not a pinned release.
32
+
33
+ ## Pre-authoring checklist (mandatory)
34
+
35
+ The agent MUST complete every item below AND MUST include the results in its
36
+ output report BEFORE any scenario text is written. See
37
+ [§ Step Reuse — Grep Before You Write](../../../../rules/gherkin-standards.md#step-reuse--grep-before-you-write)
38
+ for rationale.
39
+
40
+ 1. Run `rg` against the project's steps directory and list every step signature
41
+ you will reuse. Format: one `Given/When/Then "…"` per line.
42
+ 2. For each scenario line you plan to author, identify the matching existing
43
+ step. For any line with no match, either rephrase to reuse an existing step
44
+ or record it as a gap. Do NOT author new step definitions during scenario
45
+ authoring.
46
+ 3. State the canonical domain tag and platform tag you will apply (or note
47
+ "Cross-Platform → no platform tag" per `gherkin-standards.md`).
48
+ 4. Confirm the AC's `data-testid`, URL, and payload hints will be stripped from
49
+ scenario prose.
50
+
51
+ If you cannot complete every item, stop and report — do not proceed to scenario
52
+ authoring.
53
+
54
+ ## 1. Core Principles
55
+
56
+ - **One source of truth per scenario:** `.feature` files describe intent; step
57
+ definitions translate intent into Playwright calls. Never author browser
58
+ actions in `.feature` prose.
59
+ - **Deterministic tag filtering:** every scenario carries enough tags that any
60
+ CI shard can be selected by a tag expression without inspecting file paths.
61
+ - **Fixture-per-scenario isolation:** scenarios must not share mutable state.
62
+ Treat each scenario as a fresh browser context.
63
+ - **Trace-first debugging:** keep the Playwright Trace Viewer workflow intact —
64
+ `playwright-bdd` wraps Playwright, it does not replace its diagnostics.
65
+
66
+ ## 2. Config Patterns
67
+
68
+ - Generate step-definition bindings into a dedicated output directory (commonly
69
+ `.features-gen/`) and add it to `.gitignore`. Do not commit generated specs.
70
+ - Point `playwright.config.ts` at the generated directory via `testDir`; keep a
71
+ single `defineBddConfig` block that lists `features` and `steps` paths.
72
+ - Register the Cucumber HTML/JSON reporter alongside the Playwright HTML
73
+ reporter so a headless CI invocation emits machine-readable evidence
74
+ alongside the agent-driven `/qa-run-harness` sweep.
75
+ - Use Playwright projects (not Cucumber profiles) for browser matrix fan-out —
76
+ keeps sharding, retries, and trace config in one place.
77
+
78
+ ## 3. Fixture Composition
79
+
80
+ - Extend Playwright's `test` via `playwright-bdd`'s `createBdd` so fixtures
81
+ (auth state, API clients, seeded data) are injected into `Given`/`When`/
82
+ `Then` callbacks by name, not pulled from module-level singletons.
83
+ - Layer fixtures: base Playwright fixtures → domain fixtures (authenticated
84
+ user, seeded tenant) → scenario-scoped helpers. Each layer depends only on the
85
+ layer below.
86
+ - Reset persistent state with fixture teardown, not with `After` hooks buried in
87
+ step files — teardown order is then deterministic and visible in the fixture
88
+ graph.
89
+ - Reuse `storageState` for authenticated scenarios; create a "logged-in user"
90
+ fixture rather than repeating login steps in `Background`.
91
+
92
+ ## 4. Tag-Filtered Execution
93
+
94
+ - Drive runs via tag expressions, not filename globs:
95
+ `npx bddgen && npx playwright test --grep "@smoke and not @flaky"`.
96
+ - Use the canonical tag taxonomy defined in
97
+ [`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md#tag-taxonomy)
98
+ (`@smoke`, `@risk-high`, `@platform-*`, `@domain-*`). Do not invent parallel
99
+ tag vocabularies in the runner config; extend via `@domain-*` only.
100
+ - Wire tag-filtered headless runs to a single npm script so operators never
101
+ reconstruct the generate-then-run sequence by hand; the agent-driven
102
+ `/qa-run-harness` selector mirrors the same tag expressions for browser sweeps.
103
+ - Fail the run if generation produces zero matching scenarios — a silent empty
104
+ suite is worse than a red build.
105
+
106
+ ## 5. Debug & Trace Workflow
107
+
108
+ - Keep `trace: 'on-first-retry'` (or `'retain-on-failure'`) in the Playwright
109
+ config. `playwright-bdd` preserves the trace attachment because each scenario
110
+ maps to a Playwright test.
111
+ - Reproduce a single failing scenario with `--grep "@scenario-id"` rather than
112
+ the scenario title — titles change, tags are stable.
113
+ - Open traces with `npx playwright show-trace` against the artifact produced
114
+ under `test-results/`; the trace timeline annotates each `Given`/`When`/
115
+ `Then` step, which is the primary debug affordance.
116
+ - For step-definition bugs, run with `PWDEBUG=1` to drop into the inspector at
117
+ the failing step — do not add `page.pause()` calls inside step files.
118
+
119
+ ## 6. Sharding & CI Notes
120
+
121
+ - Shard with Playwright's native `--shard=i/N`; do not partition by tag
122
+ expression across jobs — tag-sharding makes flake triage non-deterministic.
123
+ - Run `bddgen` once per job before `playwright test`; cache the generated
124
+ directory only if the cache key includes every `.feature` and step file.
125
+ - Publish the Cucumber HTML/JSON report as the evidence artifact consumed by the
126
+ `epic-testing` helper, alongside the Playwright HTML report and any trace
127
+ zips.
128
+ - Quarantine `@flaky` scenarios with a dedicated job that does not gate the
129
+ merge queue; do not silently retry flakes in the main suite.
130
+
131
+ ## Recommended invocation template
132
+
133
+ Use this template when invoking a subagent to author a `.feature` file from an
134
+ Acceptance Criterion.
135
+
136
+ ```text
137
+ You are an AI coding agent. Your sole task is to invoke the
138
+ **stack/qa/playwright-bdd** skill (defined in this repo) to author one new
139
+ acceptance scenario from a single Acceptance Criterion. You receive nothing
140
+ about this codebase except the AC text and the skill itself — you must
141
+ discover everything else (existing step library, naming conventions, etc.)
142
+ through the skill's prescribed workflow.
143
+
144
+ Follow the skill's guidance precisely. Your output will be evaluated
145
+ against `.agents/rules/gherkin-standards.md`.
146
+
147
+ **Skill to invoke.** Read `.agents/skills/stack/qa/playwright-bdd/SKILL.md`
148
+ and follow it. Also read `.agents/rules/gherkin-standards.md` (which the
149
+ skill references).
150
+
151
+ **The Acceptance Criterion (your sole input).** {{AC_TEXT}}
152
+
153
+ **Your task.**
154
+ 1. Read the skill and the gherkin rule.
155
+ 2. Per the skill's "Step Reuse — Grep Before You Write" section, grep
156
+ {{STEPS_DIR}} to discover the existing step vocabulary BEFORE
157
+ authoring. List the matches you found.
158
+ 3. Author a NEW `.feature` file at {{OUTPUT_PATH}} that covers this AC.
159
+ 4. You are FORBIDDEN from editing any file under {{STEPS_DIR}}. This
160
+ task tests scenario authorship and step REUSE. If a step you need does
161
+ not exist, you must either rephrase the scenario to reuse what exists,
162
+ or report that as a gap (do not silently invent).
163
+ 5. Tag the feature/scenario per the canonical taxonomy in
164
+ `gherkin-standards.md`.
165
+ 6. Honor every "Forbidden Patterns" rule. `data-testid` hints in the AC
166
+ parentheses are for the step-definition layer; they MUST NOT appear in
167
+ your scenario text.
168
+
169
+ **Report back.** Sections A–E: discovered steps, exact `.feature` content,
170
+ step-coverage analysis, forbidden-patterns self-audit, uncertainty/gaps.
171
+ ```
172
+
173
+ This template encodes the invocation prompt used in the Epic C pilot of
174
+ dsj1984/athlete-portal, where a general-purpose subagent — given only an AC and
175
+ a pointer to this skill — produced a publishable scenario on the first attempt
176
+ with **zero Forbidden-Patterns violations**, reused **4 of 5** needed steps from
177
+ the existing library, and surfaced the single remaining step as a clean, named
178
+ gap rather than inventing one. Future maintainers: resist the urge to "simplify"
179
+ this template. Its explicit grep-before-author step, the hard prohibition on
180
+ editing the steps directory, and the mandated gap-report section are what forced
181
+ those outcomes.
182
+
183
+ ## 7. Cross-References
184
+
185
+ - Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
186
+ - Browser-level conventions: `.agents/skills/stack/qa/playwright/SKILL.md`.
187
+ - Operator entry point: `.agents/workflows/qa-run-harness.md`.
188
+ - Evidence handoff: `.agents/workflows/helpers/epic-testing.md`.
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: qa-explore-driving
3
+ description:
4
+ Conventions for agent-driven exploratory QA driving — how the agent itself
5
+ drives a surface during `/qa-explore` (agent-led), as opposed to the
6
+ human-led `/qa-assist`. Use when the agent explores a running app via the
7
+ browser MCP (navigation-first, the default) or walks a static surface (the
8
+ documented interim until consumer persona-seeding lands), under a strictly
9
+ read-only capture invariant. The exploration procedure lives in
10
+ `.agents/workflows/qa-explore.md`; this skill is the driving-conventions
11
+ reference it leans on.
12
+ ---
13
+
14
+ # Skill: qa-explore-driving
15
+
16
+ ## Policy Capsule
17
+
18
+ - Drive the running app **by default** through the browser MCP, navigation-first: start at a root and reach each surface only via UI affordances — never URL-jump to a deep link.
19
+ - Treat **static driving** (reading source, routes, and rendered markup without a live runtime) as the **documented interim** method, chosen at Plan time when a live runtime is not reachable — never the silent fallback.
20
+ - Hold the **read-only capture invariant** absolutely: the agent makes no source edits and no product mutations while driving; the only write is appending to the `temp/qa/<sessionId>` ledger.
21
+ - Authenticated driving depends on **consumer persona-seeding infrastructure that this Epic does not deliver**; without it, drive only the unauthenticated surface or fall back to static, and record the gap — never enter real credentials or fabricate a session.
22
+ - Pick the driving method explicitly in the Plan phase (drive vs. static) and record it in the ledger; do not switch methods mid-surface without a new Plan note.
23
+ - Every phase transition and every GitHub write is HITL-gated; the agent drives and captures, but never files or promotes findings autonomously.
24
+ - Broken navigation, a missing affordance, or a guard redirect loop is a **finding**, not a workaround — record it and move on; do not route around it with a direct URL.
25
+ - Scrub captured evidence (tokens, session cookies, PII) at the boundary via the shared redaction path before any finding reaches disk or GitHub.
26
+
27
+ Guidance for the **agent-driven** half of exploratory QA. `/qa-explore` is the
28
+ agent-led front-end (the agent drives, the operator watches); its human-led
29
+ sibling is `/qa-assist` (the human drives, the agent scribes). The exploration
30
+ **procedure** — argument parsing, phase gates, contract resolution, ledger
31
+ plumbing — is the SSOT in
32
+ [`qa-explore.md`](../../../../workflows/qa-explore.md); this skill shows **how**
33
+ to apply the driving conventions that procedure depends on. The
34
+ navigation-first execution and per-surface capture discipline are shared with
35
+ [`qa-harness`](../qa-harness/SKILL.md) (the known-scenario sweep); browser
36
+ instrumentation lives in
37
+ [`browser-testing-with-devtools`](../../../core/browser-testing-with-devtools/SKILL.md);
38
+ the read-only and no-PII boundaries are inviolable per
39
+ [`security-baseline.md`](../../../../rules/security-baseline.md). Read this
40
+ skill before driving a live surface; read the workflow for the phase order.
41
+
42
+ ## 1. Navigation-First Driving (the default)
43
+
44
+ The agent reaches every surface the way a real user would. This is the
45
+ load-bearing convention — it is what makes findings reflect a user-reachable
46
+ state rather than an artifact of a deep link.
47
+
48
+ - **Drive the running app by default.** When a live runtime is reachable, drive
49
+ it through the browser MCP (the chrome-devtools MCP surface). This is the
50
+ primary method; static driving is the interim alternative (§ 2), not the
51
+ norm.
52
+ - **Start at a root.** Begin each surface at the app's home or dashboard and
53
+ reach the surface under test by clicking nav links, menu items, and buttons —
54
+ the same affordances a user has.
55
+ - **Never URL-jump.** Do not navigate directly to a deep link to establish a
56
+ starting state. URL-jumping bypasses the app's real authorization and routing
57
+ flows, which both masks access-control gaps and produces findings that no
58
+ user could actually trigger.
59
+ - **Broken navigation is a finding, not a workaround.** When an affordance is
60
+ missing, a nav link 404s, or a guard redirect loops, that is the finding. Do
61
+ not route around it with a direct URL — record it and move on.
62
+ - **Observe, do not fabricate.** Use app-provided UI affordances to reach and
63
+ observe a surface. Never script the runtime to manufacture an outcome the
64
+ exploration is meant to discover.
65
+
66
+ ## 2. Static Driving — the Documented Interim
67
+
68
+ Static driving is the **explicitly documented interim** method for when a live
69
+ runtime is not reachable — most commonly because authenticated driving needs
70
+ consumer persona-seeding infrastructure that does not yet exist (§ 4). It walks
71
+ the surface from source, route definitions, and rendered markup rather than a
72
+ running browser.
73
+
74
+ - **Choose it at Plan time, never silently.** Static is a deliberate Plan-phase
75
+ decision recorded in the ledger ("method: static, reason: no reachable
76
+ authenticated runtime"), not an unannounced fallback the agent slips into
77
+ when the browser MCP hiccups.
78
+ - **It is interim, not equivalent.** Static driving cannot exercise real
79
+ authorization, routing guards, or runtime console/network signal. Treat its
80
+ coverage as partial and say so in the ledger; a static pass does not close the
81
+ same coverage a driven pass would.
82
+ - **Same read-only invariant.** Static driving reads source and routes; it makes
83
+ no edits. The read-only capture invariant (§ 3) applies identically.
84
+ - **Promote to driving when the runtime lands.** Static is the bridge until the
85
+ consumer's persona-seeding infrastructure (§ 4) makes authenticated driving
86
+ possible. When that lands, re-run the surface driven; do not leave a surface
87
+ permanently static when it could be driven.
88
+
89
+ ## 3. The Read-Only Capture Invariant
90
+
91
+ The agent-driven Capture phase is **strictly read-only**. This invariant is
92
+ inviolable per [`security-baseline.md`](../../../../rules/security-baseline.md)
93
+ and the Epic's security considerations — it is not a soft preference.
94
+
95
+ - **No source edits.** The agent does not modify application code, config, or
96
+ tests while driving. Exploration observes; it never repairs.
97
+ - **No product mutations.** The agent does not create, update, or delete product
98
+ data, submit destructive forms, or trigger irreversible actions to "see what
99
+ happens". When a surface's only path forward is a mutating action, record the
100
+ boundary as the finding and stop — do not cross it.
101
+ - **The only write is the ledger.** The single permitted side effect of Capture
102
+ is appending finding lines to the session ledger under
103
+ `temp/qa/<sessionId>`. Everything else is observation.
104
+ - **Scrub before persisting.** Strip tokens, session cookies, Authorization
105
+ headers, and PII from captured console and network evidence via the shared
106
+ redaction path **before** any finding reaches disk or GitHub. Captured
107
+ evidence is untrusted until scrubbed.
108
+ - **HITL gates every write outward.** Phase transitions and GitHub writes
109
+ (ticket creation, promotion) happen only behind an operator confirmation gate.
110
+ The agent never files or promotes findings autonomously.
111
+
112
+ ## 4. Authenticated Driving Depends on Consumer Infra (Not Delivered Here)
113
+
114
+ Driving an **authenticated** surface requires signing in as a seeded persona.
115
+ That seeding — provisioning a test persona with the right org, role, and data
116
+ so the agent can reach a logged-in surface navigation-first — is **consumer
117
+ persona-seeding infrastructure that this Epic does not deliver**. It is an
118
+ explicit non-goal of the `/qa-explore` rebuild.
119
+
120
+ - **Unauthenticated surface only, by default.** Without persona-seeding infra in
121
+ the consumer project, drive only the surface reachable without sign-in, or
122
+ fall back to static driving (§ 2) for the authenticated surface. Record the
123
+ gap in the ledger so the partial coverage is visible.
124
+ - **Never enter real credentials.** The agent MUST NOT type real usernames,
125
+ passwords, or tokens to reach an authenticated surface, and MUST NOT fabricate
126
+ or forge a session. This is a hard security boundary, not a convenience to
127
+ work around.
128
+ - **The dependency is the consumer's to satisfy.** When a consumer wants driven
129
+ authenticated exploration, the consumer supplies a dev sign-in seam and seeded
130
+ personas (the same shape `qa-harness` resolves via its contract). Until then,
131
+ authenticated coverage is static or deferred — say which in the ledger.
132
+ - **Surface the gap, don't paper over it.** A surface that could not be driven
133
+ because authenticated seeding is absent is itself a coverage signal worth
134
+ recording, not a silent skip.
135
+
136
+ ## 5. Cross-References
137
+
138
+ - Run procedure (SSOT): [`qa-explore.md`](../../../../workflows/qa-explore.md).
139
+ - Known-scenario sibling sweep: [`qa-harness`](../qa-harness/SKILL.md).
140
+ - Browser instrumentation: [`browser-testing-with-devtools`](../../../core/browser-testing-with-devtools/SKILL.md).
141
+ - Read-only / no-PII boundary: [`security-baseline.md`](../../../../rules/security-baseline.md).
142
+ - Assertion-tier rules: [`testing-standards.md`](../../../../rules/testing-standards.md).
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: qa-harness
3
+ description:
4
+ Conventions for the agent-driven QA harness that drives Gherkin scenarios
5
+ through a real browser. Use when executing `/qa-run-harness` or instrumenting
6
+ a live surface — covers navigation-first execution, per-surface console and
7
+ network capture, design-token visual checks, and the framework-generic
8
+ heuristic cards for turning signal into findings. The harness procedure lives
9
+ in `.agents/workflows/qa-run-harness.md`; this skill is the conventions
10
+ reference it leans on.
11
+ ---
12
+
13
+ # Skill: qa-harness
14
+
15
+ ## Policy Capsule
16
+
17
+ - Drive every scenario navigation-first: start at a root and reach the surface under test only via UI affordances — never URL-jump to a deep link to set up a `Given`.
18
+ - Assert `Then` outcomes semantically against the accessibility snapshot (roles, accessible names, visible text); never via DOM/CSS/XPath selectors, HTTP status codes, response bodies, or DB rows.
19
+ - Capture console and network per surface; turn each non-allowlisted console error and each failed/error-status request into one structured `F#` finding.
20
+ - Filter console through `qa.consoleAllowlist` via `filterConsoleMessages`; treat the allowlist as a benign-noise filter, never as a security control to silence genuine errors.
21
+ - Spot-check surfaces against `qa.designTokens` when set; flag gross token violations (off-palette colors, off-scale spacing/typography) as findings.
22
+ - Scrub captured console and network of tokens, session cookies, and PII before rendering any finding — findings are posted to GitHub at approval time.
23
+ - Bundle findings by likely root cause into a draft for operator sign-off; the harness never files tickets autonomously.
24
+ - Resolve the `qa` contract first and fail loudly when it is absent or malformed; there is no auto-detection fallback and no headless degrade.
25
+
26
+ Guidance for executing the agent-driven QA harness through a real browser (the
27
+ chrome-devtools MCP surface). The harness **procedure** — argument parsing,
28
+ step ordering, contract resolution sequence — is the SSOT in
29
+ [`.agents/workflows/qa-run-harness.md`](../../../../workflows/qa-run-harness.md);
30
+ this skill shows **how** to apply the instrumentation and inspection
31
+ conventions that procedure depends on. The assertion-tier rules it enforces
32
+ live in [`testing-standards.md`](../../../../rules/testing-standards.md)
33
+ (§ Assertion Placement); scenario prose conventions live in
34
+ [`gherkin-authoring`](../gherkin-authoring/SKILL.md); browser-locator
35
+ discipline is shared with [`playwright`](../playwright/SKILL.md). Read this
36
+ skill before instrumenting a live surface; read the workflow for the run order.
37
+
38
+ ## 1. Navigation-First Execution
39
+
40
+ The harness reaches every surface the way a real user would. This is the
41
+ load-bearing convention — it is what makes findings reflect a user-reachable
42
+ state rather than an artifact of a deep link.
43
+
44
+ - **Start at a root.** After sign-in, begin each scenario at the app's home or
45
+ dashboard. Reach the surface under test by clicking nav links, menu items,
46
+ and buttons — the same affordances a user has.
47
+ - **Never URL-jump.** Do not `navigate_page` directly to a deep link to
48
+ establish a `Given`. URL-jumping bypasses the app's real authorization and
49
+ routing flows, which both masks access-control gaps and produces findings
50
+ that no user could actually trigger.
51
+ - **Broken navigation is a finding, not a workaround.** When an affordance is
52
+ missing, a nav link 404s, or a guard redirect loops, that is the finding.
53
+ Do not route around it with a direct URL — record it and move on.
54
+ - **Map Gherkin to browser actions.** `Given` establishes state by navigating
55
+ from the root (sign in as the persona, walk to the starting surface, seed via
56
+ UI where the manifest does not pre-seed). `When` performs the single user
57
+ action (`click`, `fill_form`, then `wait_for` the transition). Use
58
+ `evaluate_script` only for app-provided hooks — never to fabricate the
59
+ outcome a `Then` is meant to observe.
60
+
61
+ ### Semantic `Then` assertion
62
+
63
+ Assert every `Then` against the accessibility snapshot from `take_snapshot`,
64
+ matching on **roles, accessible names, labels, and visible text** that express
65
+ the user-visible outcome — "a banner with text _Invoice sent_ is visible", "a
66
+ row for _ACME Corp_ appears in the invoices table".
67
+
68
+ - **Never** assert against brittle DOM/CSS/XPath selectors.
69
+ - **Never** assert on HTTP status codes, response bodies, or DB rows inside a
70
+ scenario — those are contract-tier concerns (see
71
+ [`testing-standards.md` § Assertion Placement](../../../../rules/testing-standards.md#assertion-placement)).
72
+ - A `Then` that can only be expressed as a wire-shape or DB check is a signal
73
+ the scenario is **mis-tiered**, not a license to break the semantic rule.
74
+
75
+ Record each scenario's result (pass / fail / blocked), the surface it ended on,
76
+ and a one-line user-visible symptom for any failure.
77
+
78
+ ## 2. Per-Surface Console & Network Capture
79
+
80
+ Instrument each surface the moment you land on it, before moving on. Capture is
81
+ **per surface** so evidence is attributable to a concrete user-reachable state.
82
+
83
+ ### 2.1 Console
84
+
85
+ 1. Capture with `list_console_messages` on the current surface.
86
+ 2. Filter through the contract's `consoleAllowlist` using
87
+ [`filterConsoleMessages`](../../../../scripts/lib/qa/console-allowlist.js).
88
+ The filter is the pure decision layer: it escalates only messages at level
89
+ `error` / `severe`, suppresses any message matched by an allowlist
90
+ substring pattern, and returns one structured finding per surviving error in
91
+ capture order (`F1`, `F2`, …).
92
+ 3. Each surviving console error becomes one `F#` finding. Non-error levels
93
+ (`log`, `info`, `debug`, `warning`) are never escalated.
94
+
95
+ The allowlist is a **benign-noise filter, not a security control.** It exists
96
+ to suppress known, expected, harmless console chatter (a third-party widget's
97
+ deprecation notice, a dev-only HMR log). Never expand it to silence a genuine
98
+ error signal — if a real error is noisy, fix the error, do not allowlist it.
99
+ Allowlist matching is case-sensitive substring matching, so patterns stay
100
+ readable in `.agentrc.json` without regex escaping; a blank pattern is ignored
101
+ rather than matching everything.
102
+
103
+ ### 2.2 Network
104
+
105
+ Capture with `list_network_requests` on the surface. Failed requests and
106
+ error-status responses (4xx / 5xx) become findings alongside the
107
+ console-derived set, sharing the same `F#` numbering across the surface.
108
+
109
+ ### 2.3 Design-token visual check
110
+
111
+ When the contract's `designTokens` pointer is set (it defaults to `null`),
112
+ spot-check the rendered surface against the token source. Flag **gross** token
113
+ violations as findings — the goal is catching drift, not pixel-perfect audits:
114
+
115
+ - **Color** — text or controls rendered in an off-palette color where a token
116
+ color is expected (a hard-coded `#3366ff` where the primary token is the
117
+ contract).
118
+ - **Spacing** — padding/margins that visibly break the spacing scale (a
119
+ one-off `13px` gutter amid an 8px-based scale).
120
+ - **Typography** — font families, sizes, or weights outside the type scale.
121
+
122
+ A gross violation is one a designer would call a regression on sight; subtle
123
+ sub-pixel differences are not harness findings. When `designTokens` is `null`,
124
+ skip this check entirely — do not invent a token source.
125
+
126
+ ## 3. Findings — the `F#` Shape
127
+
128
+ Every captured problem is normalized into the structured `F#` finding shape so
129
+ the draft bundle stays diffable and the schema validates:
130
+
131
+ ```jsonc
132
+ {
133
+ "id": "F1", // 1-based, assigned per surface across console+network
134
+ "classification": "console-error", // console-error | network-error | visual-token | ...
135
+ "surface": "/invoices", // the user-reachable surface, not a deep link
136
+ "symptom": "...", // one-line user-visible / captured symptom
137
+ "likelyRootCause": null, // heuristic card output (§4); null until enriched
138
+ "disposition": "follow-up", // blocker | follow-up
139
+ "acceptance": null, // AC this folds into, when known
140
+ "foldsInto": "F2", // optional: another finding this is a duplicate facet of
141
+ "evidence": {
142
+ "console": [{ "level": "error", "text": "..." }],
143
+ "network": []
144
+ }
145
+ }
146
+ ```
147
+
148
+ - **Determinism is load-bearing.** Re-running the same selector over the same
149
+ captured console with the same allowlist yields the same findings in the same
150
+ order. Do not reorder or renumber findings between sweeps.
151
+ - **Scrub before rendering.** Before any finding's `evidence` is rendered or
152
+ drafted, strip tokens, session cookies, Authorization headers, and PII from
153
+ the captured console and network per
154
+ [`security-baseline.md`](../../../../rules/security-baseline.md). Findings are
155
+ posted to GitHub at approval time — captured evidence is untrusted until
156
+ scrubbed.
157
+
158
+ ## 4. Framework-Generic Heuristic Cards
159
+
160
+ The harness ships **framework-generic** root-cause heuristics — they reason
161
+ about symptoms, not about any one frontend framework. Use a card to populate
162
+ `likelyRootCause` and to set `disposition`. The cards are guidance, not a
163
+ classifier: when a symptom matches none cleanly, leave `likelyRootCause: null`
164
+ and let the operator triage from the symptom.
165
+
166
+ | Symptom pattern | Likely root cause | Default disposition |
167
+ | --- | --- | --- |
168
+ | `404` / `Not Found` on a navigation or asset request | Dead route, broken link, or missing build artifact | follow-up (blocker if it breaks the scenario path) |
169
+ | `401` / `403` reaching a surface the persona should see | Missing or over-tight authorization check; guard misconfig | blocker |
170
+ | `500` / `502` / `503` on a user action | Server-side fault behind the action | blocker |
171
+ | Uncaught `TypeError` / `ReferenceError` in console | Null/undefined dereference or missing binding in client code | blocker when it breaks the surface, else follow-up |
172
+ | `Failed to fetch` / `NetworkError` / CORS-rejected request | Misconfigured CORS allowlist, wrong origin, or a downed dependency | follow-up |
173
+ | Hydration / mismatch warning escalated to error | Server/client render divergence | follow-up |
174
+ | Off-palette color, off-scale spacing/typography | Design-token drift — hard-coded value bypassing the token | follow-up |
175
+ | Repeated identical console error across many surfaces | A shared component or global bootstrap fault | fold the duplicates into one finding via `foldsInto` |
176
+
177
+ Heuristics for working the cards:
178
+
179
+ - **Fold duplicates.** When the same error fires on many surfaces, emit one
180
+ finding and point the rest at it with `foldsInto` rather than filing N copies.
181
+ - **Blocker vs. follow-up.** A finding is a **blocker** when it breaks the
182
+ scenario's user-visible outcome or exposes an authorization gap. Everything
183
+ else (noise that does not break the journey, cosmetic token drift) is a
184
+ **follow-up**.
185
+ - **Symptom over diagnosis.** When unsure of the root cause, record the precise
186
+ symptom and leave `likelyRootCause: null`. A wrong guess is worse than an
187
+ honest "unknown" the operator can triage.
188
+
189
+ ## 5. Draft & Sign-Off (Never File Autonomously)
190
+
191
+ Bundle findings **by likely root cause** into proposed follow-up tickets with
192
+ `Depends-on` / `Blocks` relationships, then present the draft for operator
193
+ approval. The harness **MUST NOT** create tickets autonomously — it stops at a
194
+ draft. The operator-approval gate is the safety boundary against spurious
195
+ filing. When the run was triggered from an Epic-testing context, hand the
196
+ **approved** findings to the Epic-testing helper for attachment to the Epic's
197
+ QA evidence ticket.
198
+
199
+ ## 6. Sign-In & Contract Discipline
200
+
201
+ - **Resolve the `qa` contract first.** Before any browser work, resolve the
202
+ contract via `resolveQaContract(config)`. When the block is absent,
203
+ malformed, or missing a required field, the resolver **throws** — relay its
204
+ verbatim message and STOP. There is no auto-detection fallback.
205
+ - **Dev seam only.** Sign in once per persona via the contract's `signInSeam`
206
+ (`kind: 'url'` dev seam or `kind: 'skill'`). **Never** enter real
207
+ credentials. Confirm authenticated state with a `take_snapshot` before
208
+ driving any scenario.
209
+ - **No headless fallback.** The chrome-devtools MCP surface is a host-provided
210
+ runtime dependency. If it is unavailable, degrade with a clear error and stop
211
+ — never fall back to the retired headless BDD runner.
212
+
213
+ ## 7. Cross-References
214
+
215
+ - Run procedure (SSOT): [`qa-run-harness.md`](../../../../workflows/qa-run-harness.md).
216
+ - Console filter module: [`console-allowlist.js`](../../../../scripts/lib/qa/console-allowlist.js).
217
+ - Assertion-tier rules: [`testing-standards.md`](../../../../rules/testing-standards.md).
218
+ - Scenario prose: [`gherkin-authoring`](../gherkin-authoring/SKILL.md).
219
+ - Browser-locator discipline: [`playwright`](../playwright/SKILL.md).
220
+ - Evidence scrubbing: [`security-baseline.md`](../../../../rules/security-baseline.md).
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: vitest
3
+ description:
4
+ Writes fast, isolated unit and integration tests with Vitest. Use when each
5
+ test must run on file-save without shared state — `vi.mock()` for external
6
+ deps, `vi.spyOn()` for call monitoring, AAA structure, and edge-case
7
+ coverage for null/undefined/boundary inputs.
8
+ vendor: vitest
9
+ ---
10
+
11
+ # Skill: Vitest
12
+
13
+ ## Policy Capsule
14
+
15
+ - Keep each test independent — never share mutable state between tests; reset mocks in `afterEach`.
16
+ - Mock external dependencies with `vi.mock()`; use `vi.spyOn()` only to observe call shape, not to replace logic.
17
+ - Structure tests as Arrange / Act / Assert — do not interleave the three phases.
18
+ - Use descriptive titles in the `describe('Component', () => { it('should [action] when [condition]') })` form.
19
+ - Cover error paths, null/undefined inputs, and boundary conditions, not just the happy path.
20
+ - Use snapshots only for large, stable data structures; avoid them for frequently changing UI to prevent snapshot fatigue.
21
+ - Aim for 80%+ coverage on business logic and edge cases; audit with `vitest --coverage`.
22
+ - Test observable behavior, not internal implementation details; refactors should not require rewriting passing tests.
23
+
24
+ Guidelines for writing fast, reliable unit and integration tests.
25
+
26
+ ## 1. Core Principles
27
+
28
+ - **Speed:** Tests should be fast enough to run on every file save.
29
+ - **Isolation:** Each test must be independent. Avoid shared state between
30
+ tests.
31
+ - **Confidence:** Tests should verify behavior, not implementation details.
32
+
33
+ ## 2. Technical Standards
34
+
35
+ - **Mocking:** Use `vi.mock()` for external dependencies (APIs, network calls)
36
+ and `vi.spyOn()` for monitoring function calls.
37
+ - **Snapshot Testing:** Use snapshots for large, stable data structures, but
38
+ avoid them for frequently changing UI components to prevent "snapshot
39
+ fatigue."
40
+ - **Coverage:** Aim for 80%+ coverage on business logic and edge cases. Use
41
+ `vitest --coverage` for auditing.
42
+
43
+ ## 3. Best Practices
44
+
45
+ - **Descriptive Titles:** Use the
46
+ `describe('Component/Utility', () => { it('should [action] when [condition]') })`
47
+ pattern.
48
+ - **Arrange-Act-Assert (AAA):** Structure tests clearly into setup (Arrange),
49
+ execution (Act), and verification (Assert) phases.
50
+ - **Edge Cases:** Always include tests for error states, null/undefined inputs,
51
+ and boundary conditions.