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,58 @@
1
+ ---
2
+ name: tailwind-v4
3
+ description:
4
+ Implements maintainable styling with Tailwind CSS v4. Use when writing
5
+ styles in v4 projects — CSS-first configuration via `@theme` blocks (never
6
+ `tailwind.config.ts/js`), mobile-first breakpoints, full class names (no
7
+ string interpolation), and no arbitrary `p-[13px]`-style values.
8
+ vendor: tailwind
9
+ ---
10
+
11
+ # Skill: Tailwind CSS v4
12
+
13
+ ## Policy Capsule
14
+
15
+ - Configure the theme via CSS-first `@theme` blocks; never use `tailwind.config.ts` or `tailwind.config.js` in v4 projects.
16
+ - Prefer atomic utility classes (`flex`, `p-4`, `text-lg`) over hand-written CSS classes.
17
+ - Use mobile-first breakpoints (`sm:`, `md:`, `lg:`, `xl:`); never write desktop-first overrides.
18
+ - Define `hover:`, `focus-visible:`, and `active:` states explicitly on every interactive element.
19
+ - Arbitrary values (`p-[13px]`) are prohibited — map one-off values to a `@theme` CSS variable instead.
20
+ - Never build utility classes by string interpolation (e.g. `text-${color}`); always use full literal class names so the compiler detects them.
21
+ - Adhere to the design system's spacing, color, and typography tokens defined in `@theme` variables.
22
+ - For repeated UI patterns, extract a component or a CSS `@apply` block — do not let class strings bloat in JSX.
23
+
24
+ Rules for implementing high-performance, maintainable styling using the latest
25
+ Tailwind CSS specification.
26
+
27
+ ## 1. Core Principles
28
+
29
+ - **CSS-First Configuration:** Use CSS variables for theme customization within
30
+ the `@theme` block. **NEVER** use `tailwind.config.ts` or `tailwind.config.js`
31
+ in v4 projects.
32
+ - **Modern Syntax:** Leverage the new `@theme` directive, fluid design
33
+ utilities, and lightning-fast compilation.
34
+ - **Token Consistency:** Strictly adhere to the design system's spacing, color,
35
+ and typography tokens defined in the CSS variables.
36
+
37
+ ## 2. Technical Standards
38
+
39
+ - **Utility Usage:** Prefer atomic utility classes (`flex`, `p-4`, `text-lg`)
40
+ over custom CSS classes.
41
+ - **Responsive Design:** Use mobile-first breakpoints (`sm:`, `md:`, `lg:`,
42
+ `xl:`).
43
+ - **Interactive States:** Explicitly define `hover:`, `focus-visible:`, and
44
+ `active:` states for all interactive elements to ensure a premium feel.
45
+ - **Arbitrary Values:** **STRICTLY PROHIBITED** (`p-[13px]`) unless explicitly
46
+ required by a one-off legacy asset. Always map unique values to a temporary
47
+ CSS variable in the `@theme` block instead.
48
+
49
+ ## 3. Best Practices
50
+
51
+ - **Class Ordering:** Use the standard Tailwind class ordering (Layout -> Box
52
+ Model -> Typography -> Visual -> Misc).
53
+ - **Component Patterns:** For repeated UI patterns (e.g., buttons), use a
54
+ dedicated component or a reusable `@apply` block in a CSS file to avoid
55
+ class-string bloat.
56
+ - **Dynamic Classes:** Never use string interpolation to create utility classes
57
+ (e.g., `text-${color}`). Always use full class names to ensure the compiler
58
+ detects them.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: ui-accessibility-engineer
3
+ description:
4
+ Enforces mobile-first Tailwind CSS and strict WCAG 2.1 AA compliance for
5
+ user-facing UI. Use when building UI components — utility classes only (no
6
+ custom CSS or inline `style={{}}`), mobile-first breakpoints, visible focus
7
+ states, alt text, and 4.5:1 contrast.
8
+ vendor: tailwind
9
+ ---
10
+
11
+ # UI/UX Accessibility & Styling Engineer
12
+
13
+ ## Policy Capsule
14
+
15
+ - Style only with Tailwind utility classes; never write custom CSS files or inline `style={{}}` objects in components.
16
+ - Follow mobile-first responsive design: default classes target mobile, `md:` / `lg:` prefixes scale up.
17
+ - Give every interactive element a visible focus state (`focus:ring`, `focus-visible:*`).
18
+ - Provide meaningful `alt` text on every image; empty `alt=""` only for purely decorative imagery.
19
+ - Meet WCAG 2.1 AA contrast: minimum 4.5:1 for normal text, 3:1 for large text.
20
+ - Ensure every interactive element is reachable and triggerable via keyboard alone.
21
+ - Use semantic HTML elements (`<button>`, `<nav>`, `<main>`) before reaching for ARIA roles.
22
+
23
+ **Description:** Enforces mobile-first Tailwind CSS and strict WCAG AA
24
+ compliance.
25
+
26
+ **Instruction:** You are building user-facing interfaces.
27
+
28
+ - Strictly use Tailwind CSS utility classes. DO NOT write custom CSS or inline
29
+ `style={{}}` objects.
30
+ - Follow a mobile-first approach: default classes apply to mobile, using `md:`
31
+ and `lg:` prefixes for larger viewports.
32
+ - Enforce WCAG 2.1 AA accessibility: All interactive elements must have focus
33
+ states (`focus:ring`), images must have meaningful `alt` text, and color
34
+ contrasts must meet the 4.5:1 ratio.
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: audit-accessibility
3
+ description:
4
+ Audits sites and apps for WCAG 2.1 Level AA compliance using automated and
5
+ manual testing tools. Use when running an accessibility audit or building a
6
+ remediation plan — semantic HTML, contrast, focus management, keyboard
7
+ reachability, and axe-core integration in Vitest/Playwright.
8
+ ---
9
+
10
+ # Skill: Accessibility Audit (A11y)
11
+
12
+ ## Policy Capsule
13
+
14
+ - Use semantic HTML (`<nav>`, `<main>`, `<header>`, `<button>`) before reaching for ARIA roles.
15
+ - Maintain a minimum 4.5:1 contrast for normal text and 3:1 for large text.
16
+ - Ensure a visible focus indicator on every focusable element and a logical tab order across the page.
17
+ - Use `aria-label`, `aria-labelledby`, and `aria-describedby` only when semantic HTML cannot express the intent.
18
+ - Treat automated scans as 40–50% coverage only; follow every audit with manual keyboard and screen-reader checks.
19
+ - Integrate `axe-core` into Vitest or Playwright runs so a11y regressions are caught in CI.
20
+ - Give every `<img>` an `alt` attribute — empty for decorative, descriptive for functional.
21
+ - Verify every interactive element is reachable and triggerable via keyboard alone.
22
+
23
+ Protocols for ensuring WCAG 2.1 Level AA compliance using automated and manual
24
+ testing tools.
25
+
26
+ ## 1. Core Principles
27
+
28
+ - **Inclusive Design:** The application must be usable by everyone, regardless
29
+ of disability.
30
+ - **Automated First, Not Only:** Use tools to catch 40-50% of issues, then
31
+ follow with manual keyboard and screen reader checks.
32
+
33
+ ## 2. Technical Standards
34
+
35
+ - **Semantic HTML:** Use correct tags (e.g., `<nav>`, `<main>`, `<header>`,
36
+ `<button>`) to provide native accessibility features.
37
+ - **Contrast Ratios:** Maintain a minimum 4.5:1 contrast for normal text and 3:1
38
+ for large text.
39
+ - **Focus Management:** Ensure a visible focus indicator is always present and
40
+ the tab order is logical.
41
+ - **ARIA Labels:** Use `aria-label`, `aria-labelledby`, and `aria-describedby`
42
+ only when standard HTML is insufficient.
43
+
44
+ ## 3. Best Practices
45
+
46
+ - **pa11y/axe:** Integrate `axe-core` into Vitest/Playwright tests for automated
47
+ regressions.
48
+ - **Alt Text:** Every image must have an `alt` attribute (empty for decorative
49
+ images, descriptive for functional ones).
50
+ - **Keyboard Navigation:** Every interactive element must be reachable and
51
+ triggerable via keyboard alone.
@@ -0,0 +1,257 @@
1
+ ---
2
+ name: gherkin-authoring
3
+ description:
4
+ Authors `.feature` files that stay business-readable, translate cleanly from
5
+ PRD acceptance criteria, and reuse a shared step-definition library. Use
6
+ when writing or editing scenarios — the SSOT enforcement rules live in
7
+ `.agents/rules/gherkin-standards.md`; this skill shows authors how to apply
8
+ them.
9
+ ---
10
+
11
+ # Skill: gherkin-authoring
12
+
13
+ ## Policy Capsule
14
+
15
+ - Write `Given` clauses as stative preconditions, `When` as a single business action, and `Then` as a user-visible outcome.
16
+ - Allow exactly one `When` per scenario; if you need two, split into two scenarios.
17
+ - Never assert on HTTP status codes, SQL state, DOM selectors, URLs, or JSON payloads inside `.feature` prose — push those to contract tests.
18
+ - Tag every Scenario or Outline with exactly one canonical `@domain-*` tag and the appropriate risk/platform tags from the gherkin-standards taxonomy.
19
+ - Use `Background` only when every scenario in the file genuinely shares the precondition with no per-scenario variation.
20
+ - Reuse existing step definitions: grep the steps tree for the verb stem before authoring a new step.
21
+ - Author one scenario per PRD acceptance criterion; for bounded matrices, use a Scenario Outline with ≤12 Examples rows.
22
+ - Use third-person present-tense, role-qualified actors (`the billing-admin`), never first person.
23
+
24
+ Guidance for authoring `.feature` files that stay business-readable, translate
25
+ cleanly from PRD acceptance criteria, and reuse a shared step-definition
26
+ library. The enforcement rules — tag taxonomy, forbidden patterns, Outline
27
+ conventions, selector discipline, step reuse — live in
28
+ [`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md),
29
+ which is the SSOT. This skill shows authors **how** to apply those rules; read
30
+ the rule file for the **what**. Runtime wiring for Playwright consumers is
31
+ covered by [`playwright-bdd`](../playwright-bdd/SKILL.md); test-layer scope is
32
+ covered by
33
+ [`testing-standards.md`](../../../../rules/testing-standards.md).
34
+
35
+ ## 1. Canonical Given / When / Then Phrasing
36
+
37
+ `.feature` prose is written for a product-minded reader, not a test harness.
38
+ Each clause has exactly one job:
39
+
40
+ - **Given** — a precondition that is *already true* when the scenario starts.
41
+ Stative, past or present tense. No actions.
42
+ - Good: `Given a signed-in account-owner with an unpaid invoice`.
43
+ - Bad: `Given the user clicks the login button` (that's a When).
44
+ - **When** — the single business action under test. One verb, one actor, one
45
+ event. Splitting a When into multiple clauses is almost always wrong — move
46
+ the extra clauses into Given.
47
+ - Good: `When they issue the invoice`.
48
+ - Bad: `When they log in and issue the invoice and download the PDF`.
49
+ - **Then** — an observable, user-visible outcome. Assert what the *user* sees
50
+ or what the *business* records, not what the system emits internally.
51
+ - Good: `Then the invoice appears in the issued invoices list`.
52
+ - Bad: `Then a 201 is returned` (forbidden; see
53
+ [gherkin-standards § Forbidden Patterns](../../../../rules/gherkin-standards.md#forbidden-patterns)).
54
+ - **And / But** — continuation clauses. They inherit the mood of the most
55
+ recent Given/When/Then. Never start a scenario with And/But.
56
+
57
+ Voice and tense:
58
+
59
+ - Third-person, present tense. `the user`, `an admin`, `a billing-admin`
60
+ (role-qualified nouns, not "I" or "we").
61
+ - One clause, one fact. Comma-chained facts hide compound assertions.
62
+ - Numbers and identifiers go in `Examples` tables or fixtures, not inline
63
+ prose. Prose should read the same whether the underlying fixture has 1 or
64
+ 10,000 rows.
65
+
66
+ ## 2. Translating PRD Acceptance Criteria to Scenarios
67
+
68
+ PRD ACs are the raw material. The authoring move is **one AC → one scenario**
69
+ unless the AC encodes a matrix (in which case it becomes a Scenario Outline —
70
+ see §3).
71
+
72
+ Walkthrough — a PRD AC from a billing feature:
73
+
74
+ > **AC-3:** When a billing-admin issues an invoice for a customer with a
75
+ > negative balance, the system rejects the issue and shows an error naming the
76
+ > outstanding amount.
77
+
78
+ Translation steps:
79
+
80
+ 1. **Identify the domain.** Billing → tag the scenario `@domain-billing`.
81
+ 2. **Identify the actor and precondition.** "billing-admin", "customer with a
82
+ negative balance" → two Givens.
83
+ 3. **Identify the single action.** "issues an invoice" → one When.
84
+ 4. **Identify the observable outcome.** "rejects the issue and shows an error
85
+ naming the outstanding amount" → two Thens. The first asserts the business
86
+ outcome (rejection); the second asserts the user-visible detail (error
87
+ names the amount).
88
+ 5. **Pick the risk tag.** If the originating ticket was `risk::high`, add
89
+ `@risk-high`. Smoke tag only if this is a critical path on every PR.
90
+
91
+ Resulting scenario:
92
+
93
+ ```gherkin
94
+ @domain-billing @risk-high
95
+ Scenario: Issuing an invoice is rejected when the customer has a negative balance
96
+ Given a signed-in billing-admin
97
+ And a customer with a negative account balance
98
+ When the billing-admin issues an invoice for that customer
99
+ Then the issue is rejected
100
+ And the rejection message names the outstanding amount
101
+ ```
102
+
103
+ Heuristics:
104
+
105
+ - If a single AC needs more than **one When**, it is really two ACs. Split
106
+ before you write.
107
+ - If a Then starts with "and the database has…" or "and the API returned…",
108
+ you have crossed into step-definition or contract-test territory. Rewrite
109
+ it as user-visible language or move the assertion to a contract test (see
110
+ [testing-standards](../../../../rules/testing-standards.md)).
111
+ - If an AC says "the system logs X", that's an engineering non-functional
112
+ requirement — not a BDD scenario. Cover it with a focused unit or
113
+ integration test, not a `.feature` file.
114
+ - When a PRD AC is phrased negatively ("non-admins cannot export"), prefer a
115
+ Scenario Outline if there are multiple negative roles; write a plain
116
+ Scenario if there is exactly one.
117
+
118
+ ## 3. Background vs. Given — and Outline vs. Multi-Scenario
119
+
120
+ Two authoring decisions that authors routinely get wrong.
121
+
122
+ ### 3.1 Background vs. Given
123
+
124
+ `Background` runs before **every** scenario in the file. Use it only when:
125
+
126
+ - Every scenario in the file genuinely shares the precondition, **and**
127
+ - The precondition has no per-scenario variation (no `<placeholders>`,
128
+ no per-scenario data).
129
+
130
+ Prefer a per-scenario Given when:
131
+
132
+ - Only some scenarios need the precondition. A Background that applies to
133
+ four out of five scenarios is a Background for none of them; move it.
134
+ - The precondition varies by role, plan tier, or fixture shape. Variation
135
+ belongs in a Scenario Outline's Examples, not in Background.
136
+ - Readers cannot understand the scenario without scrolling up to read
137
+ Background. Background is a shortcut; if it hurts readability, inline it.
138
+
139
+ Rule of thumb: if you find yourself writing *"except in the admin scenario,
140
+ where the Background step is actually…"*, delete the Background.
141
+
142
+ ### 3.2 Scenario Outline vs. multiple Scenarios
143
+
144
+ Use `Scenario Outline` when the **same behavior** is exercised across a
145
+ **bounded matrix** (roles, plan tiers, locales). The shape of the scenario —
146
+ Givens, When, Thens — is identical; only the data varies.
147
+
148
+ Use multiple `Scenario` blocks when:
149
+
150
+ - The Givens differ structurally (not just in value).
151
+ - The When verb differs.
152
+ - The Then outcomes differ in kind, not just in value. "Delivered vs.
153
+ denied" is one outcome column (see Outline skeleton in
154
+ [gherkin-standards § Scenario Outline Conventions](../../../../rules/gherkin-standards.md#scenario-outline-conventions)).
155
+ "Email is sent vs. invoice is issued vs. account is suspended" are three
156
+ different scenarios.
157
+
158
+ Scale guardrails (also in gherkin-standards):
159
+
160
+ - Keep `Examples` tables under ~12 rows. Larger tables hide distinct
161
+ behaviors behind a shared skeleton.
162
+ - Split `Examples` by tag when rows need different tags (e.g. `@risk-high`
163
+ on admin rows only).
164
+
165
+ ## 4. Step-Definition Library Structure
166
+
167
+ Authoring scenarios and maintaining steps are the same job split across two
168
+ files. The library layout below keeps that coupling visible.
169
+
170
+ ### 4.1 Layout
171
+
172
+ ```text
173
+ tests/
174
+ steps/
175
+ _common/ # actor, auth, navigation — reused across every domain
176
+ auth.steps.ts
177
+ navigation.steps.ts
178
+ billing/ # one directory per @domain-* tag
179
+ invoices.steps.ts
180
+ subscriptions.steps.ts
181
+ auth/
182
+ signin.steps.ts
183
+ _deprecated/ # steps pending migration; see §4.4
184
+ ```
185
+
186
+ - One directory per `@domain-*` tag. `_common/` holds cross-cutting steps
187
+ (sign-in, navigation, generic waits handled at the fixture layer).
188
+ - Files are named by the noun the steps act on
189
+ (`invoices.steps.ts`, not `billing-steps-1.ts`). A new noun is a new file.
190
+ - Avoid deep nesting. Two levels (`steps/<domain>/<noun>.steps.ts`) is the
191
+ ceiling for most projects.
192
+
193
+ ### 4.2 Naming
194
+
195
+ Step text follows the scenario text verbatim — if the scenario reads `the
196
+ invoice appears in the issued invoices list`, the step regex matches exactly
197
+ that phrase. Divergence between scenario prose and step text is a bug.
198
+
199
+ - Parameterize only over values that vary across scenarios. A step that
200
+ accepts `{string}` for a literal that is always the same value is over-
201
+ parameterized; bake the constant in and rename the step.
202
+ - Role-qualified actors (`{actor}`) read better than generic `{string}`.
203
+ Define a custom parameter type that resolves `account-owner`, `billing-admin`,
204
+ `viewer` to fixtures.
205
+ - Keep step implementations ≤20 lines. Longer implementations indicate a
206
+ missing helper (domain fixture, page object, API client).
207
+
208
+ ### 4.3 Reuse Before Authoring
209
+
210
+ The non-negotiable workflow is in
211
+ [gherkin-standards § Step Reuse](../../../../rules/gherkin-standards.md#step-reuse--grep-before-you-write):
212
+ grep the step tree for the verb stem before writing anything new. In practice:
213
+
214
+ 1. Search for the verb: `rg -n "issues? an invoice" tests/steps`.
215
+ 2. If the phrase exists, **change your scenario** to use that phrase. Do not
216
+ fork a near-duplicate step.
217
+ 3. If a near-match exists, extend the existing step (add a parameter, widen
218
+ the regex) and update every call site in the same PR.
219
+ 4. Only when no reasonable match exists, add a new step in the correct
220
+ domain directory.
221
+
222
+ ### 4.4 Deprecation
223
+
224
+ When a step is superseded:
225
+
226
+ 1. Move the old definition into `steps/_deprecated/` and annotate it with a
227
+ one-line comment naming the replacement.
228
+ 2. Migrate every call site to the replacement in the same PR.
229
+ 3. Delete the `_deprecated/` entry when the migration lands.
230
+
231
+ Never leave two live step definitions that mean the same thing. Parallel
232
+ vocabularies rot the suite faster than any other source of maintenance cost.
233
+
234
+ ## 5. Authoring Checklist
235
+
236
+ Before opening a PR that adds or edits a `.feature` file:
237
+
238
+ - [ ] Every Scenario/Outline carries exactly one `@domain-*` tag.
239
+ - [ ] No forbidden patterns (SQL, status codes, selectors, URLs, payloads,
240
+ framework names, explicit waits) appear in prose.
241
+ - [ ] Each scenario has exactly one `When`.
242
+ - [ ] `Then` clauses assert user-visible outcomes, not implementation.
243
+ - [ ] `Background` is justified (applies to every scenario in the file).
244
+ - [ ] If a Scenario Outline is used, the matrix is bounded (≤12 rows) and the
245
+ shape is truly identical across rows.
246
+ - [ ] Every step phrase grep-matches an existing step definition **or** is
247
+ accompanied by a new step definition in the right domain directory.
248
+ - [ ] Reads standalone — a product reader who has never seen the codebase can
249
+ understand the intent without opening a step file.
250
+
251
+ ## 6. Cross-References
252
+
253
+ - SSOT rules: [`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md).
254
+ - Runtime wiring: [`playwright-bdd`](../playwright-bdd/SKILL.md).
255
+ - Browser-level conventions: [`playwright`](../playwright/SKILL.md).
256
+ - Test-layer scope: [`testing-standards.md`](../../../../rules/testing-standards.md).
257
+ - Example feature: [`examples/invoice-issue.feature`](./examples/invoice-issue.feature).
@@ -0,0 +1,41 @@
1
+ @domain-billing
2
+ Feature: Issuing invoices
3
+ Billing admins and account owners issue invoices to customers. The system
4
+ rejects issues that violate account-state or role constraints and records
5
+ successful issues on the customer's timeline.
6
+
7
+ Background:
8
+ Given the billing workspace is configured with the default tax profile
9
+
10
+ @smoke
11
+ Scenario: A billing-admin issues an invoice for a customer in good standing
12
+ Given a signed-in billing-admin
13
+ And a customer with a zero account balance
14
+ When the billing-admin issues an invoice for that customer for 500 USD
15
+ Then the invoice appears in the issued invoices list
16
+ And the customer's timeline shows the invoice was issued
17
+
18
+ @risk-high
19
+ Scenario: Issuing is rejected when the customer has a negative balance
20
+ Given a signed-in billing-admin
21
+ And a customer with a negative account balance
22
+ When the billing-admin issues an invoice for that customer
23
+ Then the issue is rejected
24
+ And the rejection message names the outstanding amount
25
+
26
+ Scenario Outline: <user-role> access to invoice issuing
27
+ Given a signed-in <user-role>
28
+ And a customer with a zero account balance
29
+ When they attempt to issue an invoice for that customer
30
+ Then the attempt is <issue-outcome>
31
+
32
+ Examples:
33
+ | user-role | issue-outcome |
34
+ | account-owner | accepted |
35
+ | billing-admin | accepted |
36
+ | viewer | denied |
37
+
38
+ @risk-high
39
+ Examples:
40
+ | user-role | issue-outcome |
41
+ | external-audit | denied |
@@ -0,0 +1,199 @@
1
+ ---
2
+ name: lighthouse-baseline
3
+ description:
4
+ Codifies the capture-and-check baseline pattern for long-running quality
5
+ signals (Lighthouse scores, bundle size, p95 latency, runtime memory). Use
6
+ when wiring a new metric that needs a baseline file, paired :capture /
7
+ :check npm scripts, a tolerance-bounded gate, and a weekly refresh
8
+ cadence — the goal is a hard CI signal that ratchets only with intent.
9
+ ---
10
+
11
+ # Skill: Lighthouse-Style Quality Baseline
12
+
13
+ ## Policy Capsule
14
+
15
+ - Use this pattern only for numeric, run-to-run-comparable signals with directional intent (higher-is-better or lower-is-better) and meaningful noise variance.
16
+ - Commit one canonical `baselines/<name>.json` per signal — never combine multiple metrics into a single baseline file.
17
+ - Provide paired `<name>:capture` and `<name>:check` npm scripts; `:capture` writes the baseline, `:check` compares with tolerance and exits non-zero on regression.
18
+ - Implement a `--self-test` mode that runs the comparator against known-good and known-regression fixtures so CI verifies the gate itself.
19
+ - Pick tolerance from observed run-to-run spread (~2σ); tolerance of 0 flaps and trains reviewers to rubber-stamp refreshes.
20
+ - Refresh baselines through deliberate, human-reviewed commits with the `baseline-refresh:` subject prefix; never auto-refresh on every CI run.
21
+ - Run a weekly scheduled `:capture` workflow that opens a PR only when drift exceeds tolerance.
22
+ - Keep baselines under source control — never store them in `temp/` or `coverage/` or anything covered by `.gitignore`.
23
+
24
+ Pattern for promoting an episodic measurement into a long-running quality
25
+ signal. The audit-lighthouse / audit-performance / audit-bundle-size
26
+ workflows produce a snapshot. This skill is for the next step: turning that
27
+ snapshot into a baseline a CI gate can ratchet against.
28
+
29
+ ## When to reach for this
30
+
31
+ Reach for this pattern when **all** of these hold:
32
+
33
+ - The signal is **numeric and comparable** across runs (a score, a duration,
34
+ a byte count). Boolean pass/fail signals belong in a normal lint, not a
35
+ baseline.
36
+ - The signal has **noise floor variance** between runs, so equality checks
37
+ would flap. You need a tolerance band.
38
+ - The signal has **directional intent** — bigger is worse (bundle KB, p95
39
+ ms) or bigger is better (Lighthouse score). The gate enforces direction;
40
+ a refresh moves the line on purpose.
41
+ - Refreshing the baseline should be a **deliberate commit**, reviewed like
42
+ any other change. Auto-refreshing on every CI run defeats the gate.
43
+
44
+ If the signal is binary or one-shot (e.g. "page returns 200", "alt-text
45
+ present"), stay in the audit-* workflow space — don't spin up a baseline
46
+ for it.
47
+
48
+ ## Anatomy
49
+
50
+ The five pieces every baseline of this shape carries:
51
+
52
+ 1. **`baselines/<name>.json`** — canonical snapshot committed to the repo.
53
+ One file per signal. JSON, not YAML or TOML — diff tooling handles it
54
+ uniformly.
55
+ 2. **`<name>:capture` npm script** — runs the measurement, writes the new
56
+ snapshot to a temp path. Never overwrites the canonical baseline
57
+ directly. Operator-driven.
58
+ 3. **`<name>:check` npm script** — runs the measurement, compares against
59
+ `baselines/<name>.json` with a tolerance, exits non-zero on regression.
60
+ Wired into the close-validation gate chain (see `buildDefaultGates` in
61
+ `lib/close-validation.js`) and into the PR gate.
62
+ 4. **`--self-test` flag** — every check script accepts `--self-test`,
63
+ which runs the comparator against synthetic inputs (a known-good and a
64
+ known-regression fixture) and asserts the gate's verdict matches. CI
65
+ runs this on every PR so a comparator bug can't silently mask a real
66
+ regression.
67
+ 5. **Weekly cadence workflow** — a scheduled CI job that runs `:capture`,
68
+ diffs against the committed baseline, opens a PR if drift is real
69
+ (above tolerance) or a comment if it is within band. Intent-driven
70
+ refresh: the PR is the place to argue the regression is justified.
71
+
72
+ ## Worked example: Lighthouse Performance score
73
+
74
+ `baselines/lighthouse-performance.json`:
75
+
76
+ ```json
77
+ {
78
+ "$schema": "../.agents/schemas/baseline-numeric.schema.json",
79
+ "metric": "lighthouse.categories.performance",
80
+ "value": 92,
81
+ "direction": "higher-is-better",
82
+ "tolerance": 2,
83
+ "capturedAt": "2026-05-06T00:00:00Z",
84
+ "capturedFrom": {
85
+ "url": "https://preview.example.com/",
86
+ "lighthouseVersion": "12.2.1",
87
+ "formFactor": "desktop"
88
+ }
89
+ }
90
+ ```
91
+
92
+ Two npm scripts in `package.json`:
93
+
94
+ ```jsonc
95
+ {
96
+ "scripts": {
97
+ "lighthouse:capture": "node scripts/lighthouse-baseline.js --capture",
98
+ "lighthouse:check": "node scripts/lighthouse-baseline.js --check"
99
+ }
100
+ }
101
+ ```
102
+
103
+ The script implements three modes:
104
+
105
+ - `--capture` — Run Lighthouse, write `baselines/lighthouse-performance.json`.
106
+ - `--check` — Run Lighthouse, compare to the committed baseline. Exit 0 if
107
+ the value is within `(baseline ± tolerance)` or improving. Exit 1 if the
108
+ value falls below `(baseline − tolerance)` for higher-is-better metrics,
109
+ or above `(baseline + tolerance)` for lower-is-better metrics.
110
+ - `--self-test` — Skip the real measurement. Run the comparator against
111
+ fixtures (e.g. known-good=92, known-regression=87). Assert that the gate
112
+ verdicts match the expected pass/fail. Exit 0 on success.
113
+
114
+ ## Gate hint shape
115
+
116
+ When the `:check` script fails, the error message must point at the exact
117
+ remediation path. A working hint:
118
+
119
+ ```text
120
+ Lighthouse performance score 87 is below baseline 92 (tolerance ±2).
121
+ Either: (a) fix the regression, or (b) if the drop is justified, run
122
+ `npm run lighthouse:capture` and commit the refreshed baseline with a
123
+ `baseline-refresh:` tagged subject (non-empty body explaining why).
124
+ ```
125
+
126
+ The `baseline-refresh:` subject prefix mirrors the existing CRAP / MI
127
+ convention so the same commit-tag tooling already validating those
128
+ baselines extends to this one.
129
+
130
+ ## Weekly cadence
131
+
132
+ `.github/workflows/lighthouse-weekly.yml` (or the equivalent for your CI):
133
+
134
+ ```yaml
135
+ on:
136
+ schedule:
137
+ - cron: "0 14 * * 1" # Mondays 14:00 UTC
138
+ workflow_dispatch: {}
139
+
140
+ jobs:
141
+ refresh:
142
+ steps:
143
+ - run: npm run lighthouse:capture
144
+ - run: |
145
+ if git diff --quiet baselines/lighthouse-performance.json; then
146
+ echo "No drift; baseline still valid."
147
+ exit 0
148
+ fi
149
+ # Drift exists — open a PR with the refreshed baseline.
150
+ gh pr create --title "baseline-refresh: lighthouse perf" \
151
+ --body "Auto-captured weekly baseline. Review the diff and merge if intentional."
152
+ ```
153
+
154
+ The cadence is weekly, not daily — a daily refresh creates so many PRs
155
+ that reviewers stop reading them. The point is for a reviewer to read the
156
+ diff and say "yes, this is the new floor" or "no, that regression
157
+ shouldn't be in main."
158
+
159
+ ## Tolerance picking
160
+
161
+ Tolerance encodes "what's noise". Pick it from the **observed run-to-run
162
+ spread** on a known-good build, not a vibe:
163
+
164
+ 1. Capture the metric ten times against the same artifact.
165
+ 2. Take the standard deviation σ.
166
+ 3. Set tolerance ≈ 2σ. That gates real regressions without flapping on
167
+ warmup variance.
168
+
169
+ If σ is bigger than the regressions you care about, the metric is too
170
+ noisy for this pattern — invest in stabilising the measurement (warm-up
171
+ runs, pinned hardware, controlled network) before adding the gate.
172
+
173
+ ## Anti-patterns
174
+
175
+ - **Auto-refresh on every CI run.** Defeats the gate; every regression
176
+ becomes the new normal. Refreshes must be commits.
177
+ - **Tolerance = 0.** Flaps on warmup noise, training reviewers to
178
+ rubber-stamp `baseline-refresh:` PRs without reading them. Then a real
179
+ regression sneaks through.
180
+ - **No `--self-test`.** A bug in the comparator silently disables the
181
+ gate. The self-test is the gate's gate.
182
+ - **Multiple metrics in one baseline file.** Couples unrelated drifts. A
183
+ bundle-size regression shouldn't block a Lighthouse refresh. One signal
184
+ per file.
185
+ - **Baseline lives in `temp/` or `coverage/`.** The baseline is source of
186
+ truth — committed and reviewed. Anything under `temp/` or in `.gitignore`
187
+ is a snapshot, not a baseline.
188
+
189
+ ## Cross-references
190
+
191
+ - Existing baseline-shape conventions in this framework:
192
+ `baselines/maintainability.json`, `baselines/crap.json`,
193
+ `baselines/lint.json`. Their `:update` / `:check` script pairs and the
194
+ `baseline-refresh:` commit-subject contract are the prior art this
195
+ skill generalises.
196
+ - The audit-lighthouse workflow (`/audit-lighthouse`) produces the
197
+ one-shot Lighthouse snapshot that feeds the first `:capture`. Run it
198
+ once to confirm the script's measurement matches the workflow's, then
199
+ promote to a baseline.