ma-agents 3.12.0 → 3.12.2

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 (1310) hide show
  1. package/CONTRIBUTING.md +235 -235
  2. package/LICENSE +20 -20
  3. package/QUICK_START.md +154 -154
  4. package/README.md +731 -731
  5. package/SKILLS_STRUCTURE.md +392 -392
  6. package/bin/cli.js +1681 -1573
  7. package/docs/architecture.md +284 -284
  8. package/docs/deployment/vllm-nemotron.md +132 -132
  9. package/docs/development-guide.md +122 -122
  10. package/docs/index.md +48 -48
  11. package/docs/project-overview.md +56 -56
  12. package/docs/project-scan-report.json +50 -50
  13. package/docs/source-tree-analysis.md +84 -84
  14. package/docs/technical-notes/context-persistence-research.md +434 -434
  15. package/docs/validation/bundled-installation-validation.md +52 -52
  16. package/examples/programmatic-usage.js +62 -62
  17. package/index.js +22 -22
  18. package/lib/agents.js +370 -370
  19. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +50 -50
  20. package/lib/bmad-cache/bmb/.markdownlint-cli2.yaml +36 -36
  21. package/lib/bmad-cache/bmb/.prettierignore +9 -9
  22. package/lib/bmad-cache/bmb/CNAME +1 -1
  23. package/lib/bmad-cache/bmb/LICENSE +30 -30
  24. package/lib/bmad-cache/bmb/README.md +75 -75
  25. package/lib/bmad-cache/bmb/_git_preserved/HEAD +1 -1
  26. package/lib/bmad-cache/bmb/_git_preserved/config +13 -13
  27. package/lib/bmad-cache/bmb/_git_preserved/description +1 -1
  28. package/lib/bmad-cache/bmb/_git_preserved/hooks/applypatch-msg.sample +15 -15
  29. package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +24 -24
  30. package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +174 -174
  31. package/lib/bmad-cache/bmb/_git_preserved/hooks/post-update.sample +8 -8
  32. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-applypatch.sample +14 -14
  33. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-commit.sample +49 -49
  34. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-merge-commit.sample +13 -13
  35. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-push.sample +53 -53
  36. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-rebase.sample +169 -169
  37. package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-receive.sample +24 -24
  38. package/lib/bmad-cache/bmb/_git_preserved/hooks/prepare-commit-msg.sample +42 -42
  39. package/lib/bmad-cache/bmb/_git_preserved/hooks/push-to-checkout.sample +78 -78
  40. package/lib/bmad-cache/bmb/_git_preserved/hooks/sendemail-validate.sample +77 -77
  41. package/lib/bmad-cache/bmb/_git_preserved/hooks/update.sample +128 -128
  42. package/lib/bmad-cache/bmb/_git_preserved/info/exclude +6 -6
  43. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +2 -2
  44. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  45. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +1 -1
  46. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +1 -1
  47. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  48. package/lib/bmad-cache/bmb/eslint.config.mjs +141 -141
  49. package/lib/bmad-cache/bmb/package-lock.json +15283 -15283
  50. package/lib/bmad-cache/bmb/package.json +86 -86
  51. package/lib/bmad-cache/bmb/prettier.config.mjs +32 -32
  52. package/lib/bmad-cache/bmb/samples/bmad-agent-code-coach/scripts/init-sanctum.py +288 -288
  53. package/lib/bmad-cache/bmb/samples/bmad-agent-creative-muse/scripts/init-sanctum.py +274 -274
  54. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +9 -9
  55. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module.yaml +8 -8
  56. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +408 -408
  57. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +218 -218
  58. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/recall_metrics.py +229 -229
  59. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/seed_tracker.py +156 -156
  60. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/symbol_stats.py +162 -162
  61. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/tests/test_recall_metrics.py +115 -115
  62. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/tests/test_seed_tracker.py +140 -140
  63. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/tests/test_symbol_stats.py +113 -113
  64. package/lib/bmad-cache/bmb/samples/bmad-agent-sentinel/scripts/init-sanctum.py +285 -285
  65. package/lib/bmad-cache/bmb/samples/bmad-agent-sentinel/scripts/tests/test-init-sanctum.py +174 -174
  66. package/lib/bmad-cache/bmb/samples/bmad-excalidraw/scripts/generate_excalidraw.py +605 -605
  67. package/lib/bmad-cache/bmb/samples/bmad-excalidraw/scripts/tests/test_generate_excalidraw.py +360 -360
  68. package/lib/bmad-cache/bmb/samples/bmad-excalidraw/scripts/tests/test_validate_excalidraw.py +246 -246
  69. package/lib/bmad-cache/bmb/samples/bmad-excalidraw/scripts/validate_excalidraw.py +264 -264
  70. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +16 -16
  71. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module.yaml +13 -13
  72. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +259 -259
  73. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +408 -408
  74. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +218 -218
  75. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/customize-template.toml +62 -62
  76. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/init-sanctum-template.py +277 -277
  77. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/sample-customize-analyst.toml +87 -87
  78. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/references/sample-init-sanctum.py +274 -274
  79. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +534 -534
  80. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +337 -337
  81. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +425 -425
  82. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-sanctum-architecture.py +385 -385
  83. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +482 -482
  84. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/process-template.py +190 -190
  85. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/scan-path-standards.py +324 -324
  86. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/scan-scripts.py +747 -747
  87. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +10 -10
  88. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module.yaml +20 -20
  89. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +259 -259
  90. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +408 -408
  91. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +218 -218
  92. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
  93. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module.yaml +6 -6
  94. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +259 -259
  95. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +408 -408
  96. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +218 -218
  97. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +408 -408
  98. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +218 -218
  99. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/scaffold-setup-skill.py +124 -124
  100. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/scaffold-standalone-module.py +190 -190
  101. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-scaffold-setup-skill.py +230 -230
  102. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-scaffold-standalone-module.py +266 -266
  103. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +314 -314
  104. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +293 -293
  105. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/customize-template.toml +56 -56
  106. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +51 -51
  107. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +406 -406
  108. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +539 -539
  109. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +288 -288
  110. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +285 -285
  111. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py +475 -475
  112. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/scan-path-standards.py +298 -298
  113. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/scan-scripts.py +745 -745
  114. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +243 -243
  115. package/lib/bmad-cache/bmb/skills/module-help.csv +11 -11
  116. package/lib/bmad-cache/bmb/skills/module.yaml +20 -20
  117. package/lib/bmad-cache/bmb/tools/build-docs.mjs +448 -448
  118. package/lib/bmad-cache/bmb/tools/validate-doc-links.cjs +412 -412
  119. package/lib/bmad-cache/bmb/tools/validate-file-refs.mjs +657 -657
  120. package/lib/bmad-cache/bmb/website/astro.config.mjs +142 -142
  121. package/lib/bmad-cache/bmb/website/src/components/Banner.astro +57 -57
  122. package/lib/bmad-cache/bmb/website/src/components/Header.astro +94 -94
  123. package/lib/bmad-cache/bmb/website/src/components/MobileMenuFooter.astro +33 -33
  124. package/lib/bmad-cache/bmb/website/src/content/config.ts +6 -6
  125. package/lib/bmad-cache/bmb/website/src/lib/site-url.mjs +25 -25
  126. package/lib/bmad-cache/bmb/website/src/rehype-base-paths.js +88 -88
  127. package/lib/bmad-cache/bmb/website/src/rehype-markdown-links.js +117 -117
  128. package/lib/bmad-cache/bmb/website/src/styles/custom.css +502 -502
  129. package/lib/bmad-cache/cache-manifest.json +37 -37
  130. package/lib/bmad-cache/cis/.claude-plugin/marketplace.json +33 -33
  131. package/lib/bmad-cache/cis/.markdownlint-cli2.yaml +35 -35
  132. package/lib/bmad-cache/cis/.prettierignore +9 -9
  133. package/lib/bmad-cache/cis/CNAME +1 -1
  134. package/lib/bmad-cache/cis/LICENSE +26 -26
  135. package/lib/bmad-cache/cis/README.md +114 -114
  136. package/lib/bmad-cache/cis/_git_preserved/HEAD +1 -1
  137. package/lib/bmad-cache/cis/_git_preserved/config +13 -13
  138. package/lib/bmad-cache/cis/_git_preserved/description +1 -1
  139. package/lib/bmad-cache/cis/_git_preserved/hooks/applypatch-msg.sample +15 -15
  140. package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +24 -24
  141. package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +174 -174
  142. package/lib/bmad-cache/cis/_git_preserved/hooks/post-update.sample +8 -8
  143. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-applypatch.sample +14 -14
  144. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-commit.sample +49 -49
  145. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-merge-commit.sample +13 -13
  146. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-push.sample +53 -53
  147. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-rebase.sample +169 -169
  148. package/lib/bmad-cache/cis/_git_preserved/hooks/pre-receive.sample +24 -24
  149. package/lib/bmad-cache/cis/_git_preserved/hooks/prepare-commit-msg.sample +42 -42
  150. package/lib/bmad-cache/cis/_git_preserved/hooks/push-to-checkout.sample +78 -78
  151. package/lib/bmad-cache/cis/_git_preserved/hooks/sendemail-validate.sample +77 -77
  152. package/lib/bmad-cache/cis/_git_preserved/hooks/update.sample +128 -128
  153. package/lib/bmad-cache/cis/_git_preserved/info/exclude +6 -6
  154. package/lib/bmad-cache/cis/_git_preserved/packed-refs +2 -2
  155. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  156. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +1 -1
  157. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  158. package/lib/bmad-cache/cis/eslint.config.mjs +141 -141
  159. package/lib/bmad-cache/cis/package-lock.json +17015 -17015
  160. package/lib/bmad-cache/cis/package.json +91 -91
  161. package/lib/bmad-cache/cis/prettier.config.mjs +32 -32
  162. package/lib/bmad-cache/cis/src/module-help.csv +7 -7
  163. package/lib/bmad-cache/cis/src/module.yaml +76 -76
  164. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-brainstorming-coach/customize.toml +38 -38
  165. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-creative-problem-solver/customize.toml +38 -38
  166. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-design-thinking-coach/customize.toml +39 -39
  167. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-innovation-strategist/customize.toml +38 -38
  168. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-presentation-master/customize.toml +73 -73
  169. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-storyteller/customize.toml +60 -60
  170. package/lib/bmad-cache/cis/src/skills/bmad-cis-design-thinking/customize.toml +41 -41
  171. package/lib/bmad-cache/cis/src/skills/bmad-cis-design-thinking/design-methods.csv +30 -30
  172. package/lib/bmad-cache/cis/src/skills/bmad-cis-innovation-strategy/customize.toml +41 -41
  173. package/lib/bmad-cache/cis/src/skills/bmad-cis-innovation-strategy/innovation-frameworks.csv +30 -30
  174. package/lib/bmad-cache/cis/src/skills/bmad-cis-problem-solving/customize.toml +42 -42
  175. package/lib/bmad-cache/cis/src/skills/bmad-cis-problem-solving/solving-methods.csv +30 -30
  176. package/lib/bmad-cache/cis/src/skills/bmad-cis-storytelling/customize.toml +41 -41
  177. package/lib/bmad-cache/cis/src/skills/bmad-cis-storytelling/story-types.csv +25 -25
  178. package/lib/bmad-cache/cis/tools/build-docs.mjs +456 -456
  179. package/lib/bmad-cache/cis/website/astro.config.mjs +172 -172
  180. package/lib/bmad-cache/cis/website/src/components/Banner.astro +71 -71
  181. package/lib/bmad-cache/cis/website/src/components/Header.astro +94 -94
  182. package/lib/bmad-cache/cis/website/src/components/MobileMenuFooter.astro +33 -33
  183. package/lib/bmad-cache/cis/website/src/content/config.ts +7 -7
  184. package/lib/bmad-cache/cis/website/src/content/i18n/zh-CN.json +28 -28
  185. package/lib/bmad-cache/cis/website/src/lib/locales.mjs +27 -27
  186. package/lib/bmad-cache/cis/website/src/lib/site-url.mjs +25 -25
  187. package/lib/bmad-cache/cis/website/src/rehype-base-paths.js +88 -88
  188. package/lib/bmad-cache/cis/website/src/rehype-markdown-links.js +117 -117
  189. package/lib/bmad-cache/cis/website/src/styles/custom.css +503 -503
  190. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +59 -59
  191. package/lib/bmad-cache/gds/.markdownlint-cli2.yaml +35 -35
  192. package/lib/bmad-cache/gds/.prettierignore +9 -9
  193. package/lib/bmad-cache/gds/CNAME +1 -1
  194. package/lib/bmad-cache/gds/LICENSE +26 -26
  195. package/lib/bmad-cache/gds/README.md +132 -132
  196. package/lib/bmad-cache/gds/_git_preserved/HEAD +1 -1
  197. package/lib/bmad-cache/gds/_git_preserved/config +13 -13
  198. package/lib/bmad-cache/gds/_git_preserved/description +1 -1
  199. package/lib/bmad-cache/gds/_git_preserved/hooks/applypatch-msg.sample +15 -15
  200. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +24 -24
  201. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +174 -174
  202. package/lib/bmad-cache/gds/_git_preserved/hooks/post-update.sample +8 -8
  203. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-applypatch.sample +14 -14
  204. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-commit.sample +49 -49
  205. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-merge-commit.sample +13 -13
  206. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-push.sample +53 -53
  207. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-rebase.sample +169 -169
  208. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-receive.sample +24 -24
  209. package/lib/bmad-cache/gds/_git_preserved/hooks/prepare-commit-msg.sample +42 -42
  210. package/lib/bmad-cache/gds/_git_preserved/hooks/push-to-checkout.sample +78 -78
  211. package/lib/bmad-cache/gds/_git_preserved/hooks/sendemail-validate.sample +77 -77
  212. package/lib/bmad-cache/gds/_git_preserved/hooks/update.sample +128 -128
  213. package/lib/bmad-cache/gds/_git_preserved/info/exclude +6 -6
  214. package/lib/bmad-cache/gds/_git_preserved/packed-refs +2 -2
  215. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  216. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +1 -1
  217. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  218. package/lib/bmad-cache/gds/eslint.config.mjs +141 -141
  219. package/lib/bmad-cache/gds/package.json +91 -91
  220. package/lib/bmad-cache/gds/prettier.config.mjs +32 -32
  221. package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/customize.toml +57 -57
  222. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +59 -59
  223. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +129 -129
  224. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/gametest/qa-index.csv +18 -18
  225. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +60 -60
  226. package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/customize.toml +65 -65
  227. package/lib/bmad-cache/gds/src/module-help.csv +36 -36
  228. package/lib/bmad-cache/gds/src/module.yaml +113 -113
  229. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/customize.toml +41 -41
  230. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/game-brain-methods.csv +25 -25
  231. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +41 -41
  232. package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/gds-domain-research/customize.toml +41 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +41 -41
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/game-types.csv +24 -24
  235. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/customize.toml +41 -41
  236. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +41 -41
  237. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +14 -14
  238. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +10 -10
  239. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +41 -41
  240. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +41 -41
  241. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +41 -41
  242. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +41 -41
  243. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/data/genre-complexity.csv +26 -26
  244. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +41 -41
  245. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +14 -14
  246. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +10 -10
  247. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/customize.toml +41 -41
  248. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/customize.toml +41 -41
  249. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +507 -507
  250. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/customize.toml +41 -41
  251. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +340 -340
  252. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +270 -270
  253. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/pattern-categories.csv +12 -12
  254. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/customize.toml +41 -41
  255. package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/customize.toml +41 -41
  256. package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/customize.toml +41 -41
  257. package/lib/bmad-cache/gds/src/workflows/4-production/gds-create-story/customize.toml +41 -41
  258. package/lib/bmad-cache/gds/src/workflows/4-production/gds-dev-story/customize.toml +41 -41
  259. package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/customize.toml +41 -41
  260. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/customize.toml +41 -41
  261. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/sprint-status-template.yaml +55 -55
  262. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/customize.toml +41 -41
  263. package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/customize.toml +41 -41
  264. package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/customize.toml +41 -41
  265. package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/customize.toml +41 -41
  266. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/customize.toml +41 -41
  267. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/customize.toml +41 -41
  268. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/customize.toml +41 -41
  269. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/customize.toml +41 -41
  270. package/lib/bmad-cache/gds/src/workflows/gds-document-project/customize.toml +41 -41
  271. package/lib/bmad-cache/gds/src/workflows/gds-document-project/documentation-requirements.csv +12 -12
  272. package/lib/bmad-cache/gds/src/workflows/gds-document-project/templates/project-scan-report-schema.json +160 -160
  273. package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/customize.toml +41 -41
  274. package/lib/bmad-cache/gds/tools/build-docs.mjs +450 -450
  275. package/lib/bmad-cache/gds/website/astro.config.mjs +142 -142
  276. package/lib/bmad-cache/gds/website/src/components/Banner.astro +71 -71
  277. package/lib/bmad-cache/gds/website/src/components/Header.astro +94 -94
  278. package/lib/bmad-cache/gds/website/src/components/MobileMenuFooter.astro +33 -33
  279. package/lib/bmad-cache/gds/website/src/content/config.ts +6 -6
  280. package/lib/bmad-cache/gds/website/src/lib/site-url.mjs +25 -25
  281. package/lib/bmad-cache/gds/website/src/rehype-base-paths.js +88 -88
  282. package/lib/bmad-cache/gds/website/src/rehype-markdown-links.js +117 -117
  283. package/lib/bmad-cache/gds/website/src/styles/custom.css +503 -503
  284. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +33 -33
  285. package/lib/bmad-cache/tea/.coderabbit.yaml +40 -40
  286. package/lib/bmad-cache/tea/.github/CODE_OF_CONDUCT.md +128 -128
  287. package/lib/bmad-cache/tea/.github/FUNDING.yaml +15 -15
  288. package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/config.yaml +11 -11
  289. package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/feature_request.md +70 -70
  290. package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/issue.md +61 -61
  291. package/lib/bmad-cache/tea/.github/workflows/docs.yaml +66 -66
  292. package/lib/bmad-cache/tea/.github/workflows/quality.yaml +117 -117
  293. package/lib/bmad-cache/tea/.husky/pre-commit +20 -20
  294. package/lib/bmad-cache/tea/.markdownlint-cli2.yaml +36 -36
  295. package/lib/bmad-cache/tea/.prettierignore +9 -9
  296. package/lib/bmad-cache/tea/CHANGELOG.md +241 -241
  297. package/lib/bmad-cache/tea/CONTRIBUTING.md +268 -268
  298. package/lib/bmad-cache/tea/LICENSE +26 -26
  299. package/lib/bmad-cache/tea/README.md +416 -416
  300. package/lib/bmad-cache/tea/SECURITY.md +85 -85
  301. package/lib/bmad-cache/tea/_git_preserved/HEAD +1 -1
  302. package/lib/bmad-cache/tea/_git_preserved/config +13 -13
  303. package/lib/bmad-cache/tea/_git_preserved/description +1 -1
  304. package/lib/bmad-cache/tea/_git_preserved/hooks/applypatch-msg.sample +15 -15
  305. package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +24 -24
  306. package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +174 -174
  307. package/lib/bmad-cache/tea/_git_preserved/hooks/post-update.sample +8 -8
  308. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-applypatch.sample +14 -14
  309. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-commit.sample +49 -49
  310. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-merge-commit.sample +13 -13
  311. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-push.sample +53 -53
  312. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-rebase.sample +169 -169
  313. package/lib/bmad-cache/tea/_git_preserved/hooks/pre-receive.sample +24 -24
  314. package/lib/bmad-cache/tea/_git_preserved/hooks/prepare-commit-msg.sample +42 -42
  315. package/lib/bmad-cache/tea/_git_preserved/hooks/push-to-checkout.sample +78 -78
  316. package/lib/bmad-cache/tea/_git_preserved/hooks/sendemail-validate.sample +77 -77
  317. package/lib/bmad-cache/tea/_git_preserved/hooks/update.sample +128 -128
  318. package/lib/bmad-cache/tea/_git_preserved/info/exclude +6 -6
  319. package/lib/bmad-cache/tea/_git_preserved/packed-refs +2 -2
  320. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  321. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +1 -1
  322. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  323. package/lib/bmad-cache/tea/docs/404.md +20 -20
  324. package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +767 -767
  325. package/lib/bmad-cache/tea/docs/explanation/fixture-architecture.md +484 -484
  326. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +601 -601
  327. package/lib/bmad-cache/tea/docs/explanation/network-first-patterns.md +884 -884
  328. package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +628 -628
  329. package/lib/bmad-cache/tea/docs/explanation/step-file-architecture.md +599 -599
  330. package/lib/bmad-cache/tea/docs/explanation/subagent-architecture.md +189 -189
  331. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +474 -474
  332. package/lib/bmad-cache/tea/docs/explanation/test-quality-standards.md +965 -965
  333. package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +115 -115
  334. package/lib/bmad-cache/tea/docs/glossary/index.md +160 -160
  335. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +571 -571
  336. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +631 -631
  337. package/lib/bmad-cache/tea/docs/how-to/customization/configure-browser-automation.md +243 -243
  338. package/lib/bmad-cache/tea/docs/how-to/customization/extend-tea-with-custom-workflows.md +102 -102
  339. package/lib/bmad-cache/tea/docs/how-to/customization/integrate-playwright-utils.md +846 -846
  340. package/lib/bmad-cache/tea/docs/how-to/workflows/run-atdd.md +462 -462
  341. package/lib/bmad-cache/tea/docs/how-to/workflows/run-automate.md +693 -693
  342. package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +731 -731
  343. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +144 -144
  344. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-review.md +634 -634
  345. package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +966 -966
  346. package/lib/bmad-cache/tea/docs/how-to/workflows/setup-ci.md +763 -763
  347. package/lib/bmad-cache/tea/docs/how-to/workflows/setup-test-framework.md +122 -122
  348. package/lib/bmad-cache/tea/docs/how-to/workflows/teach-me-testing.md +302 -302
  349. package/lib/bmad-cache/tea/docs/index.md +65 -65
  350. package/lib/bmad-cache/tea/docs/reference/commands.md +356 -356
  351. package/lib/bmad-cache/tea/docs/reference/configuration.md +1144 -1144
  352. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +406 -406
  353. package/lib/bmad-cache/tea/docs/reference/troubleshooting.md +837 -837
  354. package/lib/bmad-cache/tea/docs/tutorials/learn-testing-tea-academy.md +266 -266
  355. package/lib/bmad-cache/tea/docs/tutorials/tea-lite-quickstart.md +465 -465
  356. package/lib/bmad-cache/tea/eslint.config.mjs +141 -141
  357. package/lib/bmad-cache/tea/package-lock.json +16046 -16046
  358. package/lib/bmad-cache/tea/package.json +118 -118
  359. package/lib/bmad-cache/tea/prettier.config.mjs +32 -32
  360. package/lib/bmad-cache/tea/src/agents/bmad-tea/SKILL.md +80 -80
  361. package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +104 -104
  362. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  363. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/api-request.md +563 -563
  364. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/api-testing-patterns.md +915 -915
  365. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/auth-session.md +548 -548
  366. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/burn-in.md +273 -273
  367. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/ci-burn-in.md +717 -717
  368. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/component-tdd.md +486 -486
  369. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/contract-testing.md +1066 -1066
  370. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/data-factories.md +500 -500
  371. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/email-auth.md +721 -721
  372. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/error-handling.md +725 -725
  373. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/feature-flags.md +750 -750
  374. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/file-utils.md +456 -456
  375. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/fixture-architecture.md +401 -401
  376. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/fixtures-composition.md +382 -382
  377. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/intercept-network-call.md +426 -426
  378. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/log.md +426 -426
  379. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/network-error-monitor.md +401 -401
  380. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/network-first.md +486 -486
  381. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/network-recorder.md +527 -527
  382. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/nfr-criteria.md +670 -670
  383. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/overview.md +286 -286
  384. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-broker-webhooks.md +237 -237
  385. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-consumer-di.md +310 -310
  386. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-consumer-framework-setup.md +704 -704
  387. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-mcp.md +205 -205
  388. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-consumer-helpers.md +379 -379
  389. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-overview.md +219 -219
  390. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  391. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  392. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -262
  393. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/playwright-cli.md +280 -280
  394. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/playwright-config.md +734 -734
  395. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/probability-impact.md +601 -601
  396. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/recurse.md +421 -421
  397. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/risk-governance.md +615 -615
  398. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/selective-testing.md +732 -732
  399. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/selector-resilience.md +527 -527
  400. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-healing-patterns.md +644 -644
  401. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-levels-framework.md +473 -473
  402. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-priorities-matrix.md +373 -373
  403. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +664 -664
  404. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/timing-debugging.md +372 -372
  405. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/visual-debugging.md +527 -527
  406. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-module-setup.md +122 -122
  407. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-providers.md +155 -155
  408. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-risk-guidance.md +114 -114
  409. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-template-matchers.md +160 -160
  410. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  411. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-timeout-error.md +130 -130
  412. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-waiting-querying.md +167 -167
  413. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +52 -52
  414. package/lib/bmad-cache/tea/src/module-help.csv +11 -11
  415. package/lib/bmad-cache/tea/src/module.yaml +307 -307
  416. package/lib/bmad-cache/tea/src/workflows/testarch/README.md +76 -76
  417. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/SKILL.md +129 -129
  418. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/checklist.md +198 -198
  419. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/customize.toml +40 -40
  420. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/curriculum.yaml +129 -129
  421. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/quiz-questions.yaml +206 -206
  422. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +136 -136
  423. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/session-content-map.yaml +219 -219
  424. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +394 -394
  425. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/instructions.md +137 -137
  426. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-01-init.md +235 -235
  427. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-01b-continue.md +147 -147
  428. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-02-assess.md +258 -258
  429. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-03-session-menu.md +219 -219
  430. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +460 -460
  431. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-02.md +465 -465
  432. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-03.md +301 -301
  433. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-04.md +234 -234
  434. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-05.md +234 -234
  435. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-06.md +209 -209
  436. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +220 -220
  437. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-05-completion.md +347 -347
  438. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-e/step-e-01-assess-workflow.md +141 -141
  439. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-e/step-e-02-apply-edits.md +130 -130
  440. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-v/step-v-01-validate.md +272 -272
  441. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +86 -86
  442. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/progress-template.yaml +95 -95
  443. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/session-notes-template.md +83 -83
  444. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/workflow-plan-teach-me-testing.md +950 -950
  445. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/SKILL.md +85 -85
  446. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/atdd-checklist-template.md +394 -394
  447. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/checklist.md +375 -375
  448. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/customize.toml +40 -40
  449. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/instructions.md +44 -44
  450. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  451. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/api-request.md +563 -563
  452. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/api-testing-patterns.md +915 -915
  453. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/auth-session.md +548 -548
  454. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/burn-in.md +273 -273
  455. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/ci-burn-in.md +717 -717
  456. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/component-tdd.md +486 -486
  457. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/contract-testing.md +1067 -1067
  458. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/data-factories.md +500 -500
  459. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/email-auth.md +721 -721
  460. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/error-handling.md +725 -725
  461. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/feature-flags.md +750 -750
  462. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/file-utils.md +456 -456
  463. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/fixture-architecture.md +401 -401
  464. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/fixtures-composition.md +382 -382
  465. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/intercept-network-call.md +426 -426
  466. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/log.md +426 -426
  467. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/network-error-monitor.md +401 -401
  468. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/network-first.md +486 -486
  469. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/network-recorder.md +527 -527
  470. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/nfr-criteria.md +670 -670
  471. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/overview.md +286 -286
  472. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-broker-webhooks.md +237 -237
  473. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-consumer-di.md +310 -310
  474. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  475. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-mcp.md +205 -205
  476. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  477. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-overview.md +219 -219
  478. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  479. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  480. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -262
  481. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/playwright-cli.md +280 -280
  482. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/playwright-config.md +734 -734
  483. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/probability-impact.md +601 -601
  484. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/recurse.md +421 -421
  485. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/risk-governance.md +615 -615
  486. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/selective-testing.md +732 -732
  487. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/selector-resilience.md +527 -527
  488. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/test-healing-patterns.md +644 -644
  489. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/test-levels-framework.md +473 -473
  490. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/test-priorities-matrix.md +373 -373
  491. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/test-quality.md +664 -664
  492. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/timing-debugging.md +372 -372
  493. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/visual-debugging.md +527 -527
  494. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-module-setup.md +122 -122
  495. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-providers.md +155 -155
  496. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-risk-guidance.md +114 -114
  497. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-template-matchers.md +160 -160
  498. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  499. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-timeout-error.md +130 -130
  500. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-waiting-querying.md +167 -167
  501. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +52 -52
  502. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +244 -244
  503. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01b-resume.md +96 -96
  504. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-02-generation-mode.md +125 -125
  505. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-03-test-strategy.md +110 -110
  506. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04-generate-tests.md +335 -335
  507. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +294 -294
  508. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04b-subagent-e2e-failing.md +244 -244
  509. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04c-aggregate.md +394 -394
  510. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-05-validate-and-complete.md +123 -123
  511. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-e/step-01-assess.md +65 -65
  512. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-e/step-02-apply-edit.md +68 -68
  513. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-v/step-01-validate.md +75 -75
  514. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/validation-report-20260127-095021.md +73 -73
  515. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/validation-report-20260127-102401.md +116 -116
  516. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow-plan.md +21 -21
  517. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.yaml +46 -46
  518. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/SKILL.md +85 -85
  519. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/checklist.md +611 -611
  520. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/customize.toml +40 -40
  521. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/instructions.md +49 -49
  522. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  523. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/api-request.md +563 -563
  524. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/api-testing-patterns.md +915 -915
  525. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/auth-session.md +548 -548
  526. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/burn-in.md +273 -273
  527. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/ci-burn-in.md +717 -717
  528. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/component-tdd.md +486 -486
  529. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/contract-testing.md +1066 -1066
  530. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/data-factories.md +500 -500
  531. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/email-auth.md +721 -721
  532. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/error-handling.md +725 -725
  533. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/feature-flags.md +750 -750
  534. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/file-utils.md +456 -456
  535. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/fixture-architecture.md +401 -401
  536. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/fixtures-composition.md +382 -382
  537. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/intercept-network-call.md +426 -426
  538. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/log.md +426 -426
  539. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/network-error-monitor.md +401 -401
  540. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/network-first.md +486 -486
  541. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/network-recorder.md +527 -527
  542. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/nfr-criteria.md +670 -670
  543. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/overview.md +286 -286
  544. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-broker-webhooks.md +237 -237
  545. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-consumer-di.md +310 -310
  546. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  547. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-mcp.md +205 -205
  548. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  549. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-overview.md +216 -216
  550. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  551. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  552. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/playwright-cli.md +280 -280
  553. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/playwright-config.md +734 -734
  554. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/probability-impact.md +601 -601
  555. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/recurse.md +421 -421
  556. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/risk-governance.md +615 -615
  557. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/selective-testing.md +732 -732
  558. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/selector-resilience.md +527 -527
  559. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/test-healing-patterns.md +644 -644
  560. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/test-levels-framework.md +473 -473
  561. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/test-priorities-matrix.md +373 -373
  562. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/test-quality.md +664 -664
  563. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/timing-debugging.md +372 -372
  564. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/visual-debugging.md +527 -527
  565. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-module-setup.md +122 -122
  566. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-providers.md +155 -155
  567. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-risk-guidance.md +114 -114
  568. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-template-matchers.md +160 -160
  569. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  570. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-timeout-error.md +130 -130
  571. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-waiting-querying.md +167 -167
  572. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +51 -51
  573. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +237 -237
  574. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01b-resume.md +94 -94
  575. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-02-identify-targets.md +169 -169
  576. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03-generate-tests.md +394 -394
  577. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03a-subagent-api.md +271 -271
  578. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03b-subagent-backend.md +246 -246
  579. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03b-subagent-e2e.md +213 -213
  580. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03c-aggregate.md +398 -398
  581. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-04-validate-and-summarize.md +114 -114
  582. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-e/step-01-assess.md +65 -65
  583. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-e/step-02-apply-edit.md +68 -68
  584. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-v/step-01-validate.md +75 -75
  585. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/validation-report-20260127-095021.md +72 -72
  586. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/validation-report-20260127-102401.md +114 -114
  587. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/workflow-plan.md +20 -20
  588. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/workflow.yaml +53 -53
  589. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/SKILL.md +85 -85
  590. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/azure-pipelines-template.yaml +155 -155
  591. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/checklist.md +289 -289
  592. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/customize.toml +40 -40
  593. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/github-actions-template.yaml +328 -328
  594. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/gitlab-ci-template.yaml +158 -158
  595. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/harness-pipeline-template.yaml +160 -160
  596. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/instructions.md +44 -44
  597. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/jenkins-pipeline-template.groovy +129 -129
  598. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  599. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/api-request.md +563 -563
  600. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/api-testing-patterns.md +915 -915
  601. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/auth-session.md +548 -548
  602. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/burn-in.md +273 -273
  603. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/ci-burn-in.md +717 -717
  604. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/component-tdd.md +486 -486
  605. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/contract-testing.md +1066 -1066
  606. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/data-factories.md +500 -500
  607. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/email-auth.md +721 -721
  608. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/error-handling.md +725 -725
  609. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/feature-flags.md +750 -750
  610. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/file-utils.md +456 -456
  611. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/fixture-architecture.md +401 -401
  612. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/fixtures-composition.md +382 -382
  613. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/intercept-network-call.md +426 -426
  614. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/log.md +426 -426
  615. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/network-error-monitor.md +401 -401
  616. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/network-first.md +486 -486
  617. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/network-recorder.md +527 -527
  618. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/nfr-criteria.md +670 -670
  619. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/overview.md +286 -286
  620. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-broker-webhooks.md +237 -237
  621. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-consumer-di.md +310 -310
  622. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  623. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-mcp.md +205 -205
  624. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  625. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-overview.md +216 -216
  626. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  627. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  628. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/playwright-cli.md +280 -280
  629. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/playwright-config.md +734 -734
  630. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/probability-impact.md +601 -601
  631. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/recurse.md +421 -421
  632. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/risk-governance.md +615 -615
  633. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/selective-testing.md +732 -732
  634. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/selector-resilience.md +527 -527
  635. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/test-healing-patterns.md +644 -644
  636. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/test-levels-framework.md +473 -473
  637. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/test-priorities-matrix.md +373 -373
  638. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/test-quality.md +664 -664
  639. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/timing-debugging.md +372 -372
  640. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/visual-debugging.md +527 -527
  641. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-module-setup.md +122 -122
  642. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-providers.md +155 -155
  643. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-risk-guidance.md +114 -114
  644. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-template-matchers.md +160 -160
  645. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  646. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-timeout-error.md +130 -130
  647. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-waiting-querying.md +167 -167
  648. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +51 -51
  649. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-01-preflight.md +158 -158
  650. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-01b-resume.md +110 -110
  651. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +293 -293
  652. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +145 -145
  653. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-04-validate-and-summary.md +100 -100
  654. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-e/step-01-assess.md +65 -65
  655. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-e/step-02-apply-edit.md +68 -68
  656. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-v/step-01-validate.md +89 -89
  657. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/validation-report-20260127-095021.md +72 -72
  658. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/validation-report-20260127-102401.md +114 -114
  659. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/workflow-plan.md +20 -20
  660. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/workflow.yaml +48 -48
  661. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/SKILL.md +85 -85
  662. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/checklist.md +345 -345
  663. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/customize.toml +40 -40
  664. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/instructions.md +44 -44
  665. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  666. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/api-request.md +563 -563
  667. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/api-testing-patterns.md +915 -915
  668. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/auth-session.md +548 -548
  669. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/burn-in.md +273 -273
  670. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/ci-burn-in.md +717 -717
  671. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/component-tdd.md +486 -486
  672. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/contract-testing.md +1066 -1066
  673. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/data-factories.md +500 -500
  674. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/email-auth.md +721 -721
  675. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/error-handling.md +725 -725
  676. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/feature-flags.md +750 -750
  677. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/file-utils.md +456 -456
  678. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/fixture-architecture.md +401 -401
  679. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/fixtures-composition.md +382 -382
  680. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/intercept-network-call.md +426 -426
  681. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/log.md +426 -426
  682. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/network-error-monitor.md +401 -401
  683. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/network-first.md +486 -486
  684. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/network-recorder.md +527 -527
  685. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/nfr-criteria.md +670 -670
  686. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/overview.md +286 -286
  687. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-broker-webhooks.md +237 -237
  688. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-consumer-di.md +310 -310
  689. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  690. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-mcp.md +205 -205
  691. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  692. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-overview.md +216 -216
  693. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  694. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  695. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/playwright-cli.md +280 -280
  696. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/playwright-config.md +734 -734
  697. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/probability-impact.md +601 -601
  698. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/recurse.md +421 -421
  699. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/risk-governance.md +615 -615
  700. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/selective-testing.md +732 -732
  701. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/selector-resilience.md +527 -527
  702. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/test-healing-patterns.md +644 -644
  703. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/test-levels-framework.md +473 -473
  704. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/test-priorities-matrix.md +373 -373
  705. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/test-quality.md +664 -664
  706. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/timing-debugging.md +372 -372
  707. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/visual-debugging.md +527 -527
  708. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-module-setup.md +122 -122
  709. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-providers.md +155 -155
  710. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-risk-guidance.md +114 -114
  711. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-template-matchers.md +160 -160
  712. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  713. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-timeout-error.md +130 -130
  714. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-waiting-querying.md +167 -167
  715. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +51 -51
  716. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-01-preflight.md +132 -132
  717. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-01b-resume.md +116 -116
  718. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-02-select-framework.md +117 -117
  719. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +328 -328
  720. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-04-docs-and-scripts.md +105 -105
  721. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-05-validate-and-summary.md +101 -101
  722. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-e/step-01-assess.md +65 -65
  723. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-e/step-02-apply-edit.md +68 -68
  724. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-v/step-01-validate.md +75 -75
  725. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/validation-report-20260127-095021.md +73 -73
  726. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/validation-report-20260127-102401.md +116 -116
  727. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/workflow-plan.md +22 -22
  728. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/workflow.yaml +48 -48
  729. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +85 -85
  730. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +407 -407
  731. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/customize.toml +40 -40
  732. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +43 -43
  733. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +470 -470
  734. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  735. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/api-request.md +563 -563
  736. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/api-testing-patterns.md +915 -915
  737. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/auth-session.md +548 -548
  738. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/burn-in.md +273 -273
  739. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/ci-burn-in.md +717 -717
  740. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/component-tdd.md +486 -486
  741. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/contract-testing.md +1066 -1066
  742. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/data-factories.md +500 -500
  743. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/email-auth.md +721 -721
  744. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/error-handling.md +725 -725
  745. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/feature-flags.md +750 -750
  746. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/file-utils.md +456 -456
  747. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/fixture-architecture.md +401 -401
  748. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/fixtures-composition.md +382 -382
  749. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/intercept-network-call.md +426 -426
  750. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/log.md +426 -426
  751. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/network-error-monitor.md +401 -401
  752. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/network-first.md +486 -486
  753. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/network-recorder.md +527 -527
  754. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/nfr-criteria.md +670 -670
  755. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/overview.md +286 -286
  756. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-broker-webhooks.md +237 -237
  757. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-consumer-di.md +310 -310
  758. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  759. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-mcp.md +205 -205
  760. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  761. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-overview.md +216 -216
  762. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  763. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  764. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/playwright-cli.md +280 -280
  765. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/playwright-config.md +734 -734
  766. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/probability-impact.md +601 -601
  767. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/recurse.md +421 -421
  768. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/risk-governance.md +615 -615
  769. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/selective-testing.md +732 -732
  770. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/selector-resilience.md +527 -527
  771. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/test-healing-patterns.md +644 -644
  772. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/test-levels-framework.md +473 -473
  773. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/test-priorities-matrix.md +373 -373
  774. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/test-quality.md +664 -664
  775. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/timing-debugging.md +372 -372
  776. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/visual-debugging.md +527 -527
  777. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-module-setup.md +122 -122
  778. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-providers.md +155 -155
  779. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-risk-guidance.md +114 -114
  780. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-template-matchers.md +160 -160
  781. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  782. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-timeout-error.md +130 -130
  783. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-waiting-querying.md +167 -167
  784. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +51 -51
  785. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +138 -138
  786. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01b-resume.md +106 -106
  787. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +107 -107
  788. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-03-gather-evidence.md +108 -108
  789. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +254 -254
  790. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +138 -138
  791. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +84 -84
  792. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +85 -85
  793. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +88 -88
  794. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +264 -264
  795. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +116 -116
  796. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-e/step-01-assess.md +65 -65
  797. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-e/step-02-apply-edit.md +68 -68
  798. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-v/step-01-validate.md +75 -75
  799. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/validation-report-20260127-095021.md +73 -73
  800. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/validation-report-20260127-102401.md +116 -116
  801. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +19 -19
  802. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +48 -48
  803. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/SKILL.md +87 -87
  804. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +464 -464
  805. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/customize.toml +40 -40
  806. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/instructions.md +104 -104
  807. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  808. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/api-request.md +563 -563
  809. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/api-testing-patterns.md +915 -915
  810. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/auth-session.md +548 -548
  811. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/burn-in.md +273 -273
  812. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/ci-burn-in.md +717 -717
  813. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/component-tdd.md +486 -486
  814. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/contract-testing.md +1066 -1066
  815. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/data-factories.md +500 -500
  816. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/email-auth.md +721 -721
  817. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/error-handling.md +725 -725
  818. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/feature-flags.md +750 -750
  819. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/file-utils.md +456 -456
  820. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/fixture-architecture.md +401 -401
  821. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/fixtures-composition.md +382 -382
  822. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/intercept-network-call.md +426 -426
  823. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/log.md +426 -426
  824. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/network-error-monitor.md +401 -401
  825. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/network-first.md +486 -486
  826. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/network-recorder.md +527 -527
  827. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/nfr-criteria.md +670 -670
  828. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/overview.md +286 -286
  829. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-broker-webhooks.md +237 -237
  830. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-consumer-di.md +310 -310
  831. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  832. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-mcp.md +205 -205
  833. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  834. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-overview.md +216 -216
  835. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  836. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  837. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/playwright-cli.md +280 -280
  838. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/playwright-config.md +734 -734
  839. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/probability-impact.md +601 -601
  840. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/recurse.md +421 -421
  841. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/risk-governance.md +615 -615
  842. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/selective-testing.md +732 -732
  843. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/selector-resilience.md +527 -527
  844. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/test-healing-patterns.md +644 -644
  845. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/test-levels-framework.md +473 -473
  846. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/test-priorities-matrix.md +373 -373
  847. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/test-quality.md +664 -664
  848. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/timing-debugging.md +372 -372
  849. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/visual-debugging.md +527 -527
  850. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-module-setup.md +122 -122
  851. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-providers.md +155 -155
  852. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-risk-guidance.md +114 -114
  853. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-template-matchers.md +160 -160
  854. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  855. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-timeout-error.md +130 -130
  856. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-waiting-querying.md +167 -167
  857. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +51 -51
  858. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01-detect-mode.md +140 -140
  859. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01b-resume.md +116 -116
  860. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +248 -248
  861. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +116 -116
  862. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +129 -129
  863. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +236 -236
  864. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-e/step-01-assess.md +65 -65
  865. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-e/step-02-apply-edit.md +68 -68
  866. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-v/step-01-validate.md +75 -75
  867. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +233 -233
  868. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-handoff-template.md +70 -70
  869. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +399 -399
  870. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +347 -347
  871. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/validation-report-20260127-095021.md +73 -73
  872. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/validation-report-20260127-102401.md +116 -116
  873. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/workflow-plan.md +22 -22
  874. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/workflow.yaml +77 -77
  875. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/SKILL.md +85 -85
  876. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/checklist.md +475 -475
  877. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/customize.toml +40 -40
  878. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/instructions.md +45 -45
  879. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  880. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/api-request.md +563 -563
  881. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/api-testing-patterns.md +915 -915
  882. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/auth-session.md +548 -548
  883. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/burn-in.md +273 -273
  884. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/ci-burn-in.md +717 -717
  885. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/component-tdd.md +486 -486
  886. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/contract-testing.md +1066 -1066
  887. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/data-factories.md +500 -500
  888. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/email-auth.md +721 -721
  889. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/error-handling.md +725 -725
  890. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/feature-flags.md +750 -750
  891. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/file-utils.md +456 -456
  892. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/fixture-architecture.md +401 -401
  893. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/fixtures-composition.md +382 -382
  894. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/intercept-network-call.md +426 -426
  895. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/log.md +426 -426
  896. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/network-error-monitor.md +401 -401
  897. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/network-first.md +486 -486
  898. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/network-recorder.md +527 -527
  899. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/nfr-criteria.md +670 -670
  900. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/overview.md +286 -286
  901. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-broker-webhooks.md +237 -237
  902. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-consumer-di.md +310 -310
  903. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  904. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-mcp.md +205 -205
  905. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  906. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-overview.md +216 -216
  907. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  908. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  909. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/playwright-cli.md +280 -280
  910. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/playwright-config.md +734 -734
  911. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/probability-impact.md +601 -601
  912. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/recurse.md +421 -421
  913. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/risk-governance.md +615 -615
  914. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/selective-testing.md +732 -732
  915. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/selector-resilience.md +527 -527
  916. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/test-healing-patterns.md +644 -644
  917. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/test-levels-framework.md +473 -473
  918. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/test-priorities-matrix.md +373 -373
  919. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/test-quality.md +664 -664
  920. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/timing-debugging.md +372 -372
  921. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/visual-debugging.md +527 -527
  922. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-module-setup.md +122 -122
  923. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-providers.md +155 -155
  924. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-risk-guidance.md +114 -114
  925. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-template-matchers.md +160 -160
  926. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  927. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-timeout-error.md +130 -130
  928. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-waiting-querying.md +167 -167
  929. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +51 -51
  930. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01-load-context.md +197 -197
  931. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01b-resume.md +104 -104
  932. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-02-discover-tests.md +120 -120
  933. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03-quality-evaluation.md +274 -274
  934. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03a-subagent-determinism.md +257 -257
  935. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03b-subagent-isolation.md +125 -125
  936. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03c-subagent-maintainability.md +102 -102
  937. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03e-subagent-performance.md +117 -117
  938. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03f-aggregate-scores.md +277 -277
  939. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-04-generate-report.md +119 -119
  940. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-e/step-01-assess.md +65 -65
  941. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-e/step-02-apply-edit.md +68 -68
  942. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-v/step-01-validate.md +75 -75
  943. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/test-review-template.md +387 -387
  944. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/validation-report-20260127-095021.md +72 -72
  945. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/validation-report-20260127-102401.md +114 -114
  946. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/workflow-plan.md +18 -18
  947. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/workflow.yaml +48 -48
  948. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/SKILL.md +87 -87
  949. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +671 -671
  950. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/customize.toml +40 -40
  951. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/instructions.md +45 -45
  952. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/adr-quality-readiness-checklist.md +377 -377
  953. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/api-request.md +563 -563
  954. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/api-testing-patterns.md +915 -915
  955. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/auth-session.md +548 -548
  956. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/burn-in.md +273 -273
  957. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/ci-burn-in.md +717 -717
  958. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/component-tdd.md +486 -486
  959. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/contract-testing.md +1066 -1066
  960. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/data-factories.md +500 -500
  961. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/email-auth.md +721 -721
  962. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/error-handling.md +725 -725
  963. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/feature-flags.md +750 -750
  964. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/file-utils.md +456 -456
  965. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/fixture-architecture.md +401 -401
  966. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/fixtures-composition.md +382 -382
  967. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/intercept-network-call.md +426 -426
  968. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/log.md +426 -426
  969. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/network-error-monitor.md +401 -401
  970. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/network-first.md +486 -486
  971. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/network-recorder.md +527 -527
  972. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/nfr-criteria.md +670 -670
  973. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/overview.md +286 -286
  974. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-broker-webhooks.md +237 -237
  975. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-consumer-di.md +310 -310
  976. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-consumer-framework-setup.md +757 -757
  977. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-mcp.md +205 -205
  978. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-consumer-helpers.md +380 -380
  979. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-overview.md +216 -216
  980. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-provider-verifier.md +397 -397
  981. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-request-filter.md +224 -224
  982. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/playwright-cli.md +280 -280
  983. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/playwright-config.md +734 -734
  984. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/probability-impact.md +601 -601
  985. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/recurse.md +421 -421
  986. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/risk-governance.md +615 -615
  987. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/selective-testing.md +732 -732
  988. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/selector-resilience.md +527 -527
  989. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/test-healing-patterns.md +644 -644
  990. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/test-levels-framework.md +473 -473
  991. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/test-priorities-matrix.md +373 -373
  992. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/test-quality.md +664 -664
  993. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/timing-debugging.md +372 -372
  994. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/visual-debugging.md +527 -527
  995. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-module-setup.md +122 -122
  996. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-providers.md +155 -155
  997. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-risk-guidance.md +114 -114
  998. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-template-matchers.md +160 -160
  999. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-testing-fundamentals.md +42 -42
  1000. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-timeout-error.md +130 -130
  1001. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-waiting-querying.md +167 -167
  1002. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +51 -51
  1003. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01-load-context.md +166 -166
  1004. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01b-resume.md +102 -102
  1005. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-02-discover-tests.md +132 -132
  1006. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-03-map-criteria.md +101 -101
  1007. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-04-analyze-gaps.md +628 -628
  1008. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-05-gate-decision.md +681 -681
  1009. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-e/step-01-assess.md +65 -65
  1010. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-e/step-02-apply-edit.md +68 -68
  1011. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-v/step-01-validate.md +75 -75
  1012. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +716 -716
  1013. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/validation-report-20260127-095021.md +73 -73
  1014. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/validation-report-20260127-102401.md +116 -116
  1015. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/workflow-plan.md +24 -24
  1016. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/workflow.yaml +80 -80
  1017. package/lib/bmad-cache/tea/test/README.md +23 -23
  1018. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -27
  1019. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -30
  1020. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -22
  1021. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -20
  1022. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -25
  1023. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -24
  1024. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -25
  1025. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -25
  1026. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -25
  1027. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -31
  1028. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -25
  1029. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -25
  1030. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -25
  1031. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -25
  1032. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -26
  1033. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -24
  1034. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -27
  1035. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -23
  1036. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -24
  1037. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -27
  1038. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -27
  1039. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -24
  1040. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -29
  1041. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -31
  1042. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -28
  1043. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -28
  1044. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -5
  1045. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -28
  1046. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -11
  1047. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -19
  1048. package/lib/bmad-cache/tea/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -18
  1049. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -24
  1050. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -22
  1051. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -27
  1052. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -31
  1053. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -22
  1054. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +37 -37
  1055. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -24
  1056. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -31
  1057. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -34
  1058. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -24
  1059. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -24
  1060. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -24
  1061. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -24
  1062. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -23
  1063. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -24
  1064. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -24
  1065. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -24
  1066. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -22
  1067. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -28
  1068. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -30
  1069. package/lib/bmad-cache/tea/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -24
  1070. package/lib/bmad-cache/tea/test/schema/agent.js +491 -491
  1071. package/lib/bmad-cache/tea/test/test-agent-schema.js +387 -387
  1072. package/lib/bmad-cache/tea/test/test-installation-components.js +422 -422
  1073. package/lib/bmad-cache/tea/test/test-knowledge-base.js +213 -213
  1074. package/lib/bmad-cache/tea/test/test-release-metadata.js +71 -71
  1075. package/lib/bmad-cache/tea/test/unit-test-schema.js +133 -133
  1076. package/lib/bmad-cache/tea/test/validate-agent-schema.js +110 -110
  1077. package/lib/bmad-cache/tea/tools/build-docs.js +575 -575
  1078. package/lib/bmad-cache/tea/tools/fix-doc-links.js +288 -288
  1079. package/lib/bmad-cache/tea/tools/schema/agent.js +491 -491
  1080. package/lib/bmad-cache/tea/tools/validate-agent-schema.js +284 -284
  1081. package/lib/bmad-cache/tea/tools/validate-doc-links.js +371 -371
  1082. package/lib/bmad-cache/tea/tools/validate-tea-workflow-descriptions.js +122 -122
  1083. package/lib/bmad-cache/tea/tools/verify-paths.js +100 -100
  1084. package/lib/bmad-cache/tea/website/README.md +137 -137
  1085. package/lib/bmad-cache/tea/website/astro.config.mjs +183 -183
  1086. package/lib/bmad-cache/tea/website/package-lock.json +6856 -6856
  1087. package/lib/bmad-cache/tea/website/package.json +24 -24
  1088. package/lib/bmad-cache/tea/website/public/img/tea-logo.svg +7 -7
  1089. package/lib/bmad-cache/tea/website/public/robots.txt +37 -37
  1090. package/lib/bmad-cache/tea/website/src/components/Banner.astro +74 -74
  1091. package/lib/bmad-cache/tea/website/src/components/Header.astro +121 -121
  1092. package/lib/bmad-cache/tea/website/src/components/MobileMenuFooter.astro +53 -53
  1093. package/lib/bmad-cache/tea/website/src/content/config.ts +6 -6
  1094. package/lib/bmad-cache/tea/website/src/lib/site-url.js +25 -25
  1095. package/lib/bmad-cache/tea/website/src/pages/404.astro +11 -11
  1096. package/lib/bmad-cache/tea/website/src/rehype-base-paths.js +89 -89
  1097. package/lib/bmad-cache/tea/website/src/rehype-markdown-links.js +117 -117
  1098. package/lib/bmad-cache/tea/website/src/styles/custom.css +518 -518
  1099. package/lib/bmad-cache/tea/website/tsconfig.json +9 -9
  1100. package/lib/bmad-cache/wds/.claude-plugin/marketplace.json +35 -35
  1101. package/lib/bmad-cache/wds/.markdownlint-cli2.yaml +38 -38
  1102. package/lib/bmad-cache/wds/.prettierignore +9 -9
  1103. package/lib/bmad-cache/wds/LICENSE +27 -27
  1104. package/lib/bmad-cache/wds/README.md +139 -139
  1105. package/lib/bmad-cache/wds/_git_preserved/HEAD +1 -1
  1106. package/lib/bmad-cache/wds/_git_preserved/config +13 -13
  1107. package/lib/bmad-cache/wds/_git_preserved/description +1 -1
  1108. package/lib/bmad-cache/wds/_git_preserved/hooks/applypatch-msg.sample +15 -15
  1109. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +24 -24
  1110. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +174 -174
  1111. package/lib/bmad-cache/wds/_git_preserved/hooks/post-update.sample +8 -8
  1112. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-applypatch.sample +14 -14
  1113. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-commit.sample +49 -49
  1114. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-merge-commit.sample +13 -13
  1115. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-push.sample +53 -53
  1116. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-rebase.sample +169 -169
  1117. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-receive.sample +24 -24
  1118. package/lib/bmad-cache/wds/_git_preserved/hooks/prepare-commit-msg.sample +42 -42
  1119. package/lib/bmad-cache/wds/_git_preserved/hooks/push-to-checkout.sample +78 -78
  1120. package/lib/bmad-cache/wds/_git_preserved/hooks/sendemail-validate.sample +77 -77
  1121. package/lib/bmad-cache/wds/_git_preserved/hooks/update.sample +128 -128
  1122. package/lib/bmad-cache/wds/_git_preserved/info/exclude +6 -6
  1123. package/lib/bmad-cache/wds/_git_preserved/packed-refs +2 -2
  1124. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
  1125. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +1 -1
  1126. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
  1127. package/lib/bmad-cache/wds/eslint.config.mjs +152 -152
  1128. package/lib/bmad-cache/wds/package.json +82 -82
  1129. package/lib/bmad-cache/wds/prettier.config.mjs +32 -32
  1130. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +12 -12
  1131. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +12 -12
  1132. package/lib/bmad-cache/wds/src/module-help.csv +19 -19
  1133. package/lib/bmad-cache/wds/src/module.yaml +145 -145
  1134. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +1 -1
  1135. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +1 -1
  1136. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-1-project-brief/templates/platform-requirements.template.yaml +69 -69
  1137. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-7-design-system/templates/catalog.template.html +363 -363
  1138. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +1 -1
  1139. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/templates/platform-requirements.template.yaml +69 -69
  1140. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +1 -1
  1141. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +1 -1
  1142. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +1 -1
  1143. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/design-delivery.template.yaml +104 -104
  1144. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/test-scenario.template.yaml +192 -192
  1145. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +1 -1
  1146. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.css +164 -164
  1147. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.html +18 -18
  1148. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.js +430 -430
  1149. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/demo-data-template.json +63 -63
  1150. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/page-template.html +465 -465
  1151. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/work-file-template.yaml +264 -264
  1152. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +1 -1
  1153. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +1 -1
  1154. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/templates/catalog.template.html +363 -363
  1155. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +1 -1
  1156. package/lib/bmad-customize/bmm-analyst.customize.yaml +8 -8
  1157. package/lib/bmad-customize/bmm-architect.customize.yaml +8 -8
  1158. package/lib/bmad-customize/bmm-bmad-master.customize.yaml +6 -6
  1159. package/lib/bmad-customize/bmm-dev.customize.yaml +8 -8
  1160. package/lib/bmad-customize/bmm-pm.customize.yaml +8 -8
  1161. package/lib/bmad-customize/bmm-qa.customize.yaml +26 -26
  1162. package/lib/bmad-customize/bmm-sm.customize.yaml +8 -8
  1163. package/lib/bmad-customize/bmm-tech-writer.customize.yaml +8 -8
  1164. package/lib/bmad-customize/bmm-ux-designer.customize.yaml +8 -8
  1165. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +1 -1
  1166. package/lib/bmad.js +191 -1
  1167. package/lib/installer.js +2024 -2024
  1168. package/lib/merge/roomodes.js +125 -125
  1169. package/lib/methodology/version.json +7 -7
  1170. package/lib/mil498-templates/OCD.md +169 -169
  1171. package/lib/mil498-templates/README.md +4 -4
  1172. package/lib/mil498-templates/SDD.md +163 -163
  1173. package/lib/mil498-templates/SDP.md +307 -307
  1174. package/lib/mil498-templates/SRS.md +219 -219
  1175. package/lib/mil498-templates/SSDD.md +154 -154
  1176. package/lib/mil498-templates/SSS.md +225 -225
  1177. package/lib/mil498-templates/STD.md +188 -188
  1178. package/lib/profile.js +130 -130
  1179. package/lib/reconfigure.js +334 -334
  1180. package/lib/skill-authoring.js +732 -732
  1181. package/lib/templates/agents-md.template.md +67 -67
  1182. package/lib/templates/clinerules.template.md +13 -13
  1183. package/lib/templates/instruction-block-onprem.template.md +86 -86
  1184. package/lib/templates/instruction-block-universal.template.md +29 -29
  1185. package/lib/templates/project-context.template.md +47 -47
  1186. package/lib/templates/roomodes.template.yaml +96 -96
  1187. package/lib/uninstall.js +314 -314
  1188. package/lib/warning-filter.js +245 -245
  1189. package/mil498/OCD.md +169 -169
  1190. package/mil498/README.md +4 -4
  1191. package/mil498/SDP.md +307 -307
  1192. package/mil498/SRS.md +219 -219
  1193. package/mil498/SSDD.md +154 -154
  1194. package/mil498/SSS.md +225 -225
  1195. package/mil498/STD.md +188 -188
  1196. package/package.json +57 -57
  1197. package/scripts/build-bmad-cache.js +494 -494
  1198. package/skills/README.md +473 -473
  1199. package/skills/add-sprint/SKILL.md +204 -204
  1200. package/skills/add-sprint/skill.json +7 -7
  1201. package/skills/add-to-sprint/SKILL.md +270 -270
  1202. package/skills/add-to-sprint/skill.json +7 -7
  1203. package/skills/ai-audit-trail/SKILL.md +19 -19
  1204. package/skills/ai-audit-trail/skill.json +20 -20
  1205. package/skills/auto-bug-detection/SKILL.md +165 -165
  1206. package/skills/auto-bug-detection/skill.json +8 -8
  1207. package/skills/bmad-sprint-planning/SKILL.md +362 -362
  1208. package/skills/bmad-sprint-planning/skill.json +7 -7
  1209. package/skills/bmad-sprint-status/SKILL.md +312 -312
  1210. package/skills/bmad-sprint-status/skill.json +7 -7
  1211. package/skills/cleanup-done/SKILL.md +242 -242
  1212. package/skills/cleanup-done/skill.json +7 -7
  1213. package/skills/close-sprint/SKILL.md +409 -409
  1214. package/skills/close-sprint/skill.json +7 -7
  1215. package/skills/code-review/SKILL.md +79 -79
  1216. package/skills/code-review/claude-code.md +64 -64
  1217. package/skills/code-review/cline.md +55 -55
  1218. package/skills/code-review/generic.md +39 -39
  1219. package/skills/code-review/skill.json +7 -7
  1220. package/skills/commit-message/SKILL.md +75 -75
  1221. package/skills/commit-message/generic.md +75 -75
  1222. package/skills/commit-message/skill.json +7 -7
  1223. package/skills/cpp-best-practices/SKILL.md +230 -230
  1224. package/skills/cpp-best-practices/examples/modern-idioms.md +189 -189
  1225. package/skills/cpp-best-practices/examples/naming-and-organization.md +102 -102
  1226. package/skills/cpp-best-practices/skill.json +25 -25
  1227. package/skills/create-hardened-docker-skill/README.md +85 -85
  1228. package/skills/create-hardened-docker-skill/SKILL.md +633 -633
  1229. package/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -489
  1230. package/skills/create-hardened-docker-skill/skill.json +7 -7
  1231. package/skills/csharp-best-practices/SKILL.md +274 -274
  1232. package/skills/csharp-best-practices/skill.json +23 -23
  1233. package/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -39
  1234. package/skills/docker-image-signing/scripts/sign-image.sh +33 -33
  1235. package/skills/document-revision-history/SKILL.md +100 -100
  1236. package/skills/document-revision-history/skill.json +18 -18
  1237. package/skills/generate-backlog/SKILL.md +219 -219
  1238. package/skills/generate-backlog/skill.json +7 -7
  1239. package/skills/git-workflow-skill/README.md +135 -135
  1240. package/skills/git-workflow-skill/SKILL.md +190 -190
  1241. package/skills/git-workflow-skill/hooks/commit-msg +61 -61
  1242. package/skills/git-workflow-skill/hooks/pre-commit +38 -38
  1243. package/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -56
  1244. package/skills/git-workflow-skill/scripts/finish-feature.sh +192 -192
  1245. package/skills/git-workflow-skill/scripts/install-hooks.sh +55 -55
  1246. package/skills/git-workflow-skill/scripts/start-feature.sh +110 -110
  1247. package/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -229
  1248. package/skills/git-workflow-skill/skill.json +21 -21
  1249. package/skills/js-ts-security-skill/scripts/verify-security.sh +136 -136
  1250. package/skills/js-ts-security-skill/skill.json +17 -17
  1251. package/skills/modify-sprint/SKILL.md +341 -341
  1252. package/skills/modify-sprint/skill.json +7 -7
  1253. package/skills/open-presentation/SKILL.md +31 -31
  1254. package/skills/open-presentation/skill.json +11 -11
  1255. package/skills/prioritize-backlog/SKILL.md +242 -242
  1256. package/skills/prioritize-backlog/skill.json +7 -7
  1257. package/skills/python-best-practices/SKILL.md +381 -381
  1258. package/skills/python-best-practices/skill.json +26 -26
  1259. package/skills/remove-from-sprint/SKILL.md +213 -213
  1260. package/skills/remove-from-sprint/skill.json +7 -7
  1261. package/skills/self-signed-cert/scripts/generate-cert.sh +43 -43
  1262. package/skills/skill-creator/SKILL.md +211 -211
  1263. package/skills/skill-creator/claude-code.md +64 -64
  1264. package/skills/skill-creator/generic.md +192 -192
  1265. package/skills/skill-creator/references/output-patterns.md +82 -82
  1266. package/skills/skill-creator/references/workflows.md +28 -28
  1267. package/skills/skill-creator/scripts/init_skill.py +208 -208
  1268. package/skills/skill-creator/scripts/package_skill.py +99 -99
  1269. package/skills/skill-creator/scripts/quick_validate.py +113 -113
  1270. package/skills/skill-creator/skill.json +8 -8
  1271. package/skills/sprint-status-view/SKILL.md +212 -212
  1272. package/skills/sprint-status-view/skill.json +7 -7
  1273. package/skills/story-status-lookup/SKILL.md +106 -106
  1274. package/skills/story-status-lookup/skill.json +8 -8
  1275. package/skills/test-generator/SKILL.md +74 -74
  1276. package/skills/test-generator/claude-code.md +103 -103
  1277. package/skills/test-generator/cline.md +69 -69
  1278. package/skills/test-generator/generic.md +61 -61
  1279. package/skills/test-generator/skill.json +18 -18
  1280. package/skills/vercel-react-best-practices/SKILL.md +105 -105
  1281. package/skills/vercel-react-best-practices/claude-code.md +80 -80
  1282. package/skills/vercel-react-best-practices/generic.md +105 -105
  1283. package/skills/vercel-react-best-practices/skill.json +19 -19
  1284. package/skills/verify-hardened-docker-skill/README.md +85 -85
  1285. package/skills/verify-hardened-docker-skill/SKILL.md +438 -438
  1286. package/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -439
  1287. package/skills/verify-hardened-docker-skill/skill.json +7 -7
  1288. package/lib/.bmad-extension-plugin.build-1264-1777348888201/.claude-plugin/marketplace.json +0 -109
  1289. package/lib/.bmad-extension-plugin.build-1264-1777348888201/skills/module-help.csv +0 -62
  1290. package/lib/.bmad-extension-plugin.build-1264-1777348888201/skills/module.yaml +0 -20
  1291. package/lib/.bmad-extension-plugin.build-24696-1777348768444/.claude-plugin/marketplace.json +0 -109
  1292. package/lib/.bmad-extension-plugin.build-24696-1777348768444/skills/module-help.csv +0 -62
  1293. package/lib/.bmad-extension-plugin.build-24696-1777348768444/skills/module.yaml +0 -20
  1294. package/lib/.bmad-extension-plugin.build-25428-1777348694953/.claude-plugin/marketplace.json +0 -109
  1295. package/lib/.bmad-extension-plugin.build-25428-1777348694953/skills/module-help.csv +0 -62
  1296. package/lib/.bmad-extension-plugin.build-25428-1777348694953/skills/module.yaml +0 -20
  1297. package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +0 -1
  1298. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +0 -1
  1299. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +0 -1
  1300. package/lib/bmad-cache/cis/_git_preserved/logs/HEAD +0 -1
  1301. package/lib/bmad-cache/cis/_git_preserved/logs/refs/heads/main +0 -1
  1302. package/lib/bmad-cache/cis/_git_preserved/logs/refs/remotes/origin/HEAD +0 -1
  1303. package/lib/bmad-cache/gds/_git_preserved/logs/HEAD +0 -1
  1304. package/lib/bmad-cache/gds/_git_preserved/logs/refs/heads/main +0 -1
  1305. package/lib/bmad-cache/gds/_git_preserved/logs/refs/remotes/origin/HEAD +0 -1
  1306. package/lib/bmad-cache/tea/.github/workflows/publish.yaml +0 -168
  1307. package/lib/bmad-cache/tea/.vscode/settings.json +0 -47
  1308. package/lib/bmad-cache/wds/_git_preserved/logs/HEAD +0 -1
  1309. package/lib/bmad-cache/wds/_git_preserved/logs/refs/heads/main +0 -1
  1310. package/lib/bmad-cache/wds/_git_preserved/logs/refs/remotes/origin/HEAD +0 -1
@@ -1,1067 +1,1067 @@
1
- # Contract Testing Essentials (Pact)
2
-
3
- ## Principle
4
-
5
- Contract testing validates API contracts between consumer and provider services without requiring integrated end-to-end tests. Store consumer contracts alongside integration specs, version contracts semantically, and publish on every CI run. Provider verification before merge surfaces breaking changes immediately, while explicit fallback behavior (timeouts, retries, error payloads) captures resilience guarantees in contracts.
6
-
7
- > **Pact.js Utils Note**: When `tea_use_pactjs_utils` is enabled, prefer the patterns in the `pactjs-utils-*.md` fragments over the raw Pact.js patterns shown below. The pactjs-utils library eliminates boilerplate for provider states, verifier configuration, and request filters. See `pactjs-utils-overview.md` for the decision tree.
8
-
9
- ## Rationale
10
-
11
- Traditional integration testing requires running both consumer and provider simultaneously, creating slow, flaky tests with complex setup. Contract testing decouples services: consumers define expectations (pact files), providers verify against those expectations independently. This enables parallel development, catches breaking changes early, and documents API behavior as executable specifications. Pair contract tests with API smoke tests to validate data mapping and UI rendering in tandem.
12
-
13
- > **Recommended**: When `tea_use_pactjs_utils` is enabled, use `@seontechnologies/pactjs-utils` utilities instead of the manual patterns below. The library handles JsonMap conversion, verifier configuration, and request filter assembly automatically. See the `pactjs-utils-overview.md`, `pactjs-utils-consumer-helpers.md`, `pactjs-utils-provider-verifier.md`, and `pactjs-utils-request-filter.md` fragments for the simplified approach.
14
-
15
- ## Pattern Examples
16
-
17
- ### Example 1: Pact Consumer Test (Frontend → Backend API)
18
-
19
- **Context**: React application consuming a user management API, defining expected interactions.
20
-
21
- **Implementation**:
22
-
23
- ```typescript
24
- // tests/contract/user-api.pact.spec.ts
25
- import { PactV3, MatchersV3 } from '@pact-foundation/pact';
26
- import { getUserById, createUser, User } from '@/api/user-service';
27
-
28
- const { like, eachLike, string, integer } = MatchersV3;
29
-
30
- /**
31
- * Consumer-Driven Contract Test
32
- * - Consumer (React app) defines expected API behavior
33
- * - Generates pact file for provider to verify
34
- * - Runs in isolation (no real backend required)
35
- */
36
-
37
- const provider = new PactV3({
38
- consumer: 'user-management-web',
39
- provider: 'user-api-service',
40
- dir: './pacts', // Output directory for pact files
41
- logLevel: 'warn',
42
- });
43
-
44
- describe('User API Contract', () => {
45
- describe('GET /users/:id', () => {
46
- it('should return user when user exists', async () => {
47
- // Arrange: Define expected interaction
48
- await provider
49
- .given('user with id 1 exists') // Provider state
50
- .uponReceiving('a request for user 1')
51
- .withRequest({
52
- method: 'GET',
53
- path: '/users/1',
54
- headers: {
55
- Accept: 'application/json',
56
- Authorization: like('Bearer token123'), // Matcher: any string
57
- },
58
- })
59
- .willRespondWith({
60
- status: 200,
61
- headers: {
62
- 'Content-Type': 'application/json',
63
- },
64
- body: like({
65
- id: integer(1),
66
- name: string('John Doe'),
67
- email: string('john@example.com'),
68
- role: string('user'),
69
- createdAt: string('2025-01-15T10:00:00Z'),
70
- }),
71
- })
72
- .executeTest(async (mockServer) => {
73
- // Act: Call consumer code against mock server
74
- const user = await getUserById(1, {
75
- baseURL: mockServer.url,
76
- headers: { Authorization: 'Bearer token123' },
77
- });
78
-
79
- // Assert: Validate consumer behavior
80
- expect(user).toEqual(
81
- expect.objectContaining({
82
- id: 1,
83
- name: 'John Doe',
84
- email: 'john@example.com',
85
- role: 'user',
86
- }),
87
- );
88
- });
89
- });
90
-
91
- it('should handle 404 when user does not exist', async () => {
92
- await provider
93
- .given('user with id 999 does not exist')
94
- .uponReceiving('a request for non-existent user')
95
- .withRequest({
96
- method: 'GET',
97
- path: '/users/999',
98
- headers: { Accept: 'application/json' },
99
- })
100
- .willRespondWith({
101
- status: 404,
102
- headers: { 'Content-Type': 'application/json' },
103
- body: {
104
- error: 'User not found',
105
- code: 'USER_NOT_FOUND',
106
- },
107
- })
108
- .executeTest(async (mockServer) => {
109
- // Act & Assert: Consumer handles 404 gracefully
110
- await expect(getUserById(999, { baseURL: mockServer.url })).rejects.toThrow('User not found');
111
- });
112
- });
113
- });
114
-
115
- describe('POST /users', () => {
116
- it('should create user and return 201', async () => {
117
- const newUser: Omit<User, 'id' | 'createdAt'> = {
118
- name: 'Jane Smith',
119
- email: 'jane@example.com',
120
- role: 'admin',
121
- };
122
-
123
- await provider
124
- .given('no users exist')
125
- .uponReceiving('a request to create a user')
126
- .withRequest({
127
- method: 'POST',
128
- path: '/users',
129
- headers: {
130
- 'Content-Type': 'application/json',
131
- Accept: 'application/json',
132
- },
133
- body: newUser,
134
- })
135
- .willRespondWith({
136
- status: 201,
137
- headers: { 'Content-Type': 'application/json' },
138
- body: like({
139
- id: integer(2),
140
- name: string('Jane Smith'),
141
- email: string('jane@example.com'),
142
- role: string('admin'),
143
- createdAt: string('2025-01-15T11:00:00Z'),
144
- }),
145
- })
146
- .executeTest(async (mockServer) => {
147
- const createdUser = await createUser(newUser, {
148
- baseURL: mockServer.url,
149
- });
150
-
151
- expect(createdUser).toEqual(
152
- expect.objectContaining({
153
- id: expect.any(Number),
154
- name: 'Jane Smith',
155
- email: 'jane@example.com',
156
- role: 'admin',
157
- }),
158
- );
159
- });
160
- });
161
- });
162
- });
163
- ```
164
-
165
- **package.json scripts** (when using pactjs-utils conventions, prefer `test:pact:consumer` naming — see `pact-consumer-framework-setup.md`):
166
-
167
- ```json
168
- {
169
- "scripts": {
170
- "test:pact:consumer": "./scripts/check-pact-determinism.sh 'npm run test:pact:consumer:run' 3 ./pacts",
171
- "test:pact:consumer:run": "vitest run --config vitest.config.pact.ts",
172
- "publish:pact": ". ./scripts/env-setup.sh && ./scripts/publish-pact.sh"
173
- }
174
- }
175
- ```
176
-
177
- **Key Points**:
178
-
179
- - **Consumer-driven**: Frontend defines expectations, not backend
180
- - **Matchers (Postel's Law)**: Use `like`, `string`, `integer` matchers in `willRespondWith` (responses) for flexible matching. Do NOT use `like()` on request bodies in `withRequest` — the consumer controls what it sends, so request bodies should use exact values. This follows Postel's Law: be strict in what you send (requests), be lenient in what you accept (responses).
181
- - **Provider states**: given() sets up test preconditions
182
- - **Isolation**: No real backend needed, runs fast
183
- - **Pact generation**: Automatically creates JSON pact files
184
-
185
- ---
186
-
187
- ### Example 2: Pact Provider Verification (Backend validates contracts)
188
-
189
- **Context**: Node.js/Express API verifying pacts published by consumers.
190
-
191
- **Implementation**:
192
-
193
- ```typescript
194
- // tests/contract/user-api.provider.spec.ts
195
- import { Verifier, VerifierOptions } from '@pact-foundation/pact';
196
- import { server } from '../../src/server'; // Your Express/Fastify app
197
- import { seedDatabase, resetDatabase } from '../support/db-helpers';
198
-
199
- /**
200
- * Provider Verification Test
201
- * - Provider (backend API) verifies against published pacts
202
- * - State handlers setup test data for each interaction
203
- * - Runs before merge to catch breaking changes
204
- */
205
-
206
- describe('Pact Provider Verification', () => {
207
- let serverInstance;
208
- const PORT = 3001;
209
-
210
- beforeAll(async () => {
211
- // Start provider server
212
- serverInstance = server.listen(PORT);
213
- console.log(`Provider server running on port ${PORT}`);
214
- });
215
-
216
- afterAll(async () => {
217
- // Cleanup
218
- await serverInstance.close();
219
- });
220
-
221
- it('should verify pacts from all consumers', async () => {
222
- const opts: VerifierOptions = {
223
- // Provider details
224
- provider: 'user-api-service',
225
- providerBaseUrl: `http://localhost:${PORT}`,
226
-
227
- // Pact Broker configuration
228
- pactBrokerUrl: process.env.PACT_BROKER_BASE_URL,
229
- pactBrokerToken: process.env.PACT_BROKER_TOKEN,
230
- publishVerificationResult: process.env.CI === 'true',
231
- providerVersion: process.env.GITHUB_SHA || 'dev',
232
-
233
- // State handlers: Setup provider state for each interaction
234
- stateHandlers: {
235
- 'user with id 1 exists': async () => {
236
- await seedDatabase({
237
- users: [
238
- {
239
- id: 1,
240
- name: 'John Doe',
241
- email: 'john@example.com',
242
- role: 'user',
243
- createdAt: '2025-01-15T10:00:00Z',
244
- },
245
- ],
246
- });
247
- return 'User seeded successfully';
248
- },
249
-
250
- 'user with id 999 does not exist': async () => {
251
- // Ensure user doesn't exist
252
- await resetDatabase();
253
- return 'Database reset';
254
- },
255
-
256
- 'no users exist': async () => {
257
- await resetDatabase();
258
- return 'Database empty';
259
- },
260
- },
261
-
262
- // Request filters: Add auth headers to all requests
263
- requestFilter: (req, res, next) => {
264
- // Mock authentication for verification
265
- req.headers['x-user-id'] = 'test-user';
266
- req.headers['authorization'] = 'Bearer valid-test-token';
267
- next();
268
- },
269
-
270
- // Timeout for verification
271
- timeout: 30000,
272
- };
273
-
274
- // Run verification
275
- await new Verifier(opts).verifyProvider();
276
- });
277
- });
278
- ```
279
-
280
- **CI integration**:
281
-
282
- ```yaml
283
- # .github/workflows/contract-test-provider.yml
284
- # NOTE: Canonical naming is contract-test-provider.yml per pactjs-utils conventions
285
- name: Pact Provider Verification
286
- on:
287
- pull_request:
288
- push:
289
- branches: [main]
290
-
291
- jobs:
292
- verify-contracts:
293
- runs-on: ubuntu-latest
294
- steps:
295
- - uses: actions/checkout@v4
296
-
297
- - name: Setup Node.js
298
- uses: actions/setup-node@v4
299
- with:
300
- node-version-file: '.nvmrc'
301
-
302
- - name: Install dependencies
303
- run: npm ci
304
-
305
- - name: Start database
306
- run: docker-compose up -d postgres
307
-
308
- - name: Run migrations
309
- run: npm run db:migrate
310
-
311
- - name: Verify pacts
312
- run: npm run test:pact:provider:remote:contract
313
- env:
314
- PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
315
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
316
- GITHUB_SHA: ${{ github.sha }}
317
- GITHUB_BRANCH: ${{ github.head_ref || github.ref_name }}
318
-
319
- - name: Can I Deploy?
320
- if: github.ref == 'refs/heads/main'
321
- run: npm run can:i:deploy:provider
322
- ```
323
-
324
- **Key Points**:
325
-
326
- - **State handlers**: Setup provider data for each given() state
327
- - **Request filters**: Add auth/headers for verification requests
328
- - **CI publishing**: Verification results sent to broker
329
- - **can-i-deploy**: Safety check before production deployment
330
- - **Database isolation**: Reset between state handlers
331
-
332
- ---
333
-
334
- ### Example 3: Contract CI Integration (Consumer & Provider Workflow)
335
-
336
- **Context**: Simplified overview of consumer and provider CI coordination. For the complete consumer CI workflow with env blocks, concurrency, and breaking-change detection, see `pact-consumer-framework-setup.md` Example 5.
337
-
338
- **Implementation**:
339
-
340
- ```yaml
341
- # .github/workflows/contract-test-consumer.yml (Consumer side)
342
- # NOTE: Canonical naming is contract-test-consumer.yml per pactjs-utils conventions
343
- name: Pact Consumer Tests
344
- on:
345
- pull_request:
346
- push:
347
- branches: [main]
348
-
349
- jobs:
350
- consumer-tests:
351
- runs-on: ubuntu-latest
352
- steps:
353
- - uses: actions/checkout@v4
354
-
355
- - name: Setup Node.js
356
- uses: actions/setup-node@v4
357
- with:
358
- node-version-file: '.nvmrc'
359
-
360
- - name: Install dependencies
361
- run: npm ci
362
-
363
- - name: Run consumer contract tests
364
- run: npm run test:pact:consumer
365
-
366
- - name: Publish pacts to broker
367
- run: npm run publish:pact
368
-
369
- - name: Can I deploy consumer? (main only)
370
- if: github.ref == 'refs/heads/main' && env.PACT_BREAKING_CHANGE != 'true'
371
- run: npm run can:i:deploy:consumer
372
-
373
- - name: Record consumer deployment (main only)
374
- if: github.ref == 'refs/heads/main'
375
- run: npm run record:consumer:deployment --env=dev
376
- ```
377
-
378
- ```yaml
379
- # .github/workflows/contract-test-provider.yml (Provider side)
380
- # NOTE: Canonical naming is contract-test-provider.yml per pactjs-utils conventions
381
- name: Pact Provider Verification
382
- on:
383
- pull_request:
384
- push:
385
- branches: [main]
386
- repository_dispatch:
387
- types: [pact_changed] # Webhook from Pact Broker
388
-
389
- jobs:
390
- verify-contracts:
391
- runs-on: ubuntu-latest
392
- steps:
393
- - uses: actions/checkout@v4
394
-
395
- - name: Setup Node.js
396
- uses: actions/setup-node@v4
397
- with:
398
- node-version-file: '.nvmrc'
399
-
400
- - name: Install dependencies
401
- run: npm ci
402
-
403
- - name: Start dependencies
404
- run: docker-compose up -d
405
-
406
- - name: Run provider verification
407
- run: npm run test:pact:provider:remote:contract
408
- env:
409
- PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
410
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
411
- GITHUB_SHA: ${{ github.sha }}
412
- GITHUB_BRANCH: ${{ github.head_ref || github.ref_name }}
413
-
414
- - name: Can I deploy provider? (main only)
415
- if: github.ref == 'refs/heads/main' && env.PACT_BREAKING_CHANGE != 'true'
416
- run: npm run can:i:deploy:provider
417
-
418
- - name: Record provider deployment (main only)
419
- if: github.ref == 'refs/heads/main'
420
- run: npm run record:provider:deployment --env=dev
421
- ```
422
-
423
- **Pact Broker Webhook Configuration**:
424
-
425
- ```json
426
- {
427
- "events": [
428
- {
429
- "name": "contract_content_changed"
430
- }
431
- ],
432
- "request": {
433
- "method": "POST",
434
- "url": "https://api.github.com/repos/your-org/user-api/dispatches",
435
- "headers": {
436
- "Authorization": "Bearer ${user.githubToken}",
437
- "Content-Type": "application/json",
438
- "Accept": "application/vnd.github.v3+json"
439
- },
440
- "body": {
441
- "event_type": "pact_changed",
442
- "client_payload": {
443
- "pact_url": "${pactbroker.pactUrl}",
444
- "consumer": "${pactbroker.consumerName}",
445
- "provider": "${pactbroker.providerName}"
446
- }
447
- }
448
- }
449
- }
450
- ```
451
-
452
- **Key Points**:
453
-
454
- - **Automatic trigger**: Consumer pact changes trigger provider verification via webhook
455
- - **Branch tracking**: Pacts published per branch for feature testing
456
- - **can-i-deploy**: Safety gate before production deployment
457
- - **Record deployment**: Track which version is in each environment
458
- - **Parallel dev**: Consumer and provider teams work independently
459
-
460
- ---
461
-
462
- ### Example 4: Resilience Coverage (Testing Fallback Behavior)
463
-
464
- **Context**: Capture timeout, retry, and error handling behavior explicitly in contracts.
465
-
466
- **Implementation**:
467
-
468
- ```typescript
469
- // tests/contract/user-api-resilience.pact.spec.ts
470
- import { PactV3, MatchersV3 } from '@pact-foundation/pact';
471
- import { getUserById, ApiError } from '@/api/user-service';
472
-
473
- const { like, string } = MatchersV3;
474
-
475
- const provider = new PactV3({
476
- consumer: 'user-management-web',
477
- provider: 'user-api-service',
478
- dir: './pacts',
479
- });
480
-
481
- describe('User API Resilience Contract', () => {
482
- /**
483
- * Test 500 error handling
484
- * Verifies consumer handles server errors gracefully
485
- */
486
- it('should handle 500 errors with retry logic', async () => {
487
- await provider
488
- .given('server is experiencing errors')
489
- .uponReceiving('a request that returns 500')
490
- .withRequest({
491
- method: 'GET',
492
- path: '/users/1',
493
- headers: { Accept: 'application/json' },
494
- })
495
- .willRespondWith({
496
- status: 500,
497
- headers: { 'Content-Type': 'application/json' },
498
- body: {
499
- error: 'Internal server error',
500
- code: 'INTERNAL_ERROR',
501
- retryable: true,
502
- },
503
- })
504
- .executeTest(async (mockServer) => {
505
- // Consumer should retry on 500
506
- try {
507
- await getUserById(1, {
508
- baseURL: mockServer.url,
509
- retries: 3,
510
- retryDelay: 100,
511
- });
512
- fail('Should have thrown error after retries');
513
- } catch (error) {
514
- expect(error).toBeInstanceOf(ApiError);
515
- expect((error as ApiError).code).toBe('INTERNAL_ERROR');
516
- expect((error as ApiError).retryable).toBe(true);
517
- }
518
- });
519
- });
520
-
521
- /**
522
- * Test 429 rate limiting
523
- * Verifies consumer respects rate limits
524
- */
525
- it('should handle 429 rate limit with backoff', async () => {
526
- await provider
527
- .given('rate limit exceeded for user')
528
- .uponReceiving('a request that is rate limited')
529
- .withRequest({
530
- method: 'GET',
531
- path: '/users/1',
532
- })
533
- .willRespondWith({
534
- status: 429,
535
- headers: {
536
- 'Content-Type': 'application/json',
537
- 'Retry-After': '60', // Retry after 60 seconds
538
- },
539
- body: {
540
- error: 'Too many requests',
541
- code: 'RATE_LIMIT_EXCEEDED',
542
- },
543
- })
544
- .executeTest(async (mockServer) => {
545
- try {
546
- await getUserById(1, {
547
- baseURL: mockServer.url,
548
- respectRateLimit: true,
549
- });
550
- fail('Should have thrown rate limit error');
551
- } catch (error) {
552
- expect(error).toBeInstanceOf(ApiError);
553
- expect((error as ApiError).code).toBe('RATE_LIMIT_EXCEEDED');
554
- expect((error as ApiError).retryAfter).toBe(60);
555
- }
556
- });
557
- });
558
-
559
- /**
560
- * Test timeout handling
561
- * Verifies consumer has appropriate timeout configuration
562
- */
563
- it('should timeout after 10 seconds', async () => {
564
- await provider
565
- .given('server is slow to respond')
566
- .uponReceiving('a request that times out')
567
- .withRequest({
568
- method: 'GET',
569
- path: '/users/1',
570
- })
571
- .willRespondWith({
572
- status: 200,
573
- headers: { 'Content-Type': 'application/json' },
574
- body: like({ id: 1, name: 'John' }),
575
- })
576
- .withDelay(15000) // Simulate 15 second delay
577
- .executeTest(async (mockServer) => {
578
- try {
579
- await getUserById(1, {
580
- baseURL: mockServer.url,
581
- timeout: 10000, // 10 second timeout
582
- });
583
- fail('Should have timed out');
584
- } catch (error) {
585
- expect(error).toBeInstanceOf(ApiError);
586
- expect((error as ApiError).code).toBe('TIMEOUT');
587
- }
588
- });
589
- });
590
-
591
- /**
592
- * Test partial response (optional fields)
593
- * Verifies consumer handles missing optional data
594
- */
595
- it('should handle response with missing optional fields', async () => {
596
- await provider
597
- .given('user exists with minimal data')
598
- .uponReceiving('a request for user with partial data')
599
- .withRequest({
600
- method: 'GET',
601
- path: '/users/1',
602
- })
603
- .willRespondWith({
604
- status: 200,
605
- headers: { 'Content-Type': 'application/json' },
606
- body: {
607
- id: integer(1),
608
- name: string('John Doe'),
609
- email: string('john@example.com'),
610
- // role, createdAt, etc. omitted (optional fields)
611
- },
612
- })
613
- .executeTest(async (mockServer) => {
614
- const user = await getUserById(1, { baseURL: mockServer.url });
615
-
616
- // Consumer handles missing optional fields gracefully
617
- expect(user.id).toBe(1);
618
- expect(user.name).toBe('John Doe');
619
- expect(user.role).toBeUndefined(); // Optional field
620
- expect(user.createdAt).toBeUndefined(); // Optional field
621
- });
622
- });
623
- });
624
- ```
625
-
626
- **API client with retry logic**:
627
-
628
- ```typescript
629
- // src/api/user-service.ts
630
- import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
631
-
632
- export class ApiError extends Error {
633
- constructor(
634
- message: string,
635
- public code: string,
636
- public retryable: boolean = false,
637
- public retryAfter?: number,
638
- ) {
639
- super(message);
640
- }
641
- }
642
-
643
- /**
644
- * User API client with retry and error handling
645
- */
646
- export async function getUserById(
647
- id: number,
648
- config?: AxiosRequestConfig & { retries?: number; retryDelay?: number; respectRateLimit?: boolean },
649
- ): Promise<User> {
650
- const { retries = 3, retryDelay = 1000, respectRateLimit = true, ...axiosConfig } = config || {};
651
-
652
- let lastError: Error;
653
-
654
- for (let attempt = 1; attempt <= retries; attempt++) {
655
- try {
656
- const response = await axios.get(`/users/${id}`, axiosConfig);
657
- return response.data;
658
- } catch (error: any) {
659
- lastError = error;
660
-
661
- // Handle rate limiting
662
- if (error.response?.status === 429) {
663
- const retryAfter = parseInt(error.response.headers['retry-after'] || '60');
664
- throw new ApiError('Too many requests', 'RATE_LIMIT_EXCEEDED', false, retryAfter);
665
- }
666
-
667
- // Retry on 500 errors
668
- if (error.response?.status === 500 && attempt < retries) {
669
- await new Promise((resolve) => setTimeout(resolve, retryDelay * attempt));
670
- continue;
671
- }
672
-
673
- // Handle 404
674
- if (error.response?.status === 404) {
675
- throw new ApiError('User not found', 'USER_NOT_FOUND', false);
676
- }
677
-
678
- // Handle timeout
679
- if (error.code === 'ECONNABORTED') {
680
- throw new ApiError('Request timeout', 'TIMEOUT', true);
681
- }
682
-
683
- break;
684
- }
685
- }
686
-
687
- throw new ApiError('Request failed after retries', 'INTERNAL_ERROR', true);
688
- }
689
- ```
690
-
691
- **Key Points**:
692
-
693
- - **Resilience contracts**: Timeouts, retries, errors explicitly tested
694
- - **State handlers**: Provider sets up each test scenario
695
- - **Error handling**: Consumer validates graceful degradation
696
- - **Retry logic**: Exponential backoff tested
697
- - **Optional fields**: Consumer handles partial responses
698
-
699
- ---
700
-
701
- ### Example 5: Pact Broker Housekeeping & Lifecycle Management
702
-
703
- **Context**: Automated broker maintenance to prevent contract sprawl and noise.
704
-
705
- **Implementation**:
706
-
707
- ```typescript
708
- // scripts/pact-broker-housekeeping.ts
709
- /**
710
- * Pact Broker Housekeeping Script
711
- * - Archive superseded contracts
712
- * - Expire unused pacts
713
- * - Tag releases for environment tracking
714
- */
715
-
716
- import { execFileSync } from 'node:child_process';
717
-
718
- const PACT_BROKER_BASE_URL = process.env.PACT_BROKER_BASE_URL!;
719
- const PACT_BROKER_TOKEN = process.env.PACT_BROKER_TOKEN!;
720
- const PACTICIPANT = 'user-api-service';
721
-
722
- /**
723
- * Tag release with environment
724
- */
725
- function tagRelease(version: string, environment: 'staging' | 'production') {
726
- console.log(`🏷️ Tagging ${PACTICIPANT} v${version} as ${environment}`);
727
-
728
- execFileSync(
729
- 'pact-broker',
730
- [
731
- 'create-version-tag',
732
- '--pacticipant',
733
- PACTICIPANT,
734
- '--version',
735
- version,
736
- '--tag',
737
- environment,
738
- '--broker-base-url',
739
- PACT_BROKER_BASE_URL,
740
- '--broker-token',
741
- PACT_BROKER_TOKEN,
742
- ],
743
- { stdio: 'inherit' },
744
- );
745
- }
746
-
747
- /**
748
- * Record deployment to environment
749
- */
750
- function recordDeployment(version: string, environment: 'staging' | 'production') {
751
- console.log(`📝 Recording deployment of ${PACTICIPANT} v${version} to ${environment}`);
752
-
753
- execFileSync(
754
- 'pact-broker',
755
- [
756
- 'record-deployment',
757
- '--pacticipant',
758
- PACTICIPANT,
759
- '--version',
760
- version,
761
- '--environment',
762
- environment,
763
- '--broker-base-url',
764
- PACT_BROKER_BASE_URL,
765
- '--broker-token',
766
- PACT_BROKER_TOKEN,
767
- ],
768
- { stdio: 'inherit' },
769
- );
770
- }
771
-
772
- /**
773
- * Clean up old pact versions (retention policy)
774
- * Keep: last 30 days, all production tags, latest from each branch
775
- */
776
- function cleanupOldPacts() {
777
- console.log(`🧹 Cleaning up old pacts for ${PACTICIPANT}`);
778
-
779
- execFileSync(
780
- 'pact-broker',
781
- [
782
- 'clean',
783
- '--pacticipant',
784
- PACTICIPANT,
785
- '--broker-base-url',
786
- PACT_BROKER_BASE_URL,
787
- '--broker-token',
788
- PACT_BROKER_TOKEN,
789
- '--keep-latest-for-branch',
790
- '1',
791
- '--keep-min-age',
792
- '30',
793
- ],
794
- { stdio: 'inherit' },
795
- );
796
- }
797
-
798
- /**
799
- * Check deployment compatibility
800
- */
801
- function canIDeploy(version: string, toEnvironment: string): boolean {
802
- console.log(`🔍 Checking if ${PACTICIPANT} v${version} can deploy to ${toEnvironment}`);
803
-
804
- try {
805
- execFileSync(
806
- 'pact-broker',
807
- [
808
- 'can-i-deploy',
809
- '--pacticipant',
810
- PACTICIPANT,
811
- '--version',
812
- version,
813
- '--to-environment',
814
- toEnvironment,
815
- '--broker-base-url',
816
- PACT_BROKER_BASE_URL,
817
- '--broker-token',
818
- PACT_BROKER_TOKEN,
819
- '--retry-while-unknown',
820
- '10',
821
- '--retry-interval',
822
- '30',
823
- ],
824
- { stdio: 'inherit' },
825
- );
826
- return true;
827
- } catch (error) {
828
- console.error(`❌ Cannot deploy to ${toEnvironment}`);
829
- return false;
830
- }
831
- }
832
-
833
- /**
834
- * Main housekeeping workflow
835
- */
836
- async function main() {
837
- const command = process.argv[2];
838
- const version = process.argv[3];
839
- const environment = process.argv[4] as 'staging' | 'production';
840
-
841
- switch (command) {
842
- case 'tag-release':
843
- tagRelease(version, environment);
844
- break;
845
-
846
- case 'record-deployment':
847
- recordDeployment(version, environment);
848
- break;
849
-
850
- case 'can-i-deploy':
851
- const canDeploy = canIDeploy(version, environment);
852
- process.exit(canDeploy ? 0 : 1);
853
-
854
- case 'cleanup':
855
- cleanupOldPacts();
856
- break;
857
-
858
- default:
859
- console.error('Unknown command. Use: tag-release | record-deployment | can-i-deploy | cleanup');
860
- process.exit(1);
861
- }
862
- }
863
-
864
- main();
865
- ```
866
-
867
- **package.json scripts**:
868
-
869
- ```json
870
- {
871
- "scripts": {
872
- "pact:tag": "ts-node scripts/pact-broker-housekeeping.ts tag-release",
873
- "pact:record": "ts-node scripts/pact-broker-housekeeping.ts record-deployment",
874
- "pact:can-deploy": "ts-node scripts/pact-broker-housekeeping.ts can-i-deploy",
875
- "pact:cleanup": "ts-node scripts/pact-broker-housekeeping.ts cleanup"
876
- }
877
- }
878
- ```
879
-
880
- **Deployment workflow integration**:
881
-
882
- ```yaml
883
- # .github/workflows/deploy-production.yml
884
- name: Deploy to Production
885
- on:
886
- push:
887
- tags:
888
- - 'v*'
889
-
890
- jobs:
891
- verify-contracts:
892
- runs-on: ubuntu-latest
893
- steps:
894
- - uses: actions/checkout@v4
895
-
896
- - name: Check pact compatibility
897
- run: npm run pact:can-deploy ${{ github.ref_name }} production
898
- env:
899
- PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
900
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
901
-
902
- deploy:
903
- needs: verify-contracts
904
- runs-on: ubuntu-latest
905
- steps:
906
- - name: Deploy to production
907
- run: ./scripts/deploy.sh production
908
-
909
- - name: Record deployment in Pact Broker
910
- run: npm run pact:record ${{ github.ref_name }} production
911
- env:
912
- PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
913
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
914
- ```
915
-
916
- **Scheduled cleanup**:
917
-
918
- ```yaml
919
- # .github/workflows/pact-housekeeping.yml
920
- name: Pact Broker Housekeeping
921
- on:
922
- schedule:
923
- - cron: '0 2 * * 0' # Weekly on Sunday at 2 AM
924
-
925
- jobs:
926
- cleanup:
927
- runs-on: ubuntu-latest
928
- steps:
929
- - uses: actions/checkout@v4
930
-
931
- - name: Cleanup old pacts
932
- run: npm run pact:cleanup
933
- env:
934
- PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
935
- PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
936
- ```
937
-
938
- **Key Points**:
939
-
940
- - **Automated tagging**: Releases tagged with environment
941
- - **Deployment tracking**: Broker knows which version is where
942
- - **Safety gate**: can-i-deploy blocks incompatible deployments
943
- - **Retention policy**: Keep recent, production, and branch-latest pacts
944
- - **Webhook triggers**: Provider verification runs on consumer changes
945
-
946
- ---
947
-
948
- ## Provider Scrutiny Protocol
949
-
950
- When generating consumer contract tests, the agent **MUST** analyze provider source code — or the provider's OpenAPI/Swagger spec — before writing any Pact interaction. Generating contracts from consumer-side assumptions alone leads to mismatches that only surface during provider verification — wrong response shapes, wrong status codes, wrong field names, wrong types, missing required fields, and wrong enum values.
951
-
952
- **Source priority**: Provider source code is the most authoritative reference. When an OpenAPI/Swagger spec exists (`openapi.yaml`, `openapi.json`, `swagger.json`), use it as a complementary or alternative source — it documents the provider's contract explicitly and can be faster to parse than tracing through handler code. When both exist, cross-reference them; if they disagree, the source code wins.
953
-
954
- ### Provider Endpoint Comment
955
-
956
- Every Pact interaction MUST include a provider endpoint comment immediately above the `.given()` call:
957
-
958
- ```typescript
959
- // Provider endpoint: server/src/routes/userRouteHandlers.ts -> GET /api/v2/users/:userId
960
- await provider.given('user with id 1 exists').uponReceiving('a request for user 1');
961
- ```
962
-
963
- **Format**: `// Provider endpoint: <relative-path-to-handler> -> <METHOD> <route-pattern>`
964
-
965
- If the provider source is not accessible, use: `// Provider endpoint: TODO — provider source not accessible, verify manually`
966
-
967
- ### Seven-Point Scrutiny Checklist
968
-
969
- Before generating each Pact interaction, read the provider route handler and/or OpenAPI spec and verify:
970
-
971
- | # | Check | What to Read (source code / OpenAPI spec) | Common Mismatch |
972
- | --- | --------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------- |
973
- | 1 | **Response shape** | Handler's `res.json()` calls / OpenAPI `responses.content.schema` | Nested object vs flat; array wrapper vs direct |
974
- | 2 | **Status codes** | Handler's `res.status()` calls / OpenAPI `responses` keys | 200 vs 201 for creation; 204 vs 200 for delete |
975
- | 3 | **Field names** | Response type/DTO definitions / OpenAPI `schema.properties` | `transaction_id` vs `transactionId`; `fraud_score` vs `score` |
976
- | 4 | **Enum values** | Validation schemas, constants / OpenAPI `schema.enum` | `"active"` vs `"ACTIVE"`; `"pending"` vs `"in_progress"` |
977
- | 5 | **Required fields** | Request validation (Joi, Zod) / OpenAPI `schema.required` | Missing required header; optional field assumed required |
978
- | 6 | **Data types** | TypeScript types, DB models / OpenAPI `schema.type` + `format` | `string` ID vs `number` ID; ISO date vs Unix timestamp |
979
- | 7 | **Nested structures** | Response builder, serializer / OpenAPI `$ref` + `allOf`/`oneOf` | `{ data: { items: [] } }` vs `{ items: [] }` |
980
-
981
- ### Scrutiny Evidence Block
982
-
983
- Document what was found from provider source and/or OpenAPI spec as a block comment in the test file:
984
-
985
- ```typescript
986
- /*
987
- * Provider Scrutiny Evidence:
988
- * - Handler: server/src/routes/userRouteHandlers.ts:45
989
- * - OpenAPI: server/openapi.yaml paths./api/v2/users/{userId}.get (if available)
990
- * - Response type: UserResponseDto (server/src/types/user.ts:12)
991
- * - Status: 200 (line 52), 404 (line 48)
992
- * - Fields: { id: number, name: string, email: string, role: "user" | "admin", createdAt: string }
993
- * - Required request headers: Authorization (Bearer token)
994
- * - Validation: Zod schema at server/src/validation/user.ts:8
995
- */
996
- ```
997
-
998
- ### Graceful Degradation
999
-
1000
- When provider source code is not accessible (different repo, no access, closed source):
1001
-
1002
- 1. **OpenAPI/Swagger spec available**: Use the spec as the source of truth for response shapes, status codes, and field names
1003
- 2. **Pact Broker has existing contracts**: Use `pact_mcp` tools to fetch existing provider states and verified interactions as reference
1004
- 3. **Neither available**: Generate contracts from consumer-side types but use the TODO form of the mandatory comment: `// Provider endpoint: TODO — provider source not accessible, verify manually` and add a `provider_scrutiny: "pending"` field to the output JSON
1005
- 4. **Never silently guess**: If you cannot verify, document what you assumed and why
1006
-
1007
- ---
1008
-
1009
- ## Contract Testing Checklist
1010
-
1011
- Before implementing contract testing, verify:
1012
-
1013
- - [ ] **Pact Broker setup**: Hosted (Pactflow) or self-hosted broker configured
1014
- - [ ] **Consumer tests**: Generate pacts in CI, publish to broker on merge
1015
- - [ ] **Provider verification**: Runs on PR, verifies all consumer pacts
1016
- - [ ] **State handlers**: Provider implements all given() states
1017
- - [ ] **can-i-deploy**: Blocks deployment if contracts incompatible
1018
- - [ ] **Webhooks configured**: Consumer changes trigger provider verification
1019
- - [ ] **Retention policy**: Old pacts archived (keep 30 days, all production tags)
1020
- - [ ] **Resilience tested**: Timeouts, retries, error codes in contracts
1021
- - [ ] **Provider endpoint comments**: Every Pact interaction has `// Provider endpoint:` comment
1022
- - [ ] **Provider scrutiny completed**: Seven-point checklist verified for each interaction
1023
- - [ ] **Scrutiny evidence documented**: Block comment with handler, types, status codes, and fields
1024
-
1025
- ## Integration Points
1026
-
1027
- - Used in workflows: `*automate` (integration test generation), `*ci` (contract CI setup)
1028
- - Related fragments: `test-levels-framework.md`, `ci-burn-in.md`, `pact-consumer-framework-setup.md` (consumer vitest `fileParallelism: false` + `pool: 'forks'` + `singleFork: true`), `pactjs-utils-consumer-helpers.md` (PactV4 one-interaction-per-`it()` rule), `pactjs-utils-provider-verifier.md` (provider vitest `pool: 'forks'` + `singleFork: true` — same rule as consumer), `pact-broker-webhooks.md` (PactFlow → GitHub webhook auth, PAT rotation, staleness monitoring)
1029
- - Tools: Pact.js, Pact Broker (Pactflow or self-hosted), Pact CLI
1030
-
1031
- ---
1032
-
1033
- ## Pact.js Utils Accelerator
1034
-
1035
- When `tea_use_pactjs_utils` is enabled, the following utilities replace manual boilerplate:
1036
-
1037
- | Manual Pattern (raw Pact.js) | Pact.js Utils Equivalent | Benefit |
1038
- | -------------------------------------------------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
1039
- | Manual `JsonMap` casting for `.given()` params | `createProviderState({ name, params })` | Type-safe, auto-conversion of Date/null/nested objects |
1040
- | Repeated builder callbacks for query/header/body | `setJsonContent({ query, headers, body })` | Reusable callback for `.withRequest(...)` and `.willRespondWith(...)` |
1041
- | Inline body lambda `(builder) => builder.jsonBody(body)` | `setJsonBody(body)` | Body-only shorthand for cleaner response builders |
1042
- | 30+ lines of `VerifierOptions` assembly | `buildVerifierOptions({ provider, port, includeMainAndDeployed, stateHandlers })` | One-call setup, env-aware, flow auto-detection |
1043
- | Manual broker URL + selector logic from env vars | `handlePactBrokerUrlAndSelectors({ ..., options })` | Mutates options in-place with broker URL and selectors |
1044
- | DIY Express middleware for auth injection | `createRequestFilter({ tokenGenerator })` | Bearer prefix contract prevents double-prefix bugs |
1045
- | Manual CI branch/tag extraction | `getProviderVersionTags()` | CI-aware (GitHub Actions, GitLab CI, etc.) |
1046
- | Message verifier config assembly | `buildMessageVerifierOptions({ provider, messageProviders })` | Same one-call pattern for Kafka/async contracts |
1047
- | Inline no-op filter `(req, res, next) => next()` | `noOpRequestFilter` | Pre-built pass-through for no-auth providers |
1048
- | Hand-written matcher helper duplicating a Zod/TS type | `zodToPactMatchers(ConsumerMovieSchema, example)` | Single source of truth for response shape; consumer-curated scope keeps contracts lean and consumer-driven |
1049
-
1050
- See the `pactjs-utils-*.md` knowledge fragments for complete examples and anti-patterns (`pactjs-utils-zod-to-pact.md` covers the consumer-curated schema pattern).
1051
-
1052
- ### PactV4 Determinism & FFI Safety (Mandatory)
1053
-
1054
- Four rules that together prevent both (a) non-deterministic pact generation failures that cause `Cannot change pact content for already published pact` errors at PactFlow publish, and (b) "request was expected but not received" flakes observed on Linux CI once a consumer+provider pair has more than one `.pacttest.ts` file:
1055
-
1056
- 1. **Consumer Vitest `fileParallelism: false`** in `vitest.config.pact.ts` — prevents parallel workers from racing on the shared pact JSON. See `pact-consumer-framework-setup.md` Example 2.
1057
- 2. **Consumer Vitest `pool: 'forks'` + `poolOptions.forks.singleFork: true`** in `vitest.config.pact.ts` — same config as the provider side (`pactjs-utils-provider-verifier.md` Example 7). Best current understanding: the `@pact-foundation/pact` napi-rs binding is not robust across Vitest worker threads sharing a process; serialization alone (via `fileParallelism: false`) is insufficient on the default threads pool in Vitest v1. Forks + `singleFork: true` runs every pact file in one subprocess with a coherent FFI handle and eliminated a reproducible Linux-CI flake on two repos (`pactjs-utils`, `seon-mcp-server`). Single-file consumer suites have not been observed to flake; this rule is still recommended as a future-proof. See `pact-consumer-framework-setup.md` Example 2.
1058
- 3. **One `addInteraction()` per `it()` block** — see `pactjs-utils-consumer-helpers.md` Example 6.
1059
- 4. **Determinism gate** runs the consumer suite N times and fails on byte-different pact JSON before publish — see `pact-consumer-framework-setup.md` Example 10 (`scripts/check-pact-determinism.sh`).
1060
-
1061
- Provider suites require the same `pool: 'forks'` + `singleFork: true` combination — see `pactjs-utils-provider-verifier.md` Example 7.
1062
-
1063
- ### Webhook Auth & Staleness
1064
-
1065
- When `can-i-deploy` in a consumer repo times out with `There is no verified pact between <consumer> and the version of <provider> currently in <env>` — check the provider's PactFlow webhook. Silent failures from an expired/revoked GitHub PAT are the most common non-code cause of this symptom. See `pact-broker-webhooks.md` for the dedicated-machine-user pattern, classic-PAT-with-`repo`-scope rationale, rotation runbook, and staleness monitoring options.
1066
-
1067
- _Source: Pact consumer/provider sample repos, Murat contract testing blog, Pact official documentation, @seontechnologies/pactjs-utils library_
1
+ # Contract Testing Essentials (Pact)
2
+
3
+ ## Principle
4
+
5
+ Contract testing validates API contracts between consumer and provider services without requiring integrated end-to-end tests. Store consumer contracts alongside integration specs, version contracts semantically, and publish on every CI run. Provider verification before merge surfaces breaking changes immediately, while explicit fallback behavior (timeouts, retries, error payloads) captures resilience guarantees in contracts.
6
+
7
+ > **Pact.js Utils Note**: When `tea_use_pactjs_utils` is enabled, prefer the patterns in the `pactjs-utils-*.md` fragments over the raw Pact.js patterns shown below. The pactjs-utils library eliminates boilerplate for provider states, verifier configuration, and request filters. See `pactjs-utils-overview.md` for the decision tree.
8
+
9
+ ## Rationale
10
+
11
+ Traditional integration testing requires running both consumer and provider simultaneously, creating slow, flaky tests with complex setup. Contract testing decouples services: consumers define expectations (pact files), providers verify against those expectations independently. This enables parallel development, catches breaking changes early, and documents API behavior as executable specifications. Pair contract tests with API smoke tests to validate data mapping and UI rendering in tandem.
12
+
13
+ > **Recommended**: When `tea_use_pactjs_utils` is enabled, use `@seontechnologies/pactjs-utils` utilities instead of the manual patterns below. The library handles JsonMap conversion, verifier configuration, and request filter assembly automatically. See the `pactjs-utils-overview.md`, `pactjs-utils-consumer-helpers.md`, `pactjs-utils-provider-verifier.md`, and `pactjs-utils-request-filter.md` fragments for the simplified approach.
14
+
15
+ ## Pattern Examples
16
+
17
+ ### Example 1: Pact Consumer Test (Frontend → Backend API)
18
+
19
+ **Context**: React application consuming a user management API, defining expected interactions.
20
+
21
+ **Implementation**:
22
+
23
+ ```typescript
24
+ // tests/contract/user-api.pact.spec.ts
25
+ import { PactV3, MatchersV3 } from '@pact-foundation/pact';
26
+ import { getUserById, createUser, User } from '@/api/user-service';
27
+
28
+ const { like, eachLike, string, integer } = MatchersV3;
29
+
30
+ /**
31
+ * Consumer-Driven Contract Test
32
+ * - Consumer (React app) defines expected API behavior
33
+ * - Generates pact file for provider to verify
34
+ * - Runs in isolation (no real backend required)
35
+ */
36
+
37
+ const provider = new PactV3({
38
+ consumer: 'user-management-web',
39
+ provider: 'user-api-service',
40
+ dir: './pacts', // Output directory for pact files
41
+ logLevel: 'warn',
42
+ });
43
+
44
+ describe('User API Contract', () => {
45
+ describe('GET /users/:id', () => {
46
+ it('should return user when user exists', async () => {
47
+ // Arrange: Define expected interaction
48
+ await provider
49
+ .given('user with id 1 exists') // Provider state
50
+ .uponReceiving('a request for user 1')
51
+ .withRequest({
52
+ method: 'GET',
53
+ path: '/users/1',
54
+ headers: {
55
+ Accept: 'application/json',
56
+ Authorization: like('Bearer token123'), // Matcher: any string
57
+ },
58
+ })
59
+ .willRespondWith({
60
+ status: 200,
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ body: like({
65
+ id: integer(1),
66
+ name: string('John Doe'),
67
+ email: string('john@example.com'),
68
+ role: string('user'),
69
+ createdAt: string('2025-01-15T10:00:00Z'),
70
+ }),
71
+ })
72
+ .executeTest(async (mockServer) => {
73
+ // Act: Call consumer code against mock server
74
+ const user = await getUserById(1, {
75
+ baseURL: mockServer.url,
76
+ headers: { Authorization: 'Bearer token123' },
77
+ });
78
+
79
+ // Assert: Validate consumer behavior
80
+ expect(user).toEqual(
81
+ expect.objectContaining({
82
+ id: 1,
83
+ name: 'John Doe',
84
+ email: 'john@example.com',
85
+ role: 'user',
86
+ }),
87
+ );
88
+ });
89
+ });
90
+
91
+ it('should handle 404 when user does not exist', async () => {
92
+ await provider
93
+ .given('user with id 999 does not exist')
94
+ .uponReceiving('a request for non-existent user')
95
+ .withRequest({
96
+ method: 'GET',
97
+ path: '/users/999',
98
+ headers: { Accept: 'application/json' },
99
+ })
100
+ .willRespondWith({
101
+ status: 404,
102
+ headers: { 'Content-Type': 'application/json' },
103
+ body: {
104
+ error: 'User not found',
105
+ code: 'USER_NOT_FOUND',
106
+ },
107
+ })
108
+ .executeTest(async (mockServer) => {
109
+ // Act & Assert: Consumer handles 404 gracefully
110
+ await expect(getUserById(999, { baseURL: mockServer.url })).rejects.toThrow('User not found');
111
+ });
112
+ });
113
+ });
114
+
115
+ describe('POST /users', () => {
116
+ it('should create user and return 201', async () => {
117
+ const newUser: Omit<User, 'id' | 'createdAt'> = {
118
+ name: 'Jane Smith',
119
+ email: 'jane@example.com',
120
+ role: 'admin',
121
+ };
122
+
123
+ await provider
124
+ .given('no users exist')
125
+ .uponReceiving('a request to create a user')
126
+ .withRequest({
127
+ method: 'POST',
128
+ path: '/users',
129
+ headers: {
130
+ 'Content-Type': 'application/json',
131
+ Accept: 'application/json',
132
+ },
133
+ body: newUser,
134
+ })
135
+ .willRespondWith({
136
+ status: 201,
137
+ headers: { 'Content-Type': 'application/json' },
138
+ body: like({
139
+ id: integer(2),
140
+ name: string('Jane Smith'),
141
+ email: string('jane@example.com'),
142
+ role: string('admin'),
143
+ createdAt: string('2025-01-15T11:00:00Z'),
144
+ }),
145
+ })
146
+ .executeTest(async (mockServer) => {
147
+ const createdUser = await createUser(newUser, {
148
+ baseURL: mockServer.url,
149
+ });
150
+
151
+ expect(createdUser).toEqual(
152
+ expect.objectContaining({
153
+ id: expect.any(Number),
154
+ name: 'Jane Smith',
155
+ email: 'jane@example.com',
156
+ role: 'admin',
157
+ }),
158
+ );
159
+ });
160
+ });
161
+ });
162
+ });
163
+ ```
164
+
165
+ **package.json scripts** (when using pactjs-utils conventions, prefer `test:pact:consumer` naming — see `pact-consumer-framework-setup.md`):
166
+
167
+ ```json
168
+ {
169
+ "scripts": {
170
+ "test:pact:consumer": "./scripts/check-pact-determinism.sh 'npm run test:pact:consumer:run' 3 ./pacts",
171
+ "test:pact:consumer:run": "vitest run --config vitest.config.pact.ts",
172
+ "publish:pact": ". ./scripts/env-setup.sh && ./scripts/publish-pact.sh"
173
+ }
174
+ }
175
+ ```
176
+
177
+ **Key Points**:
178
+
179
+ - **Consumer-driven**: Frontend defines expectations, not backend
180
+ - **Matchers (Postel's Law)**: Use `like`, `string`, `integer` matchers in `willRespondWith` (responses) for flexible matching. Do NOT use `like()` on request bodies in `withRequest` — the consumer controls what it sends, so request bodies should use exact values. This follows Postel's Law: be strict in what you send (requests), be lenient in what you accept (responses).
181
+ - **Provider states**: given() sets up test preconditions
182
+ - **Isolation**: No real backend needed, runs fast
183
+ - **Pact generation**: Automatically creates JSON pact files
184
+
185
+ ---
186
+
187
+ ### Example 2: Pact Provider Verification (Backend validates contracts)
188
+
189
+ **Context**: Node.js/Express API verifying pacts published by consumers.
190
+
191
+ **Implementation**:
192
+
193
+ ```typescript
194
+ // tests/contract/user-api.provider.spec.ts
195
+ import { Verifier, VerifierOptions } from '@pact-foundation/pact';
196
+ import { server } from '../../src/server'; // Your Express/Fastify app
197
+ import { seedDatabase, resetDatabase } from '../support/db-helpers';
198
+
199
+ /**
200
+ * Provider Verification Test
201
+ * - Provider (backend API) verifies against published pacts
202
+ * - State handlers setup test data for each interaction
203
+ * - Runs before merge to catch breaking changes
204
+ */
205
+
206
+ describe('Pact Provider Verification', () => {
207
+ let serverInstance;
208
+ const PORT = 3001;
209
+
210
+ beforeAll(async () => {
211
+ // Start provider server
212
+ serverInstance = server.listen(PORT);
213
+ console.log(`Provider server running on port ${PORT}`);
214
+ });
215
+
216
+ afterAll(async () => {
217
+ // Cleanup
218
+ await serverInstance.close();
219
+ });
220
+
221
+ it('should verify pacts from all consumers', async () => {
222
+ const opts: VerifierOptions = {
223
+ // Provider details
224
+ provider: 'user-api-service',
225
+ providerBaseUrl: `http://localhost:${PORT}`,
226
+
227
+ // Pact Broker configuration
228
+ pactBrokerUrl: process.env.PACT_BROKER_BASE_URL,
229
+ pactBrokerToken: process.env.PACT_BROKER_TOKEN,
230
+ publishVerificationResult: process.env.CI === 'true',
231
+ providerVersion: process.env.GITHUB_SHA || 'dev',
232
+
233
+ // State handlers: Setup provider state for each interaction
234
+ stateHandlers: {
235
+ 'user with id 1 exists': async () => {
236
+ await seedDatabase({
237
+ users: [
238
+ {
239
+ id: 1,
240
+ name: 'John Doe',
241
+ email: 'john@example.com',
242
+ role: 'user',
243
+ createdAt: '2025-01-15T10:00:00Z',
244
+ },
245
+ ],
246
+ });
247
+ return 'User seeded successfully';
248
+ },
249
+
250
+ 'user with id 999 does not exist': async () => {
251
+ // Ensure user doesn't exist
252
+ await resetDatabase();
253
+ return 'Database reset';
254
+ },
255
+
256
+ 'no users exist': async () => {
257
+ await resetDatabase();
258
+ return 'Database empty';
259
+ },
260
+ },
261
+
262
+ // Request filters: Add auth headers to all requests
263
+ requestFilter: (req, res, next) => {
264
+ // Mock authentication for verification
265
+ req.headers['x-user-id'] = 'test-user';
266
+ req.headers['authorization'] = 'Bearer valid-test-token';
267
+ next();
268
+ },
269
+
270
+ // Timeout for verification
271
+ timeout: 30000,
272
+ };
273
+
274
+ // Run verification
275
+ await new Verifier(opts).verifyProvider();
276
+ });
277
+ });
278
+ ```
279
+
280
+ **CI integration**:
281
+
282
+ ```yaml
283
+ # .github/workflows/contract-test-provider.yml
284
+ # NOTE: Canonical naming is contract-test-provider.yml per pactjs-utils conventions
285
+ name: Pact Provider Verification
286
+ on:
287
+ pull_request:
288
+ push:
289
+ branches: [main]
290
+
291
+ jobs:
292
+ verify-contracts:
293
+ runs-on: ubuntu-latest
294
+ steps:
295
+ - uses: actions/checkout@v4
296
+
297
+ - name: Setup Node.js
298
+ uses: actions/setup-node@v4
299
+ with:
300
+ node-version-file: '.nvmrc'
301
+
302
+ - name: Install dependencies
303
+ run: npm ci
304
+
305
+ - name: Start database
306
+ run: docker-compose up -d postgres
307
+
308
+ - name: Run migrations
309
+ run: npm run db:migrate
310
+
311
+ - name: Verify pacts
312
+ run: npm run test:pact:provider:remote:contract
313
+ env:
314
+ PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
315
+ PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
316
+ GITHUB_SHA: ${{ github.sha }}
317
+ GITHUB_BRANCH: ${{ github.head_ref || github.ref_name }}
318
+
319
+ - name: Can I Deploy?
320
+ if: github.ref == 'refs/heads/main'
321
+ run: npm run can:i:deploy:provider
322
+ ```
323
+
324
+ **Key Points**:
325
+
326
+ - **State handlers**: Setup provider data for each given() state
327
+ - **Request filters**: Add auth/headers for verification requests
328
+ - **CI publishing**: Verification results sent to broker
329
+ - **can-i-deploy**: Safety check before production deployment
330
+ - **Database isolation**: Reset between state handlers
331
+
332
+ ---
333
+
334
+ ### Example 3: Contract CI Integration (Consumer & Provider Workflow)
335
+
336
+ **Context**: Simplified overview of consumer and provider CI coordination. For the complete consumer CI workflow with env blocks, concurrency, and breaking-change detection, see `pact-consumer-framework-setup.md` Example 5.
337
+
338
+ **Implementation**:
339
+
340
+ ```yaml
341
+ # .github/workflows/contract-test-consumer.yml (Consumer side)
342
+ # NOTE: Canonical naming is contract-test-consumer.yml per pactjs-utils conventions
343
+ name: Pact Consumer Tests
344
+ on:
345
+ pull_request:
346
+ push:
347
+ branches: [main]
348
+
349
+ jobs:
350
+ consumer-tests:
351
+ runs-on: ubuntu-latest
352
+ steps:
353
+ - uses: actions/checkout@v4
354
+
355
+ - name: Setup Node.js
356
+ uses: actions/setup-node@v4
357
+ with:
358
+ node-version-file: '.nvmrc'
359
+
360
+ - name: Install dependencies
361
+ run: npm ci
362
+
363
+ - name: Run consumer contract tests
364
+ run: npm run test:pact:consumer
365
+
366
+ - name: Publish pacts to broker
367
+ run: npm run publish:pact
368
+
369
+ - name: Can I deploy consumer? (main only)
370
+ if: github.ref == 'refs/heads/main' && env.PACT_BREAKING_CHANGE != 'true'
371
+ run: npm run can:i:deploy:consumer
372
+
373
+ - name: Record consumer deployment (main only)
374
+ if: github.ref == 'refs/heads/main'
375
+ run: npm run record:consumer:deployment --env=dev
376
+ ```
377
+
378
+ ```yaml
379
+ # .github/workflows/contract-test-provider.yml (Provider side)
380
+ # NOTE: Canonical naming is contract-test-provider.yml per pactjs-utils conventions
381
+ name: Pact Provider Verification
382
+ on:
383
+ pull_request:
384
+ push:
385
+ branches: [main]
386
+ repository_dispatch:
387
+ types: [pact_changed] # Webhook from Pact Broker
388
+
389
+ jobs:
390
+ verify-contracts:
391
+ runs-on: ubuntu-latest
392
+ steps:
393
+ - uses: actions/checkout@v4
394
+
395
+ - name: Setup Node.js
396
+ uses: actions/setup-node@v4
397
+ with:
398
+ node-version-file: '.nvmrc'
399
+
400
+ - name: Install dependencies
401
+ run: npm ci
402
+
403
+ - name: Start dependencies
404
+ run: docker-compose up -d
405
+
406
+ - name: Run provider verification
407
+ run: npm run test:pact:provider:remote:contract
408
+ env:
409
+ PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
410
+ PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
411
+ GITHUB_SHA: ${{ github.sha }}
412
+ GITHUB_BRANCH: ${{ github.head_ref || github.ref_name }}
413
+
414
+ - name: Can I deploy provider? (main only)
415
+ if: github.ref == 'refs/heads/main' && env.PACT_BREAKING_CHANGE != 'true'
416
+ run: npm run can:i:deploy:provider
417
+
418
+ - name: Record provider deployment (main only)
419
+ if: github.ref == 'refs/heads/main'
420
+ run: npm run record:provider:deployment --env=dev
421
+ ```
422
+
423
+ **Pact Broker Webhook Configuration**:
424
+
425
+ ```json
426
+ {
427
+ "events": [
428
+ {
429
+ "name": "contract_content_changed"
430
+ }
431
+ ],
432
+ "request": {
433
+ "method": "POST",
434
+ "url": "https://api.github.com/repos/your-org/user-api/dispatches",
435
+ "headers": {
436
+ "Authorization": "Bearer ${user.githubToken}",
437
+ "Content-Type": "application/json",
438
+ "Accept": "application/vnd.github.v3+json"
439
+ },
440
+ "body": {
441
+ "event_type": "pact_changed",
442
+ "client_payload": {
443
+ "pact_url": "${pactbroker.pactUrl}",
444
+ "consumer": "${pactbroker.consumerName}",
445
+ "provider": "${pactbroker.providerName}"
446
+ }
447
+ }
448
+ }
449
+ }
450
+ ```
451
+
452
+ **Key Points**:
453
+
454
+ - **Automatic trigger**: Consumer pact changes trigger provider verification via webhook
455
+ - **Branch tracking**: Pacts published per branch for feature testing
456
+ - **can-i-deploy**: Safety gate before production deployment
457
+ - **Record deployment**: Track which version is in each environment
458
+ - **Parallel dev**: Consumer and provider teams work independently
459
+
460
+ ---
461
+
462
+ ### Example 4: Resilience Coverage (Testing Fallback Behavior)
463
+
464
+ **Context**: Capture timeout, retry, and error handling behavior explicitly in contracts.
465
+
466
+ **Implementation**:
467
+
468
+ ```typescript
469
+ // tests/contract/user-api-resilience.pact.spec.ts
470
+ import { PactV3, MatchersV3 } from '@pact-foundation/pact';
471
+ import { getUserById, ApiError } from '@/api/user-service';
472
+
473
+ const { like, string } = MatchersV3;
474
+
475
+ const provider = new PactV3({
476
+ consumer: 'user-management-web',
477
+ provider: 'user-api-service',
478
+ dir: './pacts',
479
+ });
480
+
481
+ describe('User API Resilience Contract', () => {
482
+ /**
483
+ * Test 500 error handling
484
+ * Verifies consumer handles server errors gracefully
485
+ */
486
+ it('should handle 500 errors with retry logic', async () => {
487
+ await provider
488
+ .given('server is experiencing errors')
489
+ .uponReceiving('a request that returns 500')
490
+ .withRequest({
491
+ method: 'GET',
492
+ path: '/users/1',
493
+ headers: { Accept: 'application/json' },
494
+ })
495
+ .willRespondWith({
496
+ status: 500,
497
+ headers: { 'Content-Type': 'application/json' },
498
+ body: {
499
+ error: 'Internal server error',
500
+ code: 'INTERNAL_ERROR',
501
+ retryable: true,
502
+ },
503
+ })
504
+ .executeTest(async (mockServer) => {
505
+ // Consumer should retry on 500
506
+ try {
507
+ await getUserById(1, {
508
+ baseURL: mockServer.url,
509
+ retries: 3,
510
+ retryDelay: 100,
511
+ });
512
+ fail('Should have thrown error after retries');
513
+ } catch (error) {
514
+ expect(error).toBeInstanceOf(ApiError);
515
+ expect((error as ApiError).code).toBe('INTERNAL_ERROR');
516
+ expect((error as ApiError).retryable).toBe(true);
517
+ }
518
+ });
519
+ });
520
+
521
+ /**
522
+ * Test 429 rate limiting
523
+ * Verifies consumer respects rate limits
524
+ */
525
+ it('should handle 429 rate limit with backoff', async () => {
526
+ await provider
527
+ .given('rate limit exceeded for user')
528
+ .uponReceiving('a request that is rate limited')
529
+ .withRequest({
530
+ method: 'GET',
531
+ path: '/users/1',
532
+ })
533
+ .willRespondWith({
534
+ status: 429,
535
+ headers: {
536
+ 'Content-Type': 'application/json',
537
+ 'Retry-After': '60', // Retry after 60 seconds
538
+ },
539
+ body: {
540
+ error: 'Too many requests',
541
+ code: 'RATE_LIMIT_EXCEEDED',
542
+ },
543
+ })
544
+ .executeTest(async (mockServer) => {
545
+ try {
546
+ await getUserById(1, {
547
+ baseURL: mockServer.url,
548
+ respectRateLimit: true,
549
+ });
550
+ fail('Should have thrown rate limit error');
551
+ } catch (error) {
552
+ expect(error).toBeInstanceOf(ApiError);
553
+ expect((error as ApiError).code).toBe('RATE_LIMIT_EXCEEDED');
554
+ expect((error as ApiError).retryAfter).toBe(60);
555
+ }
556
+ });
557
+ });
558
+
559
+ /**
560
+ * Test timeout handling
561
+ * Verifies consumer has appropriate timeout configuration
562
+ */
563
+ it('should timeout after 10 seconds', async () => {
564
+ await provider
565
+ .given('server is slow to respond')
566
+ .uponReceiving('a request that times out')
567
+ .withRequest({
568
+ method: 'GET',
569
+ path: '/users/1',
570
+ })
571
+ .willRespondWith({
572
+ status: 200,
573
+ headers: { 'Content-Type': 'application/json' },
574
+ body: like({ id: 1, name: 'John' }),
575
+ })
576
+ .withDelay(15000) // Simulate 15 second delay
577
+ .executeTest(async (mockServer) => {
578
+ try {
579
+ await getUserById(1, {
580
+ baseURL: mockServer.url,
581
+ timeout: 10000, // 10 second timeout
582
+ });
583
+ fail('Should have timed out');
584
+ } catch (error) {
585
+ expect(error).toBeInstanceOf(ApiError);
586
+ expect((error as ApiError).code).toBe('TIMEOUT');
587
+ }
588
+ });
589
+ });
590
+
591
+ /**
592
+ * Test partial response (optional fields)
593
+ * Verifies consumer handles missing optional data
594
+ */
595
+ it('should handle response with missing optional fields', async () => {
596
+ await provider
597
+ .given('user exists with minimal data')
598
+ .uponReceiving('a request for user with partial data')
599
+ .withRequest({
600
+ method: 'GET',
601
+ path: '/users/1',
602
+ })
603
+ .willRespondWith({
604
+ status: 200,
605
+ headers: { 'Content-Type': 'application/json' },
606
+ body: {
607
+ id: integer(1),
608
+ name: string('John Doe'),
609
+ email: string('john@example.com'),
610
+ // role, createdAt, etc. omitted (optional fields)
611
+ },
612
+ })
613
+ .executeTest(async (mockServer) => {
614
+ const user = await getUserById(1, { baseURL: mockServer.url });
615
+
616
+ // Consumer handles missing optional fields gracefully
617
+ expect(user.id).toBe(1);
618
+ expect(user.name).toBe('John Doe');
619
+ expect(user.role).toBeUndefined(); // Optional field
620
+ expect(user.createdAt).toBeUndefined(); // Optional field
621
+ });
622
+ });
623
+ });
624
+ ```
625
+
626
+ **API client with retry logic**:
627
+
628
+ ```typescript
629
+ // src/api/user-service.ts
630
+ import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
631
+
632
+ export class ApiError extends Error {
633
+ constructor(
634
+ message: string,
635
+ public code: string,
636
+ public retryable: boolean = false,
637
+ public retryAfter?: number,
638
+ ) {
639
+ super(message);
640
+ }
641
+ }
642
+
643
+ /**
644
+ * User API client with retry and error handling
645
+ */
646
+ export async function getUserById(
647
+ id: number,
648
+ config?: AxiosRequestConfig & { retries?: number; retryDelay?: number; respectRateLimit?: boolean },
649
+ ): Promise<User> {
650
+ const { retries = 3, retryDelay = 1000, respectRateLimit = true, ...axiosConfig } = config || {};
651
+
652
+ let lastError: Error;
653
+
654
+ for (let attempt = 1; attempt <= retries; attempt++) {
655
+ try {
656
+ const response = await axios.get(`/users/${id}`, axiosConfig);
657
+ return response.data;
658
+ } catch (error: any) {
659
+ lastError = error;
660
+
661
+ // Handle rate limiting
662
+ if (error.response?.status === 429) {
663
+ const retryAfter = parseInt(error.response.headers['retry-after'] || '60');
664
+ throw new ApiError('Too many requests', 'RATE_LIMIT_EXCEEDED', false, retryAfter);
665
+ }
666
+
667
+ // Retry on 500 errors
668
+ if (error.response?.status === 500 && attempt < retries) {
669
+ await new Promise((resolve) => setTimeout(resolve, retryDelay * attempt));
670
+ continue;
671
+ }
672
+
673
+ // Handle 404
674
+ if (error.response?.status === 404) {
675
+ throw new ApiError('User not found', 'USER_NOT_FOUND', false);
676
+ }
677
+
678
+ // Handle timeout
679
+ if (error.code === 'ECONNABORTED') {
680
+ throw new ApiError('Request timeout', 'TIMEOUT', true);
681
+ }
682
+
683
+ break;
684
+ }
685
+ }
686
+
687
+ throw new ApiError('Request failed after retries', 'INTERNAL_ERROR', true);
688
+ }
689
+ ```
690
+
691
+ **Key Points**:
692
+
693
+ - **Resilience contracts**: Timeouts, retries, errors explicitly tested
694
+ - **State handlers**: Provider sets up each test scenario
695
+ - **Error handling**: Consumer validates graceful degradation
696
+ - **Retry logic**: Exponential backoff tested
697
+ - **Optional fields**: Consumer handles partial responses
698
+
699
+ ---
700
+
701
+ ### Example 5: Pact Broker Housekeeping & Lifecycle Management
702
+
703
+ **Context**: Automated broker maintenance to prevent contract sprawl and noise.
704
+
705
+ **Implementation**:
706
+
707
+ ```typescript
708
+ // scripts/pact-broker-housekeeping.ts
709
+ /**
710
+ * Pact Broker Housekeeping Script
711
+ * - Archive superseded contracts
712
+ * - Expire unused pacts
713
+ * - Tag releases for environment tracking
714
+ */
715
+
716
+ import { execFileSync } from 'node:child_process';
717
+
718
+ const PACT_BROKER_BASE_URL = process.env.PACT_BROKER_BASE_URL!;
719
+ const PACT_BROKER_TOKEN = process.env.PACT_BROKER_TOKEN!;
720
+ const PACTICIPANT = 'user-api-service';
721
+
722
+ /**
723
+ * Tag release with environment
724
+ */
725
+ function tagRelease(version: string, environment: 'staging' | 'production') {
726
+ console.log(`🏷️ Tagging ${PACTICIPANT} v${version} as ${environment}`);
727
+
728
+ execFileSync(
729
+ 'pact-broker',
730
+ [
731
+ 'create-version-tag',
732
+ '--pacticipant',
733
+ PACTICIPANT,
734
+ '--version',
735
+ version,
736
+ '--tag',
737
+ environment,
738
+ '--broker-base-url',
739
+ PACT_BROKER_BASE_URL,
740
+ '--broker-token',
741
+ PACT_BROKER_TOKEN,
742
+ ],
743
+ { stdio: 'inherit' },
744
+ );
745
+ }
746
+
747
+ /**
748
+ * Record deployment to environment
749
+ */
750
+ function recordDeployment(version: string, environment: 'staging' | 'production') {
751
+ console.log(`📝 Recording deployment of ${PACTICIPANT} v${version} to ${environment}`);
752
+
753
+ execFileSync(
754
+ 'pact-broker',
755
+ [
756
+ 'record-deployment',
757
+ '--pacticipant',
758
+ PACTICIPANT,
759
+ '--version',
760
+ version,
761
+ '--environment',
762
+ environment,
763
+ '--broker-base-url',
764
+ PACT_BROKER_BASE_URL,
765
+ '--broker-token',
766
+ PACT_BROKER_TOKEN,
767
+ ],
768
+ { stdio: 'inherit' },
769
+ );
770
+ }
771
+
772
+ /**
773
+ * Clean up old pact versions (retention policy)
774
+ * Keep: last 30 days, all production tags, latest from each branch
775
+ */
776
+ function cleanupOldPacts() {
777
+ console.log(`🧹 Cleaning up old pacts for ${PACTICIPANT}`);
778
+
779
+ execFileSync(
780
+ 'pact-broker',
781
+ [
782
+ 'clean',
783
+ '--pacticipant',
784
+ PACTICIPANT,
785
+ '--broker-base-url',
786
+ PACT_BROKER_BASE_URL,
787
+ '--broker-token',
788
+ PACT_BROKER_TOKEN,
789
+ '--keep-latest-for-branch',
790
+ '1',
791
+ '--keep-min-age',
792
+ '30',
793
+ ],
794
+ { stdio: 'inherit' },
795
+ );
796
+ }
797
+
798
+ /**
799
+ * Check deployment compatibility
800
+ */
801
+ function canIDeploy(version: string, toEnvironment: string): boolean {
802
+ console.log(`🔍 Checking if ${PACTICIPANT} v${version} can deploy to ${toEnvironment}`);
803
+
804
+ try {
805
+ execFileSync(
806
+ 'pact-broker',
807
+ [
808
+ 'can-i-deploy',
809
+ '--pacticipant',
810
+ PACTICIPANT,
811
+ '--version',
812
+ version,
813
+ '--to-environment',
814
+ toEnvironment,
815
+ '--broker-base-url',
816
+ PACT_BROKER_BASE_URL,
817
+ '--broker-token',
818
+ PACT_BROKER_TOKEN,
819
+ '--retry-while-unknown',
820
+ '10',
821
+ '--retry-interval',
822
+ '30',
823
+ ],
824
+ { stdio: 'inherit' },
825
+ );
826
+ return true;
827
+ } catch (error) {
828
+ console.error(`❌ Cannot deploy to ${toEnvironment}`);
829
+ return false;
830
+ }
831
+ }
832
+
833
+ /**
834
+ * Main housekeeping workflow
835
+ */
836
+ async function main() {
837
+ const command = process.argv[2];
838
+ const version = process.argv[3];
839
+ const environment = process.argv[4] as 'staging' | 'production';
840
+
841
+ switch (command) {
842
+ case 'tag-release':
843
+ tagRelease(version, environment);
844
+ break;
845
+
846
+ case 'record-deployment':
847
+ recordDeployment(version, environment);
848
+ break;
849
+
850
+ case 'can-i-deploy':
851
+ const canDeploy = canIDeploy(version, environment);
852
+ process.exit(canDeploy ? 0 : 1);
853
+
854
+ case 'cleanup':
855
+ cleanupOldPacts();
856
+ break;
857
+
858
+ default:
859
+ console.error('Unknown command. Use: tag-release | record-deployment | can-i-deploy | cleanup');
860
+ process.exit(1);
861
+ }
862
+ }
863
+
864
+ main();
865
+ ```
866
+
867
+ **package.json scripts**:
868
+
869
+ ```json
870
+ {
871
+ "scripts": {
872
+ "pact:tag": "ts-node scripts/pact-broker-housekeeping.ts tag-release",
873
+ "pact:record": "ts-node scripts/pact-broker-housekeeping.ts record-deployment",
874
+ "pact:can-deploy": "ts-node scripts/pact-broker-housekeeping.ts can-i-deploy",
875
+ "pact:cleanup": "ts-node scripts/pact-broker-housekeeping.ts cleanup"
876
+ }
877
+ }
878
+ ```
879
+
880
+ **Deployment workflow integration**:
881
+
882
+ ```yaml
883
+ # .github/workflows/deploy-production.yml
884
+ name: Deploy to Production
885
+ on:
886
+ push:
887
+ tags:
888
+ - 'v*'
889
+
890
+ jobs:
891
+ verify-contracts:
892
+ runs-on: ubuntu-latest
893
+ steps:
894
+ - uses: actions/checkout@v4
895
+
896
+ - name: Check pact compatibility
897
+ run: npm run pact:can-deploy ${{ github.ref_name }} production
898
+ env:
899
+ PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
900
+ PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
901
+
902
+ deploy:
903
+ needs: verify-contracts
904
+ runs-on: ubuntu-latest
905
+ steps:
906
+ - name: Deploy to production
907
+ run: ./scripts/deploy.sh production
908
+
909
+ - name: Record deployment in Pact Broker
910
+ run: npm run pact:record ${{ github.ref_name }} production
911
+ env:
912
+ PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
913
+ PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
914
+ ```
915
+
916
+ **Scheduled cleanup**:
917
+
918
+ ```yaml
919
+ # .github/workflows/pact-housekeeping.yml
920
+ name: Pact Broker Housekeeping
921
+ on:
922
+ schedule:
923
+ - cron: '0 2 * * 0' # Weekly on Sunday at 2 AM
924
+
925
+ jobs:
926
+ cleanup:
927
+ runs-on: ubuntu-latest
928
+ steps:
929
+ - uses: actions/checkout@v4
930
+
931
+ - name: Cleanup old pacts
932
+ run: npm run pact:cleanup
933
+ env:
934
+ PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
935
+ PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
936
+ ```
937
+
938
+ **Key Points**:
939
+
940
+ - **Automated tagging**: Releases tagged with environment
941
+ - **Deployment tracking**: Broker knows which version is where
942
+ - **Safety gate**: can-i-deploy blocks incompatible deployments
943
+ - **Retention policy**: Keep recent, production, and branch-latest pacts
944
+ - **Webhook triggers**: Provider verification runs on consumer changes
945
+
946
+ ---
947
+
948
+ ## Provider Scrutiny Protocol
949
+
950
+ When generating consumer contract tests, the agent **MUST** analyze provider source code — or the provider's OpenAPI/Swagger spec — before writing any Pact interaction. Generating contracts from consumer-side assumptions alone leads to mismatches that only surface during provider verification — wrong response shapes, wrong status codes, wrong field names, wrong types, missing required fields, and wrong enum values.
951
+
952
+ **Source priority**: Provider source code is the most authoritative reference. When an OpenAPI/Swagger spec exists (`openapi.yaml`, `openapi.json`, `swagger.json`), use it as a complementary or alternative source — it documents the provider's contract explicitly and can be faster to parse than tracing through handler code. When both exist, cross-reference them; if they disagree, the source code wins.
953
+
954
+ ### Provider Endpoint Comment
955
+
956
+ Every Pact interaction MUST include a provider endpoint comment immediately above the `.given()` call:
957
+
958
+ ```typescript
959
+ // Provider endpoint: server/src/routes/userRouteHandlers.ts -> GET /api/v2/users/:userId
960
+ await provider.given('user with id 1 exists').uponReceiving('a request for user 1');
961
+ ```
962
+
963
+ **Format**: `// Provider endpoint: <relative-path-to-handler> -> <METHOD> <route-pattern>`
964
+
965
+ If the provider source is not accessible, use: `// Provider endpoint: TODO — provider source not accessible, verify manually`
966
+
967
+ ### Seven-Point Scrutiny Checklist
968
+
969
+ Before generating each Pact interaction, read the provider route handler and/or OpenAPI spec and verify:
970
+
971
+ | # | Check | What to Read (source code / OpenAPI spec) | Common Mismatch |
972
+ | --- | --------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------- |
973
+ | 1 | **Response shape** | Handler's `res.json()` calls / OpenAPI `responses.content.schema` | Nested object vs flat; array wrapper vs direct |
974
+ | 2 | **Status codes** | Handler's `res.status()` calls / OpenAPI `responses` keys | 200 vs 201 for creation; 204 vs 200 for delete |
975
+ | 3 | **Field names** | Response type/DTO definitions / OpenAPI `schema.properties` | `transaction_id` vs `transactionId`; `fraud_score` vs `score` |
976
+ | 4 | **Enum values** | Validation schemas, constants / OpenAPI `schema.enum` | `"active"` vs `"ACTIVE"`; `"pending"` vs `"in_progress"` |
977
+ | 5 | **Required fields** | Request validation (Joi, Zod) / OpenAPI `schema.required` | Missing required header; optional field assumed required |
978
+ | 6 | **Data types** | TypeScript types, DB models / OpenAPI `schema.type` + `format` | `string` ID vs `number` ID; ISO date vs Unix timestamp |
979
+ | 7 | **Nested structures** | Response builder, serializer / OpenAPI `$ref` + `allOf`/`oneOf` | `{ data: { items: [] } }` vs `{ items: [] }` |
980
+
981
+ ### Scrutiny Evidence Block
982
+
983
+ Document what was found from provider source and/or OpenAPI spec as a block comment in the test file:
984
+
985
+ ```typescript
986
+ /*
987
+ * Provider Scrutiny Evidence:
988
+ * - Handler: server/src/routes/userRouteHandlers.ts:45
989
+ * - OpenAPI: server/openapi.yaml paths./api/v2/users/{userId}.get (if available)
990
+ * - Response type: UserResponseDto (server/src/types/user.ts:12)
991
+ * - Status: 200 (line 52), 404 (line 48)
992
+ * - Fields: { id: number, name: string, email: string, role: "user" | "admin", createdAt: string }
993
+ * - Required request headers: Authorization (Bearer token)
994
+ * - Validation: Zod schema at server/src/validation/user.ts:8
995
+ */
996
+ ```
997
+
998
+ ### Graceful Degradation
999
+
1000
+ When provider source code is not accessible (different repo, no access, closed source):
1001
+
1002
+ 1. **OpenAPI/Swagger spec available**: Use the spec as the source of truth for response shapes, status codes, and field names
1003
+ 2. **Pact Broker has existing contracts**: Use `pact_mcp` tools to fetch existing provider states and verified interactions as reference
1004
+ 3. **Neither available**: Generate contracts from consumer-side types but use the TODO form of the mandatory comment: `// Provider endpoint: TODO — provider source not accessible, verify manually` and add a `provider_scrutiny: "pending"` field to the output JSON
1005
+ 4. **Never silently guess**: If you cannot verify, document what you assumed and why
1006
+
1007
+ ---
1008
+
1009
+ ## Contract Testing Checklist
1010
+
1011
+ Before implementing contract testing, verify:
1012
+
1013
+ - [ ] **Pact Broker setup**: Hosted (Pactflow) or self-hosted broker configured
1014
+ - [ ] **Consumer tests**: Generate pacts in CI, publish to broker on merge
1015
+ - [ ] **Provider verification**: Runs on PR, verifies all consumer pacts
1016
+ - [ ] **State handlers**: Provider implements all given() states
1017
+ - [ ] **can-i-deploy**: Blocks deployment if contracts incompatible
1018
+ - [ ] **Webhooks configured**: Consumer changes trigger provider verification
1019
+ - [ ] **Retention policy**: Old pacts archived (keep 30 days, all production tags)
1020
+ - [ ] **Resilience tested**: Timeouts, retries, error codes in contracts
1021
+ - [ ] **Provider endpoint comments**: Every Pact interaction has `// Provider endpoint:` comment
1022
+ - [ ] **Provider scrutiny completed**: Seven-point checklist verified for each interaction
1023
+ - [ ] **Scrutiny evidence documented**: Block comment with handler, types, status codes, and fields
1024
+
1025
+ ## Integration Points
1026
+
1027
+ - Used in workflows: `*automate` (integration test generation), `*ci` (contract CI setup)
1028
+ - Related fragments: `test-levels-framework.md`, `ci-burn-in.md`, `pact-consumer-framework-setup.md` (consumer vitest `fileParallelism: false` + `pool: 'forks'` + `singleFork: true`), `pactjs-utils-consumer-helpers.md` (PactV4 one-interaction-per-`it()` rule), `pactjs-utils-provider-verifier.md` (provider vitest `pool: 'forks'` + `singleFork: true` — same rule as consumer), `pact-broker-webhooks.md` (PactFlow → GitHub webhook auth, PAT rotation, staleness monitoring)
1029
+ - Tools: Pact.js, Pact Broker (Pactflow or self-hosted), Pact CLI
1030
+
1031
+ ---
1032
+
1033
+ ## Pact.js Utils Accelerator
1034
+
1035
+ When `tea_use_pactjs_utils` is enabled, the following utilities replace manual boilerplate:
1036
+
1037
+ | Manual Pattern (raw Pact.js) | Pact.js Utils Equivalent | Benefit |
1038
+ | -------------------------------------------------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
1039
+ | Manual `JsonMap` casting for `.given()` params | `createProviderState({ name, params })` | Type-safe, auto-conversion of Date/null/nested objects |
1040
+ | Repeated builder callbacks for query/header/body | `setJsonContent({ query, headers, body })` | Reusable callback for `.withRequest(...)` and `.willRespondWith(...)` |
1041
+ | Inline body lambda `(builder) => builder.jsonBody(body)` | `setJsonBody(body)` | Body-only shorthand for cleaner response builders |
1042
+ | 30+ lines of `VerifierOptions` assembly | `buildVerifierOptions({ provider, port, includeMainAndDeployed, stateHandlers })` | One-call setup, env-aware, flow auto-detection |
1043
+ | Manual broker URL + selector logic from env vars | `handlePactBrokerUrlAndSelectors({ ..., options })` | Mutates options in-place with broker URL and selectors |
1044
+ | DIY Express middleware for auth injection | `createRequestFilter({ tokenGenerator })` | Bearer prefix contract prevents double-prefix bugs |
1045
+ | Manual CI branch/tag extraction | `getProviderVersionTags()` | CI-aware (GitHub Actions, GitLab CI, etc.) |
1046
+ | Message verifier config assembly | `buildMessageVerifierOptions({ provider, messageProviders })` | Same one-call pattern for Kafka/async contracts |
1047
+ | Inline no-op filter `(req, res, next) => next()` | `noOpRequestFilter` | Pre-built pass-through for no-auth providers |
1048
+ | Hand-written matcher helper duplicating a Zod/TS type | `zodToPactMatchers(ConsumerMovieSchema, example)` | Single source of truth for response shape; consumer-curated scope keeps contracts lean and consumer-driven |
1049
+
1050
+ See the `pactjs-utils-*.md` knowledge fragments for complete examples and anti-patterns (`pactjs-utils-zod-to-pact.md` covers the consumer-curated schema pattern).
1051
+
1052
+ ### PactV4 Determinism & FFI Safety (Mandatory)
1053
+
1054
+ Four rules that together prevent both (a) non-deterministic pact generation failures that cause `Cannot change pact content for already published pact` errors at PactFlow publish, and (b) "request was expected but not received" flakes observed on Linux CI once a consumer+provider pair has more than one `.pacttest.ts` file:
1055
+
1056
+ 1. **Consumer Vitest `fileParallelism: false`** in `vitest.config.pact.ts` — prevents parallel workers from racing on the shared pact JSON. See `pact-consumer-framework-setup.md` Example 2.
1057
+ 2. **Consumer Vitest `pool: 'forks'` + `poolOptions.forks.singleFork: true`** in `vitest.config.pact.ts` — same config as the provider side (`pactjs-utils-provider-verifier.md` Example 7). Best current understanding: the `@pact-foundation/pact` napi-rs binding is not robust across Vitest worker threads sharing a process; serialization alone (via `fileParallelism: false`) is insufficient on the default threads pool in Vitest v1. Forks + `singleFork: true` runs every pact file in one subprocess with a coherent FFI handle and eliminated a reproducible Linux-CI flake on two repos (`pactjs-utils`, `seon-mcp-server`). Single-file consumer suites have not been observed to flake; this rule is still recommended as a future-proof. See `pact-consumer-framework-setup.md` Example 2.
1058
+ 3. **One `addInteraction()` per `it()` block** — see `pactjs-utils-consumer-helpers.md` Example 6.
1059
+ 4. **Determinism gate** runs the consumer suite N times and fails on byte-different pact JSON before publish — see `pact-consumer-framework-setup.md` Example 10 (`scripts/check-pact-determinism.sh`).
1060
+
1061
+ Provider suites require the same `pool: 'forks'` + `singleFork: true` combination — see `pactjs-utils-provider-verifier.md` Example 7.
1062
+
1063
+ ### Webhook Auth & Staleness
1064
+
1065
+ When `can-i-deploy` in a consumer repo times out with `There is no verified pact between <consumer> and the version of <provider> currently in <env>` — check the provider's PactFlow webhook. Silent failures from an expired/revoked GitHub PAT are the most common non-code cause of this symptom. See `pact-broker-webhooks.md` for the dedicated-machine-user pattern, classic-PAT-with-`repo`-scope rationale, rotation runbook, and staleness monitoring options.
1066
+
1067
+ _Source: Pact consumer/provider sample repos, Murat contract testing blog, Pact official documentation, @seontechnologies/pactjs-utils library_