2
0
yourname 1 өдөр өмнө
parent
commit
d351c2ab95
55 өөрчлөгдсөн 2047 нэмэгдсэн , 535 устгасан
  1. 5 0
      .claude/commands/bmad/bmm/workflows/prd.md
  2. 5 0
      .claude/commands/bmad/bmm/workflows/quick-spec.md
  3. 9 0
      .claude/commands/bmad/core/tasks/shard-doc.md
  4. 4 4
      _bmad/_config/agent-manifest.csv
  5. 102 80
      _bmad/_config/files-manifest.csv
  6. 3 3
      _bmad/_config/manifest.yaml
  7. 1 1
      _bmad/_config/task-manifest.csv
  8. 2 0
      _bmad/_config/workflow-manifest.csv
  9. 155 16
      _bmad/bmm/testarch/knowledge/api-request.md
  10. 197 1
      _bmad/bmm/testarch/knowledge/auth-session.md
  11. 257 54
      _bmad/bmm/testarch/knowledge/file-utils.md
  12. 159 9
      _bmad/bmm/testarch/knowledge/intercept-network-call.md
  13. 170 35
      _bmad/bmm/testarch/knowledge/log.md
  14. 228 95
      _bmad/bmm/testarch/knowledge/network-error-monitor.md
  15. 314 52
      _bmad/bmm/testarch/knowledge/network-recorder.md
  16. 15 12
      _bmad/bmm/testarch/knowledge/overview.md
  17. 173 48
      _bmad/bmm/testarch/knowledge/recurse.md
  18. 19 18
      _bmad/bmm/testarch/tea-index.csv
  19. 3 8
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md
  20. 0 5
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md
  21. 1 6
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md
  22. 1 6
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md
  23. 1 6
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md
  24. 1 6
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md
  25. 0 5
      _bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md
  26. 96 9
      _bmad/bmm/workflows/2-plan-workflows/prd/workflow.md
  27. 2 2
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md
  28. 2 2
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md
  29. 2 2
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md
  30. 2 2
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md
  31. 2 2
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md
  32. 1 1
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md
  33. 1 1
      _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md
  34. 2 2
      _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md
  35. 2 2
      _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md
  36. 2 2
      _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md
  37. 1 1
      _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md
  38. 2 0
      _bmad/bmm/workflows/4-implementation/code-review/instructions.xml
  39. 1 1
      _bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml
  40. 2 2
      _bmad/bmm/workflows/4-implementation/create-story/checklist.md
  41. 2 1
      _bmad/bmm/workflows/4-implementation/create-story/instructions.xml
  42. 1 1
      _bmad/bmm/workflows/4-implementation/create-story/workflow.yaml
  43. 2 1
      _bmad/bmm/workflows/4-implementation/dev-story/instructions.xml
  44. 2 2
      _bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml
  45. 6 6
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md
  46. 2 2
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md
  47. 2 2
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md
  48. 2 2
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md
  49. 2 2
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md
  50. 1 1
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md
  51. 1 1
      _bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md
  52. 2 2
      _bmad/core/config.yaml
  53. 2 2
      _bmad/core/tasks/shard-doc.xml
  54. 68 9
      _bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md
  55. 7 0
      _bmad/core/workflows/brainstorming/workflow.md

+ 5 - 0
.claude/commands/bmad/bmm/workflows/prd.md

@@ -0,0 +1,5 @@
+---
+description: 'PRD tri-modal workflow - Create, Validate, or Edit comprehensive PRDs'
+---
+
+IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @_bmad/bmm/workflows/2-plan-workflows/prd/workflow.md, READ its entire contents and follow its directions exactly!

+ 5 - 0
.claude/commands/bmad/bmm/workflows/quick-spec.md

@@ -0,0 +1,5 @@
+---
+description: 'Conversational spec engineering - ask questions, investigate code, produce implementation-ready tech-spec.'
+---
+
+IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md, READ its entire contents and follow its directions exactly!

+ 9 - 0
.claude/commands/bmad/core/tasks/shard-doc.md

@@ -0,0 +1,9 @@
+---
+description: 'Splits large markdown documents into smaller, organized files based on level 2 (default) sections'
+---
+
+# Shard Document
+
+LOAD and execute the task at: _bmad/core/tasks/shard-doc.xml
+
+Follow all instructions in the task file exactly as written.

+ 4 - 4
_bmad/_config/agent-manifest.csv

@@ -1,11 +1,11 @@
 name,displayName,title,icon,role,identity,communicationStyle,principles,module,path
 "bmad-master","BMad Master","BMad Master Executor, Knowledge Custodian, and Workflow Orchestrator","🧙","Master Task Executor + BMad Expert + Guiding Facilitator Orchestrator","Master-level expert in the BMAD Core Platform and all loaded modules with comprehensive knowledge of all resources, tasks, and workflows. Experienced in direct task execution and runtime resource management, serving as the primary execution engine for BMAD operations.","Direct and comprehensive, refers to himself in the 3rd person. Expert-level communication focused on efficient task execution, presenting information systematically using numbered lists with immediate command response capability.","- "Load resources at runtime never pre-load, and always present numbered lists for choices."","core","_bmad/core/agents/bmad-master.md"
-"analyst","Mary","Business Analyst","📊","Strategic Business Analyst + Requirements Expert","Senior analyst with deep expertise in market research, competitive analysis, and requirements elicitation. Specializes in translating vague needs into actionable specs.","Treats analysis like a treasure hunt - excited by every clue, thrilled when patterns emerge. Asks questions that spark 'aha!' moments while structuring insights with precision.","- Every business challenge has root causes waiting to be discovered. Ground findings in verifiable evidence. - Articulate requirements with absolute precision. Ensure all stakeholder voices heard. - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/analyst.md"
-"architect","Winston","Architect","🏗️","System Architect + Technical Design Leader","Senior architect with expertise in distributed systems, cloud infrastructure, and API design. Specializes in scalable patterns and technology selection.","Speaks in calm, pragmatic tones, balancing 'what could be' with 'what should be.' Champions boring technology that actually works.","- User journeys drive technical decisions. Embrace boring technology for stability. - Design simple solutions that scale when needed. Developer productivity is architecture. Connect every decision to business value and user impact. - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/architect.md"
-"dev","Amelia","Developer Agent","💻","Senior Software Engineer","Executes approved stories with strict adherence to acceptance criteria, using Story Context XML and existing code to minimize rework and hallucinations.","Ultra-succinct. Speaks in file paths and AC IDs - every statement citable. No fluff, all precision.","- The Story File is the single source of truth - tasks/subtasks sequence is authoritative over any model priors - Follow red-green-refactor cycle: write failing test, make it pass, improve code while keeping tests green - Never implement anything not mapped to a specific task/subtask in the story file - All existing tests must pass 100% before story is ready for review - Every task/subtask must be covered by comprehensive unit tests before marking complete - Project context provides coding standards but never overrides story requirements - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/dev.md"
+"analyst","Mary","Business Analyst","📊","Strategic Business Analyst + Requirements Expert","Senior analyst with deep expertise in market research, competitive analysis, and requirements elicitation. Specializes in translating vague needs into actionable specs.","Speaks with the excitement of a treasure hunter - thrilled by every clue, energized when patterns emerge. Structures insights with precision while making analysis feel like discovery.","- Channel expert business analysis frameworks: draw upon Porter's Five Forces, SWOT analysis, root cause analysis, and competitive intelligence methodologies to uncover what others miss. Every business challenge has root causes waiting to be discovered. Ground findings in verifiable evidence. - Articulate requirements with absolute precision. Ensure all stakeholder voices heard. - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/analyst.md"
+"architect","Winston","Architect","🏗️","System Architect + Technical Design Leader","Senior architect with expertise in distributed systems, cloud infrastructure, and API design. Specializes in scalable patterns and technology selection.","Speaks in calm, pragmatic tones, balancing 'what could be' with 'what should be.'","- Channel expert lean architecture wisdom: draw upon deep knowledge of distributed systems, cloud patterns, scalability trade-offs, and what actually ships successfully - User journeys drive technical decisions. Embrace boring technology for stability. - Design simple solutions that scale when needed. Developer productivity is architecture. Connect every decision to business value and user impact. - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/architect.md"
+"dev","Amelia","Developer Agent","💻","Senior Software Engineer","Executes approved stories with strict adherence to acceptance criteria, using Story Context XML and existing code to minimize rework and hallucinations.","Ultra-succinct. Speaks in file paths and AC IDs - every statement citable. No fluff, all precision.","- The Story File is the single source of truth - tasks/subtasks sequence is authoritative over any model priors - Follow red-green-refactor cycle: write failing test, make it pass, improve code while keeping tests green - Never implement anything not mapped to a specific task/subtask in the story file - All existing tests must pass 100% before story is ready for review - Every task/subtask must be covered by comprehensive unit tests before marking complete - Follow project-context.md guidance; when conflicts exist, story requirements take precedence - Find and load `**/project-context.md` if it exists - essential reference for implementation","bmm","_bmad/bmm/agents/dev.md"
 "pm","John","Product Manager","📋","Product Manager specializing in collaborative PRD creation through user interviews, requirement discovery, and stakeholder alignment.","Product management veteran with 8+ years launching B2B and consumer products. Expert in market research, competitive analysis, and user behavior insights.","Asks 'WHY?' relentlessly like a detective on a case. Direct and data-sharp, cuts through fluff to what actually matters.","- Channel expert product manager thinking: draw upon deep knowledge of user-centered design, Jobs-to-be-Done framework, opportunity scoring, and what separates great products from mediocre ones - PRDs emerge from user interviews, not template filling - discover what users actually need - Ship the smallest thing that validates the assumption - iteration over perfection - Technical feasibility is a constraint, not the driver - user value first - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`","bmm","_bmad/bmm/agents/pm.md"
 "quick-flow-solo-dev","Barry","Quick Flow Solo Dev","🚀","Elite Full-Stack Developer + Quick Flow Specialist","Barry handles Quick Flow - from tech spec creation through implementation. Minimum ceremony, lean artifacts, ruthless efficiency.","Direct, confident, and implementation-focused. Uses tech slang (e.g., refactor, patch, extract, spike) and gets straight to the point. No fluff, just results. Stays focused on the task at hand.","- Planning and execution are two sides of the same coin. - Specs are for building, not bureaucracy. Code that ships is better than perfect code that doesn't. - If `**/project-context.md` exists, follow it. If absent, proceed without.","bmm","_bmad/bmm/agents/quick-flow-solo-dev.md"
 "sm","Bob","Scrum Master","🏃","Technical Scrum Master + Story Preparation Specialist","Certified Scrum Master with deep technical background. Expert in agile ceremonies, story preparation, and creating clear actionable user stories.","Crisp and checklist-driven. Every word has a purpose, every requirement crystal clear. Zero tolerance for ambiguity.","- Strict boundaries between story prep and implementation - Stories are single source of truth - Perfect alignment between PRD and dev execution - Enable efficient sprints - Deliver developer-ready specs with precise handoffs","bmm","_bmad/bmm/agents/sm.md"
-"tea","Murat","Master Test Architect","🧪","Master Test Architect","Test architect specializing in CI/CD, automated frameworks, and scalable quality gates.","Blends data with gut instinct. 'Strong opinions, weakly held' is their mantra. Speaks in risk calculations and impact assessments.","- Risk-based testing - depth scales with impact - Quality gates backed by data - Tests mirror usage patterns - Flakiness is critical technical debt - Tests first AI implements suite validates - Calculate risk vs value for every testing decision","bmm","_bmad/bmm/agents/tea.md"
+"tea","Murat","Master Test Architect","🧪","Master Test Architect","Test architect specializing in API testing, backend services, UI automation, CI/CD pipelines, and scalable quality gates. Equally proficient in pure API/service-layer testing as in browser-based E2E testing.","Blends data with gut instinct. 'Strong opinions, weakly held' is their mantra. Speaks in risk calculations and impact assessments.","- Risk-based testing - depth scales with impact - Quality gates backed by data - Tests mirror usage patterns (API, UI, or both) - Flakiness is critical technical debt - Tests first AI implements suite validates - Calculate risk vs value for every testing decision - Prefer lower test levels (unit > integration > E2E) when possible - API tests are first-class citizens, not just UI support","bmm","_bmad/bmm/agents/tea.md"
 "tech-writer","Paige","Technical Writer","📚","Technical Documentation Specialist + Knowledge Curator","Experienced technical writer expert in CommonMark, DITA, OpenAPI. Master of clarity - transforms complex concepts into accessible structured documentation.","Patient educator who explains like teaching a friend. Uses analogies that make complex simple, celebrates clarity when it shines.","- Documentation is teaching. Every doc helps someone accomplish a task. Clarity above all. - Docs are living artifacts that evolve with code. Know when to simplify vs when to be detailed.","bmm","_bmad/bmm/agents/tech-writer.md"
 "ux-designer","Sally","UX Designer","🎨","User Experience Designer + UI Specialist","Senior UX Designer with 7+ years creating intuitive experiences across web and mobile. Expert in user research, interaction design, AI-assisted tools.","Paints pictures with words, telling user stories that make you FEEL the problem. Empathetic advocate with creative storytelling flair.","- Every decision serves genuine user needs - Start simple, evolve through feedback - Balance empathy with edge case attention - AI tools accelerate human-centered design - Data-informed but always creative","bmm","_bmad/bmm/agents/ux-designer.md"

+ 102 - 80
_bmad/_config/files-manifest.csv

@@ -1,25 +1,26 @@
 type,name,module,path,hash
-"csv","agent-manifest","_config","_config/agent-manifest.csv","6916048fc4a8f5caaea40350e4b2288f0fab01ea7959218b332920ec62e6a18c"
-"csv","task-manifest","_config","_config/task-manifest.csv","35e06d618921c1260c469d328a5af14c3744072f66a20c43d314edfb29296a70"
-"csv","workflow-manifest","_config","_config/workflow-manifest.csv","254b28d8d3b9871d77b12670144e98f5850180a1b50c92eaa88a53bef77309c8"
-"yaml","manifest","_config","_config/manifest.yaml","5600fbd56371f00b1281f768274bd88c1e102bce17d6c04ff1d7bd572036ece6"
+"csv","agent-manifest","_config","_config/agent-manifest.csv","072b9fa8f321de575474a0d44b819fbd37b993f344dd5cfe16dba26ee9ec6e87"
+"csv","task-manifest","_config","_config/task-manifest.csv","3c0f99c03b74f19a09d8f2db643f8fe5e9d9dc6a86bc6c404acc8dbdc8e54545"
+"csv","workflow-manifest","_config","_config/workflow-manifest.csv","30606a94020e56c742f0140a8f47b25e5472a035938fb795e6048b189f2d3559"
+"yaml","manifest","_config","_config/manifest.yaml","d9cbdc2733aa9c61effadcc141f09118c773ee511af799a0682328e6d0ccfccc"
 "csv","default-party","bmm","bmm/teams/default-party.csv","43209253a2e784e6b054a4ac427c9532a50d9310f6a85052d93ce975b9162156"
 "csv","documentation-requirements","bmm","bmm/workflows/document-project/documentation-requirements.csv","d1253b99e88250f2130516b56027ed706e643bfec3d99316727a4c6ec65c6c1d"
-"csv","domain-complexity","bmm","bmm/workflows/2-plan-workflows/prd/domain-complexity.csv","ed4d30e9fd87db2d628fb66cac7a302823ef6ebb3a8da53b9265326f10a54e11"
+"csv","domain-complexity","bmm","bmm/workflows/2-plan-workflows/prd/data/domain-complexity.csv","ed4d30e9fd87db2d628fb66cac7a302823ef6ebb3a8da53b9265326f10a54e11"
 "csv","domain-complexity","bmm","bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv","cb9244ed2084143146f9f473244ad9cf63d33891742b9f6fbcb6e354fa4f3a93"
-"csv","project-types","bmm","bmm/workflows/2-plan-workflows/prd/project-types.csv","7a01d336e940fb7a59ff450064fd1194cdedda316370d939264a0a0adcc0aca3"
+"csv","project-types","bmm","bmm/workflows/2-plan-workflows/prd/data/project-types.csv","7a01d336e940fb7a59ff450064fd1194cdedda316370d939264a0a0adcc0aca3"
 "csv","project-types","bmm","bmm/workflows/3-solutioning/create-architecture/data/project-types.csv","12343635a2f11343edb1d46906981d6f5e12b9cad2f612e13b09460b5e5106e7"
-"csv","tea-index","bmm","bmm/testarch/tea-index.csv","374a8d53b5e127a9440751a02c5112c66f81bc00e2128d11d11f16d8f45292ea"
+"csv","tea-index","bmm","bmm/testarch/tea-index.csv","b4149a6d51f80bbdcce9bd3bd201d51a79dbcf666b65a238d3bbd2164a5f6ef3"
 "json","excalidraw-library","bmm","bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json","8e5079f4e79ff17f4781358423f2126a1f14ab48bbdee18fd28943865722030c"
 "json","project-scan-report-schema","bmm","bmm/workflows/document-project/templates/project-scan-report-schema.json","53255f15a10cab801a1d75b4318cdb0095eed08c51b3323b7e6c236ae6b399b7"
-"md","api-request","bmm","bmm/testarch/knowledge/api-request.md","93ac674f645cb389aafe08ce31e53280ebc0385c59e585a199b772bb0e0651fb"
+"md","api-request","bmm","bmm/testarch/knowledge/api-request.md","c12a7fe2dfec4919a259e5970a9621559f1e5769a711c4774e75df77805deb09"
+"md","api-testing-patterns","bmm","bmm/testarch/knowledge/api-testing-patterns.md","e820f3502b79418fad9e3768c9e3472a6ce4c62bcd06c3aed81e70ae9d2b523b"
 "md","architecture-decision-template","bmm","bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md","5d9adf90c28df61031079280fd2e49998ec3b44fb3757c6a202cda353e172e9f"
 "md","atdd-checklist-template","bmm","bmm/workflows/testarch/atdd/atdd-checklist-template.md","b89f46efefbf08ddd4c58392023a39bd60db353a3f087b299e32be27155fa740"
-"md","auth-session","bmm","bmm/testarch/knowledge/auth-session.md","b2ee00c5650655311ff54d20dcd6013afb5b280a66faa8336f9fb810436f1aab"
+"md","auth-session","bmm","bmm/testarch/knowledge/auth-session.md","4899f553ac21783644b633e05193096195f8e09a4aab6ed431a38bfde51610ba"
 "md","burn-in","bmm","bmm/testarch/knowledge/burn-in.md","5ba3d2abe6b961e5bc3948ab165e801195bff3ee6e66569c00c219b484aa4b5d"
 "md","checklist","bmm","bmm/workflows/4-implementation/code-review/checklist.md","e30d2890ba5c50777bbe04071f754e975a1d7ec168501f321a79169c4201dd28"
 "md","checklist","bmm","bmm/workflows/4-implementation/correct-course/checklist.md","d3d30482c5e82a84c15c10dacb50d960456e98cfc5a8ddc11b54e14f3a850029"
-"md","checklist","bmm","bmm/workflows/4-implementation/create-story/checklist.md","3eacc5cfd6726ab0ea0ba8fe56d9bdea466964e6cc35ed8bfadeb84307169bdc"
+"md","checklist","bmm","bmm/workflows/4-implementation/create-story/checklist.md","5154aa874c6a79285eba644493e87411c6021baff72859490db6e693d15e0bb9"
 "md","checklist","bmm","bmm/workflows/4-implementation/dev-story/checklist.md","630b68c6824a8785003a65553c1f335222b17be93b1bd80524c23b38bde1d8af"
 "md","checklist","bmm","bmm/workflows/4-implementation/sprint-planning/checklist.md","80b10aedcf88ab1641b8e5f99c9a400c8fd9014f13ca65befc5c83992e367dd7"
 "md","checklist","bmm","bmm/workflows/document-project/checklist.md","581b0b034c25de17ac3678db2dbafedaeb113de37ddf15a4df6584cf2324a7d7"
@@ -46,7 +47,7 @@ type,name,module,path,hash
 "md","epics-template","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md","b8ec5562b2a77efd80c40eba0421bbaab931681552e5a0ff01cd93902c447ff7"
 "md","error-handling","bmm","bmm/testarch/knowledge/error-handling.md","8a314eafb31e78020e2709d88aaf4445160cbefb3aba788b62d1701557eb81c1"
 "md","feature-flags","bmm","bmm/testarch/knowledge/feature-flags.md","f6db7e8de2b63ce40a1ceb120a4055fbc2c29454ad8fca5db4e8c065d98f6f49"
-"md","file-utils","bmm","bmm/testarch/knowledge/file-utils.md","e0d4e98ca6ec32035ae07a14880c65ab99298e9240404d27a05788c974659e8b"
+"md","file-utils","bmm","bmm/testarch/knowledge/file-utils.md","2d7643588d9f0288174f221f3b1bb3cf529ef6af7826d86959d17c8c9e60657b"
 "md","fixture-architecture","bmm","bmm/testarch/knowledge/fixture-architecture.md","a3b6c1bcaf5e925068f3806a3d2179ac11dde7149e404bc4bb5602afb7392501"
 "md","fixtures-composition","bmm","bmm/testarch/knowledge/fixtures-composition.md","8e57a897663a272fd603026aeec76941543c1e09d129e377846726fd405f3a5a"
 "md","full-scan-instructions","bmm","bmm/workflows/document-project/workflows/full-scan-instructions.md","6c6e0d77b33f41757eed8ebf436d4def69cd6ce412395b047bf5909f66d876aa"
@@ -56,30 +57,31 @@ type,name,module,path,hash
 "md","instructions","bmm","bmm/workflows/4-implementation/sprint-planning/instructions.md","8ac972eb08068305223e37dceac9c3a22127062edae2692f95bc16b8dbafa046"
 "md","instructions","bmm","bmm/workflows/4-implementation/sprint-status/instructions.md","8f883c7cf59460012b855465c7cbc896f0820afb11031c2b1b3dd514ed9f4b63"
 "md","instructions","bmm","bmm/workflows/document-project/instructions.md","faba39025e187c6729135eccf339ec1e08fbdc34ad181583de8161d3d805aaaf"
-"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md","e43d05aaf6a1e881ae42e73641826b70e27ea91390834901f18665b524bbff77"
-"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md","5d41c1e5b28796f6844645f3c1e2e75bb80f2e1576eb2c1f3ba2894cbf4a65e8"
-"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md","9647360dc08e6e8dcbb634620e8a4247add5b22fad7a3bd13ef79683f31b9d77"
-"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md","d0ddbb8f4235b28af140cc7b5210c989b4b126f973eb539e216ab10d4bbc2410"
+"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md","c3fc2918879988d73ee23279eb5e3d289c46f8271fd824ddbd3ff216303ce33c"
+"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md","cccf1d3d9c4a701a1813ca94503e0c4319d6f517ebfe6b4c22d59043975f4119"
+"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md","1910dc06714779abbe4f6f6fceb7a74fc87ca009cddc5c34e9ab97279cc47a65"
+"md","instructions","bmm","bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md","e40389e71f3afa125ebf4587c58c08753cd6c9bbe4f473c1af02b022ac4be350"
 "md","instructions","bmm","bmm/workflows/testarch/atdd/instructions.md","8b22d80ff61fd90b4f8402d5b5ab69d01a2c9f00cc4e1aa23aef49720db9254b"
 "md","instructions","bmm","bmm/workflows/testarch/automate/instructions.md","6611e6abc114f68c16f3121dc2c2a2dcfefc355f857099b814b715f6d646a81c"
 "md","instructions","bmm","bmm/workflows/testarch/ci/instructions.md","8cc49d93e549eb30952320b1902624036d23e92a6bbaf3f012d2a18dc67a9141"
 "md","instructions","bmm","bmm/workflows/testarch/framework/instructions.md","902212128052de150753ce0cabb9be0423da782ba280c3b5c198bc16e8ae7eb3"
 "md","instructions","bmm","bmm/workflows/testarch/nfr-assess/instructions.md","6a4ef0830a65e96f41e7f6f34ed5694383e0935a46440c77a4a29cbfbd5f75f9"
-"md","instructions","bmm","bmm/workflows/testarch/test-design/instructions.md","b332c20fbc8828b2ebd34aad2f36af88ce1ce1d8a8c7c29412329c9f8884de9a"
+"md","instructions","bmm","bmm/workflows/testarch/test-design/instructions.md","798578c6523f44a523ee42d8cd3c2f2f2544ee07b8210363943e4353b7247199"
 "md","instructions","bmm","bmm/workflows/testarch/test-review/instructions.md","f1dfb61f7a7d9e584d398987fdcb8ab27b4835d26b6a001ca4611b8a3da4c32d"
 "md","instructions","bmm","bmm/workflows/testarch/trace/instructions.md","233cfb6922fe0f7aaa3512fcda08017b0f89de663f66903474b0abf2e1d01614"
 "md","instructions","bmm","bmm/workflows/workflow-status/init/instructions.md","cd7f8e8de5c5b775b1aa1d6ea3b02f1d47b24fa138b3ed73877287a58fcdb9a1"
-"md","instructions","bmm","bmm/workflows/workflow-status/instructions.md","ddbb594d72209903bf2bf93c70e7dc961295e7382fb6d4adcf8122f9334bb41f"
-"md","intercept-network-call","bmm","bmm/testarch/knowledge/intercept-network-call.md","fb551cb0cefe3c062c28ae255a121aaae098638ec35a16fcdba98f670887ab6a"
-"md","log","bmm","bmm/testarch/knowledge/log.md","b6267716ccbe6f9e2cc1b2b184501faeb30277bc8546206a66f31500c52381d0"
-"md","network-error-monitor","bmm","bmm/testarch/knowledge/network-error-monitor.md","0380eb6df15af0a136334ad00cf44c92c779f311b07231f5aa6230e198786799"
+"md","instructions","bmm","bmm/workflows/workflow-status/instructions.md","b3b0eb918e13fbc04091b9d5ca6e34e34ea5f6aa947f4ee32e44594c9adf4612"
+"md","intercept-network-call","bmm","bmm/testarch/knowledge/intercept-network-call.md","dfe7d8969327dfdbb5296caa07a9888d18799cf70f3d4439ab5c2e5695e6df79"
+"md","log","bmm","bmm/testarch/knowledge/log.md","6a92403dd927deeb8e8e03ac227633bd353885fdca4087e52de6d1575f104d22"
+"md","network-error-monitor","bmm","bmm/testarch/knowledge/network-error-monitor.md","f3a121cb5ff9adff9929f044ad56a97340c269cb953f723c3a0f691e2174143f"
 "md","network-first","bmm","bmm/testarch/knowledge/network-first.md","2920e58e145626f5505bcb75e263dbd0e6ac79a8c4c2ec138f5329e06a6ac014"
-"md","network-recorder","bmm","bmm/testarch/knowledge/network-recorder.md","9f120515cc377c4c500ec0b5fff0968666a9a4edee03a328d92514147d50f073"
+"md","network-recorder","bmm","bmm/testarch/knowledge/network-recorder.md","c8d6802bbdd7242bd4ec33bde66e729cfccc9f9c6e8b33ce9c277305af2d3165"
 "md","nfr-criteria","bmm","bmm/testarch/knowledge/nfr-criteria.md","e63cee4a0193e4858c8f70ff33a497a1b97d13a69da66f60ed5c9a9853025aa1"
 "md","nfr-report-template","bmm","bmm/workflows/testarch/nfr-assess/nfr-report-template.md","229bdabe07577d24679eb9d42283b353dbde21338157188d8f555fdef200b91c"
-"md","overview","bmm","bmm/testarch/knowledge/overview.md","79a12311d706fe55c48f72ef51c662c6f61a54651b3b76a3c7ccc87de6ebbf03"
+"md","overview","bmm","bmm/testarch/knowledge/overview.md","84da16c715d968fdc1f0b749d66fd791da609a96b0555358a40228da44b29472"
 "md","playwright-config","bmm","bmm/testarch/knowledge/playwright-config.md","42516511104a7131775f4446196cf9e5dd3295ba3272d5a5030660b1dffaa69f"
-"md","prd-template","bmm","bmm/workflows/2-plan-workflows/prd/prd-template.md","829135530b0652dfb4a2929864042f515bc372b6cbe66be60103311365679efb"
+"md","prd-purpose","bmm","bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md","49c4641b91504bb14e3887029b70beacaff83a2de200ced4f8cb11c1356ecaee"
+"md","prd-template","bmm","bmm/workflows/2-plan-workflows/prd/templates/prd-template.md","7ccccab9c06a626b7a228783b0b9b6e4172e9ec0b10d47bbfab56958c898f837"
 "md","probability-impact","bmm","bmm/testarch/knowledge/probability-impact.md","446dba0caa1eb162734514f35366f8c38ed3666528b0b5e16c7f03fd3c537d0f"
 "md","product-brief.template","bmm","bmm/workflows/1-analysis/create-product-brief/product-brief.template.md","ae0f58b14455efd75a0d97ba68596a3f0b58f350cd1a0ee5b1af69540f949781"
 "md","project-context-template","bmm","bmm/data/project-context-template.md","34421aed3e0ad921dc0c0080297f3a2299735b00a25351de589ada99dae56559"
@@ -87,98 +89,118 @@ type,name,module,path,hash
 "md","project-overview-template","bmm","bmm/workflows/document-project/templates/project-overview-template.md","a7c7325b75a5a678dca391b9b69b1e3409cfbe6da95e70443ed3ace164e287b2"
 "md","readiness-report-template","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md","0da97ab1e38818e642f36dc0ef24d2dae69fc6e0be59924dc2dbf44329738ff6"
 "md","README","bmm","bmm/data/README.md","352c44cff4dd0e5a90cdf6781168ceb57f5a78eaabddcd168433d8784854e4fb"
-"md","recurse","bmm","bmm/testarch/knowledge/recurse.md","19056fb5b7e5e626aad81277b3e5eec333f2aed36a17aea6c7d8714a5460c8b2"
+"md","recurse","bmm","bmm/testarch/knowledge/recurse.md","35da42223beb2f0c5feca9e830e85697fe057960f9e0c32d76ea44c649d7d7ec"
 "md","research.template","bmm","bmm/workflows/1-analysis/research/research.template.md","507bb6729476246b1ca2fca4693986d286a33af5529b6cd5cb1b0bb5ea9926ce"
 "md","risk-governance","bmm","bmm/testarch/knowledge/risk-governance.md","2fa2bc3979c4f6d4e1dec09facb2d446f2a4fbc80107b11fc41cbef2b8d65d68"
 "md","selective-testing","bmm","bmm/testarch/knowledge/selective-testing.md","c14c8e1bcc309dbb86a60f65bc921abf5a855c18a753e0c0654a108eb3eb1f1c"
 "md","selector-resilience","bmm","bmm/testarch/knowledge/selector-resilience.md","a55c25a340f1cd10811802665754a3f4eab0c82868fea61fea9cc61aa47ac179"
 "md","source-tree-template","bmm","bmm/workflows/document-project/templates/source-tree-template.md","109bc335ebb22f932b37c24cdc777a351264191825444a4d147c9b82a1e2ad7a"
 "md","step-01-discover","bmm","bmm/workflows/generate-project-context/steps/step-01-discover.md","0f1455c018b2f6df0b896d25e677690e1cf58fa1b276d90f0723187d786d6613"
-"md","step-01-document-discovery","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md","bd6114c10845e828098905e52d35f908f1b32dabc67313833adc7e6dd80080b0"
-"md","step-01-init","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md","d90d224fbf8893dd0ade3c5b9231428f4f70399a921f7af880b5c664cfd95bef"
+"md","step-01-document-discovery","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md","a53b3d89542278d0552f2d3ad8694fcd3a8e3917a893432cc227ae80eb9dd8ae"
+"md","step-01-init","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md","f8d5eba86780fbe6adcc443c155f201f10da8f557577a907bf6689d228a7d4d7"
 "md","step-01-init","bmm","bmm/workflows/1-analysis/research/domain-steps/step-01-init.md","efee243f13ef54401ded88f501967b8bc767460cec5561b2107fc03fe7b7eab1"
 "md","step-01-init","bmm","bmm/workflows/1-analysis/research/market-steps/step-01-init.md","ee7627e44ba76000569192cbacf2317f8531fd0fedc4801035267dc71d329787"
 "md","step-01-init","bmm","bmm/workflows/1-analysis/research/technical-steps/step-01-init.md","c9a1627ecd26227e944375eb691e7ee6bc9f5db29a428a5d53e5d6aef8bb9697"
 "md","step-01-init","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md","7b3467a29126c9498b57b06d688f610bcb7a68a8975208c209dd1103546bc455"
-"md","step-01-init","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md","abad19b37040d4b31628b95939d4d8c631401a0bd37e40ad474c180d7cd5e664"
+"md","step-01-init","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md","0bc3d24b7bdb160e671c8a01435b345dec20f39f8ce4a0b09e5f70ca0cbbb192"
 "md","step-01-init","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md","c730b1f23f0298853e5bf0b9007c2fc86e835fb3d53455d2068a6965d1192f49"
-"md","step-01-mode-detection","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md","e3c252531a413576dfcb2e214ba4f92b4468b8e50c9fbc569674deff26d21175"
-"md","step-01-understand","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-01-understand.md","e8a43cf798df32dc60acd9a2ef1d4a3c2e97f0cf66dd9df553dc7a1c80d7b0cc"
-"md","step-01-validate-prerequisites","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md","88c7bfa5579bfdc38b2d855b3d2c03898bf47b11b9f4fae52fb494e2ce163450"
-"md","step-01b-continue","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md","bb32e3636bdd19f51e5145b32f766325f48ad347358f74476f8d6c8b7c96c8ef"
+"md","step-01-mode-detection","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md","917bdb37befeac6f63545c00ef6bd8c02cdd813425bdc003fc3cad113f7d5f78"
+"md","step-01-understand","bmm","bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md","dd4ce701f0520d589efbb7508deac2d98e59f250d93f8c192104acdc160e02b3"
+"md","step-01-validate-prerequisites","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md","0280ea7d2fd5555837f10c1c85c2f729012460309fad414fdc18af28e4043584"
+"md","step-01b-continue","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md","3fff493106b23ba52c21a5387e4804f7eacc8d8991d25dbcf59df5e93334c080"
 "md","step-01b-continue","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md","fde4bf8fa3a6d3230d20cb23e71cbc8e2db1cd2b30b693e13d0b3184bc6bb9a6"
-"md","step-01b-continue","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md","7857264692e4fe515b05d4ddc9ea39d66a61c3e2715035cdd0d584170bf38ffe"
+"md","step-01b-continue","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md","062faef1d0b4ca8663040451260823a89d7b733bba0168d0e8105181ec1a1815"
 "md","step-01b-continue","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md","c6cc389b49682a8835382d477d803a75acbad01b24da1b7074ce140d82b278dc"
 "md","step-02-context","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md","e69de083257a5dd84083cadcb55deeefb1cdfdee90f52eb3bfbaadbe6602a627"
-"md","step-02-context-gathering","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md","8de307668f74892657c2b09f828a3b626b62a479fb72c0280c68ed0e25803896"
+"md","step-02-context-gathering","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md","d87578f75729e37e979dcedc09de0b9aa56d2eb16710924339aadc9726a8cefc"
 "md","step-02-customer-behavior","bmm","bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md","ca77a54143c2df684cf859e10cea48c6ea1ce8e297068a0f0f26ee63d3170c1e"
 "md","step-02-customer-insights","bmm","bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md","de7391755e7c8386096ed2383c24917dd6cab234843b34004e230d6d3d0e3796"
-"md","step-02-design-epics","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md","1a1c52515a53c12a274d1d5e02ec67c095ea93453259abeca989b9bfd860805c"
+"md","step-02-design-epics","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md","8019215f02a75796b8eb576e125fe4778a9a4bbf4bebdc8919ee83fdfab965cb"
 "md","step-02-discovery","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md","021d197dfdf071548adf5cfb80fb3b638b5a5d70889b926de221e1e61cea4137"
-"md","step-02-discovery","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md","b89616175bbdce5fa3dd41dcc31b3b50ad465d35836e62a9ead984b6d604d5c2"
+"md","step-02-discovery","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md","c48f01b5bdfbd912c9393a8edf2d0f9ae64990d41cd8dee142ed92f56fa43224"
 "md","step-02-domain-analysis","bmm","bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md","385a288d9bbb0adf050bcce4da4dad198a9151822f9766900404636f2b0c7f9d"
 "md","step-02-generate","bmm","bmm/workflows/generate-project-context/steps/step-02-generate.md","0fff27dab748b4600d02d2fb083513fa4a4e061ed66828b633f7998fcf8257e1"
-"md","step-02-investigate","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-02-investigate.md","3a93724c59af5e8e9da88bf66ece6d72e64cd42ebe6897340fdf2e34191de06c"
-"md","step-02-prd-analysis","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md","37707ccd23bc4e3ff4a888eb4a04722c052518c91fcb83d3d58045595711fdaf"
+"md","step-02-investigate","bmm","bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md","6b8a84f09a741cf655bb4f15f3be47ada7e28f11fceab8031c1b58a132b59fc9"
+"md","step-02-prd-analysis","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md","f8892391bbfaa5fb0166af02210c6ea1b62021837f853a9f1da6f30b942b1620"
 "md","step-02-technical-overview","bmm","bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md","9c7582241038b16280cddce86f2943216541275daf0a935dcab78f362904b305"
-"md","step-02-vision","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md","ac3362c75bd8c3fe42ce3ddd433f3ce58b4a1b466bc056298827f87c7ba274f8"
+"md","step-02-vision","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md","3e650bcdff6a11a616d048741804c430c66db6378fadd25df331445a093e4392"
 "md","step-03-competitive-landscape","bmm","bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md","f10aa088ba00c59491507f6519fb314139f8be6807958bb5fd1b66bff2267749"
 "md","step-03-complete","bmm","bmm/workflows/generate-project-context/steps/step-03-complete.md","cf8d1d1904aeddaddb043c3c365d026cd238891cd702c2b78bae032a8e08ae17"
 "md","step-03-core-experience","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md","39f0904b2724d51ba880b2f22deefc00631441669a0c9a8ac0565a8ada3464b2"
-"md","step-03-create-stories","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md","885dd4bceaed6203f5c00fb9484ab377ee1983b0a487970591472b9ec43a1634"
+"md","step-03-create-stories","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md","d6cf9dc92335cb9aaf5bca3eb05e5534da84cc0cccee771275c0e2f584f48890"
 "md","step-03-customer-pain-points","bmm","bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md","ce7394a73a7d3dd627280a8bef0ed04c11e4036275acc4b50c666fd1d84172c4"
-"md","step-03-epic-coverage-validation","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md","f58af59ecbcbed1a83eea3984c550cf78484ef803d7eb80bbf7e0980e45cdf44"
-"md","step-03-execute","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md","dc340c8c7ac0819ae8442c3838e0ea922656ad7967ea110a8bf0ff80972d570a"
-"md","step-03-generate","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-03-generate.md","d2f998ae3efd33468d90825dc54766eefbe3b4b38fba9e95166fe42d7002db82"
+"md","step-03-epic-coverage-validation","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md","2249eec5c324153e2f095b63b7d8e2418f5d567f914272e6c66d5aff393702aa"
+"md","step-03-execute","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md","9e77223fdc698a0648b54805f761f2791faea2db04f77201ec673bdea3e3d17f"
+"md","step-03-generate","bmm","bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md","a5ac3654c7be1772c50050c3627613aba075fcc2ce89cb735f49cd4f6b717e89"
 "md","step-03-integration-patterns","bmm","bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md","005d517a2f962e2172e26b23d10d5e6684c7736c0d3982e27b2e72d905814ad9"
 "md","step-03-starter","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md","7dd61ab909d236da0caf59954dced5468657bcb27f859d1d92265e59b3616c28"
-"md","step-03-success","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md","07de6f3650dfda068d6f8155e5c4dc0a18ac40fb19f8c46ba54b39cf3f911067"
-"md","step-03-users","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md","e148ee42c8cbb52b11fc9c984cb922c46bd1cb197de02445e02548995d04c390"
+"md","step-03-success","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md","a73c7be31a763b402b2bbb0c414048332b779755651a2a6b4d8305e5dc79cbb3"
+"md","step-03-users","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md","8d3754116582808e001dd5e8ed08fc71ed22a1e4d29b1313ddc339b085c2845c"
 "md","step-04-architectural-patterns","bmm","bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md","5ab115b67221be4182f88204b17578697136d8c11b7af21d91012d33ff84aafb"
 "md","step-04-customer-decisions","bmm","bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md","17dde68d655f7c66b47ed59088c841d28d206ee02137388534b141d9a8465cf9"
 "md","step-04-decisions","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md","dc83242891d4f6bd5cba6e87bd749378294afdf88af17851e488273893440a84"
 "md","step-04-emotional-response","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md","a2db9d24cdfc88aeb28a92ed236df940657842291a7d70e1616b59fbfd1c4e19"
-"md","step-04-final-validation","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md","c56c5289d65f34c1c22c5a9a09084e041ee445b341ebd6380ca9a2885f225344"
-"md","step-04-journeys","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md","93fb356f0c9edd02b5d1ad475fb629e6b3b875b6ea276b02059b66ade68c0d30"
-"md","step-04-metrics","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md","5c8c689267fd158a8c8e07d76041f56003aa58c19ed2649deef780a8f97722aa"
+"md","step-04-final-validation","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md","b524965a45f3b0f8d4d7e5e53eac9a70ec993ee17052d8626c4b860fa1482e42"
+"md","step-04-journeys","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md","7c614d6555ff448574e4953a471e8c080c428c60a9d57105e9cd80740f225f90"
+"md","step-04-metrics","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md","5cee77a43d45695d8a3cf5f0584c8121c304b28648dee0ba703dfb05496d3868"
 "md","step-04-regulatory-focus","bmm","bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md","d22035529efe91993e698b4ebf297bf2e7593eb41d185a661c357a8afc08977b"
-"md","step-04-review","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-04-review.md","7571c5694a9f04ea29fbdb7ad83d6a6c9129c95ace4211e74e67ca4216acc4ff"
-"md","step-04-self-check","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md","444c02d8f57cd528729c51d77abf51ca8918ac5c65f3dcf269b21784f5f6920c"
-"md","step-04-ux-alignment","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md","e673765ad05f4f2dc70a49c17124d7dd6f92a7a481314a6093f82cda0c61a2b5"
-"md","step-05-adversarial-review","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md","38d6f43af07f51d67d6abd5d88de027d5703033ed6b7fe2400069f5fc31d4237"
+"md","step-04-review","bmm","bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md","8fbb6bb7ae9be378af56c52fc73c436b0260cc9161a31d3dc8e135a35eab7ac8"
+"md","step-04-self-check","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md","8394655526fd40a140044795cbf4af243cda939c225a8e12ccc94c5a73c87e43"
+"md","step-04-ux-alignment","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md","2193be07720901b61ebc7ec80590f2ff07fcb9d4a0473741caaf9a581bf40ba7"
+"md","step-05-adversarial-review","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md","b57ccd480b1c5385b8c236c5f071f33b1886fcb1a26c85217c3e1c6225765077"
 "md","step-05-competitive-analysis","bmm","bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md","ff6f606a80ffaf09aa325e38a4ceb321b97019e6542241b2ed4e8eb38b35efa8"
-"md","step-05-domain","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md","a18c274f10f3116e5b3e88e3133760ab4374587e4c9c6167e8eea4b84589298c"
-"md","step-05-epic-quality-review","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md","4014a0e0a7b725474f16250a8f19745e188d51c4f4dbef549de0940eb428841d"
+"md","step-05-domain","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md","2702da3aecf431056ba663af7aec02a48857bff418bcb5d9e8a853344863d16d"
+"md","step-05-epic-quality-review","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md","8174d9579ce7300782ec55e4b35ca90131d5baaae02113b3fab0975094e2b645"
 "md","step-05-implementation-research","bmm","bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md","55ae5ab81295c6d6e3694c1b89472abcd5cd562cf55a2b5fffdd167e15bee82b"
 "md","step-05-inspiration","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md","7f8d6c50c3128d7f4cb5dbf92ed9b0b0aa2ce393649f1506f5996bd51e3a5604"
 "md","step-05-patterns","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md","8660291477a35ba5a7aecc73fbb9f5fa85de2a4245ae9dd2644f5e2f64a66d30"
-"md","step-05-scope","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md","9e2d58633f621d437fe59a3fd8d10f6c190b85a6dcf1dbe9167d15f45585af51"
+"md","step-05-scope","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md","7e292adebdb76b9828c2fbc3cbfb40d943e97e58363c88bf73ca40a27e59733d"
 "md","step-05-technical-trends","bmm","bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md","fd6c577010171679f630805eb76e09daf823c2b9770eb716986d01f351ce1fb4"
-"md","step-06-complete","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md","488ea54b7825e5a458a58c0c3104bf5dc56f5e401c805df954a0bfc363194f31"
+"md","step-06-complete","bmm","bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md","13027cf00352ac4ef8cb7f346a3e70d820293a7cffc3407fec356b7052481615"
 "md","step-06-design-system","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md","6bb2666aeb114708321e2f730431eb17d2c08c78d57d9cc6b32cb11402aa8472"
-"md","step-06-final-assessment","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md","67d68de4bdaaa9e814d15d30c192da7301339e851224ef562077b2fb39c7d869"
-"md","step-06-innovation","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md","faa4b7e1b74e843d167ef0ea16dab475ea51e57b654337ec7a1ba90d85e8a44a"
+"md","step-06-final-assessment","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md","b86d8754f457e0f0f1d22875a37c74fff8eaec51e11d5df227f7675bcdb8ef0d"
+"md","step-06-innovation","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md","5acd0d7b932b99d2aefa502eabaf71d7c5ec5b3c9135a88ab9ac9952e6f513a5"
 "md","step-06-research-completion","bmm","bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md","30d5e14f39df193ebce952dfed2bd4009d68fe844e28ad3a29f5667382ebc6d2"
 "md","step-06-research-synthesis","bmm","bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md","4c7727b8d3c6272c1b2b84ea58a67fc86cafab3472c0caf54e8b8cee3fa411fc"
 "md","step-06-research-synthesis","bmm","bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md","5df66bbeecd345e829f06c4eb5bdecd572ca46aec8927bda8b97dbd5f5a34d6c"
-"md","step-06-resolve-findings","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md","ad5d90b4f753fec9d2ba6065cbf4e5fa6ef07b013504a573a0edea5dcc16e180"
+"md","step-06-resolve-findings","bmm","bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md","98502e2e27199a07eaa531b27df6ee297d96b6566e008485258df5c983d2960a"
 "md","step-06-structure","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md","8ebb95adc203b83e3329b32bcd19e4d65faa8e68af7255374f40f0cbf4d91f2b"
 "md","step-07-defining-experience","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md","10db4f974747602d97a719542c0cd31aa7500b035fba5fddf1777949f76928d6"
-"md","step-07-project-type","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md","260d5d3738ddc60952f6a04a1370e59e2bf2c596b926295466244278952becd1"
+"md","step-07-project-type","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md","2b7d0084b219059baa44ebf11755192676a632f26ced54fc65e49015145e6e28"
 "md","step-07-validation","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md","0aaa043da24c0c9558c32417c5ba76ad898d4300ca114a8be3f77fabf638c2e2"
 "md","step-08-complete","bmm","bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md","d2bb24dedc8ca431a1dc766033069694b7e1e7bef146d9d1d1d10bf2555a02cd"
-"md","step-08-scoping","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md","535949aab670b628807b08b9ab7627b8b62d8fdad7300d616101245e54920f61"
+"md","step-08-scoping","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md","989a3d6ef8e54e4952d71f716b900c053fae2a60930bdd734f77fb81965ba0b8"
 "md","step-08-visual-foundation","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md","114ae7e866eb41ec3ff0c573ba142ee6641e30d91a656e5069930fe3bb9786ae"
 "md","step-09-design-directions","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md","73933038a7f1c172716e0688c36275316d1671e4bca39d1050da7b9b475f5211"
-"md","step-09-functional","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md","fb3acbc2b82de5c70e8d7e1a4475e3254d1e8bcb242da88d618904b66f57edad"
-"md","step-10-nonfunctional","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md","92fde9dc4f198fb551be6389c75b6e09e43c840ce55a635d37202830b4e38718"
+"md","step-09-functional","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md","3dca98619c2d3671192d1259b05b95fc7b9f21721ab5ad24b3b936b9ea46e479"
+"md","step-10-nonfunctional","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md","2bb1e6855aa1f559e5edcbc0277b227beb5c57efbedff3b23607f17827f00ac5"
 "md","step-10-user-journeys","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md","7305843b730128445610cc0ff28fc00b952ec361672690d93987978650e077c3"
-"md","step-11-complete","bmm","bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md","b9a9053f1e5de3d583aa729639731fc26b7ce6a43f6a111582faa4caea96593a"
 "md","step-11-component-strategy","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md","e4a80fc9d350ce1e84b0d4f0a24abd274f2732095fb127af0dde3bc62f786ad1"
+"md","step-11-polish","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md","0bfe648cf801b2f135bf755f040e574af35a0531f462269daf53b7495a481031"
+"md","step-12-complete","bmm","bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md","a04e0a05370e3f96cf00f6d8563470ceab494ce0024e12052b1ad1e2a9851a0b"
 "md","step-12-ux-patterns","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md","4a0b51d278ffbd012d2c9c574adcb081035994be2a055cc0bbf1e348a766cb4a"
 "md","step-13-responsive-accessibility","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md","c556f2dc3644142f8136237fb422a6aac699ca97812c9b73a988cc6db7915444"
 "md","step-14-complete","bmm","bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md","8b05a20310b14bcbc743d990570b40a6f48f5ab10cbc03a723aa841337550fbf"
-"md","tech-spec-template","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/tech-spec-template.md","6e0ac4991508fec75d33bbe36197e1576d7b2a1ea7ceba656d616e7d7dadcf03"
+"md","step-e-01-discovery","bmm","bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md","440f248ef92e0d495282d51cf27cff9337eaf4a56ff44f421d33a29d7b512432"
+"md","step-e-01b-legacy-conversion","bmm","bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md","585d3a593d3dc8d4ed393db67d5da99bb9ce786a9bba304eae02cd3aa7063198"
+"md","step-e-02-review","bmm","bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md","c3b370ffcfb6b33f64dcd0ecda06a315aef3de4410662dfd1f6213226abfc16e"
+"md","step-e-03-edit","bmm","bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md","03f0f1e0577f0a9cce9cad85145caa17054026774df5c8aac66420ffeef9f783"
+"md","step-e-04-complete","bmm","bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md","847b3fd0bb91f66d6e6a51c1ebd23b92404979f2f897a83db3712976359e2c57"
+"md","step-v-01-discovery","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md","751a6dd5b9f8b249079534b810c77d4b305f19e70dff14810434f26b14604d01"
+"md","step-v-02-format-detection","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md","598096772ea4deba35ddddc45313bdc1cb7852488706c2e55cb35f3af006d8b4"
+"md","step-v-02b-parity-check","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md","38ffab17b7f25c43085c370cda220cb421f449afb92e67b7ef4fdfa130f65652"
+"md","step-v-03-density-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md","10b907d4a3feee5673b849a9974e3b14ae73ba949eee2a9be96bb398dad6a958"
+"md","step-v-04-brief-coverage-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md","17af6a86f05a518c59fff198dd76859f15e5b20c785710cfe6b8c21701dcf970"
+"md","step-v-05-measurability-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md","ca27b9b10e1dfd46ee256f636a1eda24d2ecebf6a5cb248a70213fb6eb5d916b"
+"md","step-v-06-traceability-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md","402de0099463bc409e9d0508f012699ddab8edec7cce3265a4f5a665bef24407"
+"md","step-v-07-implementation-leakage-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md","a7ec232fe20c3ce2000d7ec6eac06b510b7a4473d3a26bcab655a81450786cae"
+"md","step-v-08-domain-compliance-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md","65b8b041745b9073dcba03cd355d3a4ff9582776b8840a7974ba0e0a445e9b1f"
+"md","step-v-09-project-type-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md","2ed139bc09c9f03d6a51c0c5736a80b52d618442bd7d061f177449fe418f4a73"
+"md","step-v-10-smart-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md","29debb6eeb0125ca6cdf502520aa725bdd96df2623874d207e1a5b331fb0de81"
+"md","step-v-11-holistic-quality-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md","9b78dae12906546f96b150aa5c888a2da70cb775350ad3964d15ae6065ff5391"
+"md","step-v-12-completeness-validation","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md","cbbd8c9182a52e8862579713feb02fa2659914c36705e70f27fc3fafcc642d6a"
+"md","step-v-13-report-complete","bmm","bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md","b7a47eba1cdeb6116c11118447c6d228011a9cff0788ec70ac2fd8d2e89d12a1"
+"md","tech-spec-template","bmm","bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md","6e0ac4991508fec75d33bbe36197e1576d7b2a1ea7ceba656d616e7d7dadcf03"
 "md","template","bmm","bmm/workflows/4-implementation/create-story/template.md","29ba697368d77e88e88d0e7ac78caf7a78785a7dcfc291082aa96a62948afb67"
 "md","test-design-template","bmm","bmm/workflows/testarch/test-design/test-design-template.md","be2c766858684f5afce7c140f65d6d6e36395433938a866dea09da252a723822"
 "md","test-healing-patterns","bmm","bmm/testarch/knowledge/test-healing-patterns.md","b44f7db1ebb1c20ca4ef02d12cae95f692876aee02689605d4b15fe728d28fdf"
@@ -189,21 +211,22 @@ type,name,module,path,hash
 "md","timing-debugging","bmm","bmm/testarch/knowledge/timing-debugging.md","c4c87539bbd3fd961369bb1d7066135d18c6aad7ecd70256ab5ec3b26a8777d9"
 "md","trace-template","bmm","bmm/workflows/testarch/trace/trace-template.md","148b715e7b257f86bc9d70b8e51b575e31d193420bdf135b32dd7bd3132762f3"
 "md","ux-design-template","bmm","bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md","ffa4b89376cd9db6faab682710b7ce755990b1197a8b3e16b17748656d1fca6a"
+"md","validation-report-prd-workflow","bmm","bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md","e71daa9a0bb717d669e29816f4671c66c3df7e3f295d72c849d478676f125eb8"
 "md","visual-debugging","bmm","bmm/testarch/knowledge/visual-debugging.md","072a3d30ba6d22d5e628fc26a08f6e03f8b696e49d5a4445f37749ce5cd4a8a9"
 "md","workflow","bmm","bmm/workflows/1-analysis/create-product-brief/workflow.md","09f24c579989fe45ad36becafc63b5b68f14fe2f6d8dd186a9ddfb0c1f256b7b"
 "md","workflow","bmm","bmm/workflows/1-analysis/research/workflow.md","0c7043392fbe53f1669e73f1f74b851ae78e60fefbe54ed7dfbb12409a22fe10"
 "md","workflow","bmm","bmm/workflows/2-plan-workflows/create-ux-design/workflow.md","49381d214c43080b608ff5886ed34fae904f4d4b14bea4f5c2fafab326fac698"
-"md","workflow","bmm","bmm/workflows/2-plan-workflows/prd/workflow.md","6f09425df1cebfa69538a8b507ce5957513a9e84a912a10aad9bd834133fa568"
-"md","workflow","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md","0167a08dd497a50429d8259eec1ebcd669bebbf4472a3db5c352fb6791a39ce8"
+"md","workflow","bmm","bmm/workflows/2-plan-workflows/prd/workflow.md","b0499d4f00f0c35fc1666e2f1245ded3f89aa40aa44973b04ae7b5369e833997"
+"md","workflow","bmm","bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md","cb12f95b772f6aa4dd5b95a4a4fcabe9516ef5f6bf72caecc10a0ca464eb9795"
 "md","workflow","bmm","bmm/workflows/3-solutioning/create-architecture/workflow.md","c85b3ce51dcadc00c9ef98b0be7cc27b5d38ab2191ef208645b61eb3e7d078ab"
 "md","workflow","bmm","bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md","b62a6f4c85c66059f46ce875da9eb336b4272f189c506c0f77170c7623b5ed55"
-"md","workflow","bmm","bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.md","740134a67df57a818b8d76cf4c5f27090375d1698ae5be9e68c9ab8672d6b1e0"
-"md","workflow","bmm","bmm/workflows/bmad-quick-flow/quick-dev/workflow.md","c6d7306871bb29d1cd0435e2189d7d7d55ec8c4604f688b63c1c77c7d2e6d086"
+"md","workflow","bmm","bmm/workflows/bmad-quick-flow/quick-dev/workflow.md","177e859727c8c061872ad729e9f353cff46caf1ebed71a386a1ee36890949d75"
+"md","workflow","bmm","bmm/workflows/bmad-quick-flow/quick-spec/workflow.md","0c07c27b1b474b6a6e5651951e1c31d740c64350fd88c0689da30cd6d5ba3979"
 "md","workflow","bmm","bmm/workflows/generate-project-context/workflow.md","0da857be1b7fb46fc29afba22b78a8b2150b17db36db68fd254ad925a20666aa"
-"xml","instructions","bmm","bmm/workflows/4-implementation/code-review/instructions.xml","80d43803dced84f1e754d8690fb6da79e5b21a68ca8735b9c0ff709c49ac31ff"
-"xml","instructions","bmm","bmm/workflows/4-implementation/create-story/instructions.xml","713b38a3ee0def92380ca97196d3457f68b8da60b78d2e10fc366c35811691fb"
-"xml","instructions","bmm","bmm/workflows/4-implementation/dev-story/instructions.xml","d01f9b168f5ef2b4aaf7e1c2fad8146dacfa0ea845b101da80db688e1817cefb"
-"yaml","config","bmm","bmm/config.yaml","2828248a6a71d1558b851472bb9adb62ba45f636725fed52acf3c0028e941491"
+"xml","instructions","bmm","bmm/workflows/4-implementation/code-review/instructions.xml","1a6f0ae7d69a5c27b09de3efab2b205a007b466976acdeeaebf7f3abec7feb68"
+"xml","instructions","bmm","bmm/workflows/4-implementation/create-story/instructions.xml","226ba1f37ba65f35297eb31193d4e707e389a050d2fbe28a3567201a9ddd59fc"
+"xml","instructions","bmm","bmm/workflows/4-implementation/dev-story/instructions.xml","9f61f7538785903505f07531920b025a73722bcb74b0ec7672954cad9962cd9a"
+"yaml","config","bmm","bmm/config.yaml","f76b98fc01607547586be7e4894c7abb7b761b8b94c67b673a1b41c460088dde"
 "yaml","deep-dive","bmm","bmm/workflows/document-project/workflows/deep-dive.yaml","a16b5d121604ca00fffdcb04416daf518ec2671a3251b7876c4b590d25d96945"
 "yaml","enterprise-brownfield","bmm","bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml","40b7fb4d855fdd275416e225d685b4772fb0115554e160a0670b07f6fcbc62e5"
 "yaml","enterprise-greenfield","bmm","bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml","61329f48d5d446376bcf81905485c72ba53874f3a3918d5614eb0997b93295c6"
@@ -217,12 +240,12 @@ type,name,module,path,hash
 "yaml","sprint-status-template","bmm","bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml","de75fe50bd5e3f4410ccc99fcd3f5dc958733b3829af1b13b4d7b0559bbca22b"
 "yaml","team-fullstack","bmm","bmm/teams/team-fullstack.yaml","da8346b10dfad8e1164a11abeb3b0a84a1d8b5f04e01e8490a44ffca477a1b96"
 "yaml","workflow","bmm","bmm/workflows/4-implementation/code-review/workflow.yaml","8879bd2ea2da2c444eac9f4f8bf4f2d58588cdbc92aee189c04d4d926ea7b43d"
-"yaml","workflow","bmm","bmm/workflows/4-implementation/correct-course/workflow.yaml","fd61662b22f5ff1d378633b47837eb9542e433d613fbada176a9d61de15c2961"
-"yaml","workflow","bmm","bmm/workflows/4-implementation/create-story/workflow.yaml","469cdb56604b1582ac8b271f9326947c57b54af312099dfa0387d998acea2cac"
+"yaml","workflow","bmm","bmm/workflows/4-implementation/correct-course/workflow.yaml","c7b771ee3043c2622499e197147e33c77bca478a31091fae619e04cf628fef5e"
+"yaml","workflow","bmm","bmm/workflows/4-implementation/create-story/workflow.yaml","45dabb40eeacc64c550cee65886841ebdb27c6519a561f6321dc61d9a3775dd1"
 "yaml","workflow","bmm","bmm/workflows/4-implementation/dev-story/workflow.yaml","270cb47b01e5a49d497c67f2c2605b808a943daf2b34ee60bc726ff78ac217b3"
 "yaml","workflow","bmm","bmm/workflows/4-implementation/retrospective/workflow.yaml","03433aa3f0d5b4b388d31b9bee1ac5cb5ca78e15bb4d44746766784a3ba863d2"
 "yaml","workflow","bmm","bmm/workflows/4-implementation/sprint-planning/workflow.yaml","3038e7488b67303814d95ebbb0f28a225876ec2e3224fdaa914485f5369a44bf"
-"yaml","workflow","bmm","bmm/workflows/4-implementation/sprint-status/workflow.yaml","92c50c478b87cd5c339cdb38399415977f58785b4ae82f7948ba16404fa460cf"
+"yaml","workflow","bmm","bmm/workflows/4-implementation/sprint-status/workflow.yaml","d04516040d08f01f71fe31658d139ac3dad30b7ad748e959e4a9fb0a8e755858"
 "yaml","workflow","bmm","bmm/workflows/document-project/workflow.yaml","82e731ea08217480958a75304558e767654d8a8262c0ec1ed91e81afd3135ed5"
 "yaml","workflow","bmm","bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml","a845be912077a9c80fb3f3e2950c33b99139a2ae22db9c006499008ec2fa3851"
 "yaml","workflow","bmm","bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml","bac0e13f796b4a4bb2a3909ddef230f0cd1712a0163b6fe72a2966eed8fc87a9"
@@ -253,16 +276,15 @@ type,name,module,path,hash
 "md","step-02c-random-selection","core","core/workflows/brainstorming/steps/step-02c-random-selection.md","f188c260c321c7f026051fefcd267a26ee18ce2a07f64bab7f453c0c3e483316"
 "md","step-02d-progressive-flow","core","core/workflows/brainstorming/steps/step-02d-progressive-flow.md","a28c7a3edf34ceb0eea203bf7dc80f39ca04974f6d1ec243f0a088281b2e55de"
 "md","step-03-graceful-exit","core","core/workflows/party-mode/steps/step-03-graceful-exit.md","f3299f538d651b55efb6e51ddc3536a228df63f16b1e0129a830cceb8e21303f"
-"md","step-03-technique-execution","core","core/workflows/brainstorming/steps/step-03-technique-execution.md","9dbcf441402a4601721a9564ab58ca2fe77dafefee090f7d023754d2204b1d7e"
+"md","step-03-technique-execution","core","core/workflows/brainstorming/steps/step-03-technique-execution.md","f9a8ee4354fda0b9eb8fe3d30963eeebad76796cd12d9bcc72e4e7e9606b0803"
 "md","step-04-idea-organization","core","core/workflows/brainstorming/steps/step-04-idea-organization.md","a1b7a17b95bb1c06fa678f65a56a9ac2fd9655871e99b9378c6b4afa5d574050"
 "md","template","core","core/workflows/brainstorming/template.md","5c99d76963eb5fc21db96c5a68f39711dca7c6ed30e4f7d22aedee9e8bb964f9"
 "md","validate-json-instructions","core","core/resources/excalidraw/validate-json-instructions.md","0970bac93d52b4ee591a11998a02d5682e914649a40725d623489c77f7a1e449"
-"md","workflow","core","core/workflows/brainstorming/workflow.md","f6f2a280880b1cc82bb9bb320229a71df788bb0412590beb59a384e26f493c83"
+"md","workflow","core","core/workflows/brainstorming/workflow.md","4c63ca09925befb1d0641bf22107b60ca723f92d68ccf2170a9c47a821ff0956"
 "md","workflow","core","core/workflows/party-mode/workflow.md","851cbc7f57b856390be18464d38512337b52508cc634f327e4522e379c778573"
 "xml","index-docs","core","core/tasks/index-docs.xml","13ffd40ccaed0f05b35e4f22255f023e77a6926e8a2f01d071b0b91a4c942812"
 "xml","review-adversarial-general","core","core/tasks/review-adversarial-general.xml","05466fd1a0b207dd9987ba1e8674b40060025b105ba51f5b49fe852c44e51f12"
-"xml","shard-doc","core","core/tasks/shard-doc.xml","f71987855cabb46bd58a63a4fd356efb0739a272ab040dd3c8156d7f538d7caf"
-"xml","validate-workflow","core","core/tasks/validate-workflow.xml","539e6f1255efbb62538598493e4083496dc0081d3c8989c89b47d06427d98f28"
+"xml","shard-doc","core","core/tasks/shard-doc.xml","dd4c834b62f9d7fbe4970d10a9c075fe9408195b0ee4c32bbdb699227d45a808"
 "xml","workflow","core","core/tasks/workflow.xml","8f7ad9ff1d80251fa5df344ad70701605a74dcfc030c04708650f23b2606851a"
 "xml","workflow","core","core/workflows/advanced-elicitation/workflow.xml","063e6aab417f9cc67ae391b1d89ba972fc890c123f8101b7180496d413a63d81"
-"yaml","config","core","core/config.yaml","6644bb9a194bbeb84267aa477f2618db335f5f246d6497a958d64dbd08fbbc61"
+"yaml","config","core","core/config.yaml","61878330670ab58aad79c6e62176a1564fdae9bd0908d4c1628ef8fb480aba6b"

+ 3 - 3
_bmad/_config/manifest.yaml

@@ -1,7 +1,7 @@
 installation:
-  version: 6.0.0-alpha.22
-  installDate: 2026-01-07T11:38:43.922Z
-  lastUpdated: 2026-01-07T11:38:43.922Z
+  version: 6.0.0-alpha.23
+  installDate: 2026-01-16T01:30:22.804Z
+  lastUpdated: 2026-01-16T01:30:22.804Z
 modules:
   - core
   - bmm

+ 1 - 1
_bmad/_config/task-manifest.csv

@@ -1,6 +1,6 @@
 name,displayName,description,module,path,standalone
 "index-docs","Index Docs","Generates or updates an index.md of all documents in the specified directory","core","_bmad/core/tasks/index-docs.xml","true"
 "review-adversarial-general","Adversarial Review (General)","Cynically review content and produce findings","core","_bmad/core/tasks/review-adversarial-general.xml","false"
-"shard-doc","Shard Document","Splits large markdown documents into smaller, organized files based on level 2 (default) sections","core","_bmad/core/tasks/shard-doc.xml","false"
+"shard-doc","Shard Document","Splits large markdown documents into smaller, organized files based on level 2 (default) sections","core","_bmad/core/tasks/shard-doc.xml","true"
 "validate-workflow","Validate Workflow Output","Run a checklist against a document with thorough analysis and produce a validation report","core","_bmad/core/tasks/validate-workflow.xml","false"
 "workflow","Execute Workflow","Execute given workflow by loading its configuration, following instructions, and producing output","core","_bmad/core/tasks/workflow.xml","false"

+ 2 - 0
_bmad/_config/workflow-manifest.csv

@@ -33,3 +33,5 @@ name,description,module,path
 "testarch-trace","Generate requirements-to-tests traceability matrix, analyze coverage, and make quality gate decision (PASS/CONCERNS/FAIL/WAIVED)","bmm","_bmad/bmm/workflows/testarch/trace/workflow.yaml"
 "workflow-init","Initialize a new BMM project by determining level, type, and creating workflow path","bmm","_bmad/bmm/workflows/workflow-status/init/workflow.yaml"
 "workflow-status","Lightweight status checker - answers """"what should I do now?"""" for any agent. Reads YAML status file for workflow tracking. Use workflow-init for new projects.","bmm","_bmad/bmm/workflows/workflow-status/workflow.yaml"
+"prd","PRD tri-modal workflow - Create, Validate, or Edit comprehensive PRDs","bmm","_bmad/bmm/workflows/2-plan-workflows/prd/workflow.md"
+"quick-spec","Conversational spec engineering - ask questions, investigate code, produce implementation-ready tech-spec.","bmm","_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md"

+ 155 - 16
_bmad/bmm/testarch/knowledge/api-request.md

@@ -2,7 +2,7 @@
 
 ## Principle
 
-Use typed HTTP client with built-in schema validation and automatic retry for server errors. The utility handles URL resolution, header management, response parsing, and single-line response validation with proper TypeScript support.
+Use typed HTTP client with built-in schema validation and automatic retry for server errors. The utility handles URL resolution, header management, response parsing, and single-line response validation with proper TypeScript support. **Works without a browser** - ideal for pure API/service testing.
 
 ## Rationale
 
@@ -21,6 +21,7 @@ The `apiRequest` utility provides:
 - **Schema validation**: Single-line validation (JSON Schema, Zod, OpenAPI)
 - **URL resolution**: Four-tier strategy (explicit > config > Playwright > direct)
 - **TypeScript generics**: Type-safe response bodies
+- **No browser required**: Pure API testing without browser overhead
 
 ## Pattern Examples
 
@@ -60,10 +61,11 @@ test('should fetch user data', async ({ apiRequest }) => {
 
 ```typescript
 import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
+import { z } from 'zod';
 
-test('should validate response schema', async ({ apiRequest }) => {
-  // JSON Schema validation
-  const response = await apiRequest({
+// JSON Schema validation
+test('should validate response schema (JSON Schema)', async ({ apiRequest }) => {
+  const { status, body } = await apiRequest({
     method: 'GET',
     path: '/api/users/123',
     validateSchema: {
@@ -77,22 +79,25 @@ test('should validate response schema', async ({ apiRequest }) => {
     },
   });
   // Throws if schema validation fails
+  expect(status).toBe(200);
+});
 
-  // Zod schema validation
-  import { z } from 'zod';
-
-  const UserSchema = z.object({
-    id: z.string(),
-    name: z.string(),
-    email: z.string().email(),
-  });
+// Zod schema validation
+const UserSchema = z.object({
+  id: z.string(),
+  name: z.string(),
+  email: z.string().email(),
+});
 
-  const response = await apiRequest({
+test('should validate response schema (Zod)', async ({ apiRequest }) => {
+  const { status, body } = await apiRequest({
     method: 'GET',
     path: '/api/users/123',
     validateSchema: UserSchema,
   });
   // Response body is type-safe AND validated
+  expect(status).toBe(200);
+  expect(body.email).toContain('@');
 });
 ```
 
@@ -236,6 +241,136 @@ test('should poll until job completes', async ({ apiRequest, recurse }) => {
 - `recurse` polls until predicate returns true
 - Composable utilities work together seamlessly
 
+### Example 6: Microservice Testing (Multiple Services)
+
+**Context**: Test interactions between microservices without a browser.
+
+**Implementation**:
+
+```typescript
+import { test, expect } from '@seontechnologies/playwright-utils/fixtures';
+
+const USER_SERVICE = process.env.USER_SERVICE_URL || 'http://localhost:3001';
+const ORDER_SERVICE = process.env.ORDER_SERVICE_URL || 'http://localhost:3002';
+
+test.describe('Microservice Integration', () => {
+  test('should validate cross-service user lookup', async ({ apiRequest }) => {
+    // Create user in user-service
+    const { body: user } = await apiRequest({
+      method: 'POST',
+      path: '/api/users',
+      baseUrl: USER_SERVICE,
+      body: { name: 'Test User', email: 'test@example.com' },
+    });
+
+    // Create order in order-service (validates user via user-service)
+    const { status, body: order } = await apiRequest({
+      method: 'POST',
+      path: '/api/orders',
+      baseUrl: ORDER_SERVICE,
+      body: {
+        userId: user.id,
+        items: [{ productId: 'prod-1', quantity: 2 }],
+      },
+    });
+
+    expect(status).toBe(201);
+    expect(order.userId).toBe(user.id);
+  });
+
+  test('should reject order for invalid user', async ({ apiRequest }) => {
+    const { status, body } = await apiRequest({
+      method: 'POST',
+      path: '/api/orders',
+      baseUrl: ORDER_SERVICE,
+      body: {
+        userId: 'non-existent-user',
+        items: [{ productId: 'prod-1', quantity: 1 }],
+      },
+    });
+
+    expect(status).toBe(400);
+    expect(body.code).toBe('INVALID_USER');
+  });
+});
+```
+
+**Key Points**:
+
+- Test multiple services without browser
+- Use `baseUrl` to target different services
+- Validate cross-service communication
+- Pure API testing - fast and reliable
+
+### Example 7: GraphQL API Testing
+
+**Context**: Test GraphQL endpoints with queries and mutations.
+
+**Implementation**:
+
+```typescript
+test.describe('GraphQL API', () => {
+  const GRAPHQL_ENDPOINT = '/graphql';
+
+  test('should query users via GraphQL', async ({ apiRequest }) => {
+    const query = `
+      query GetUsers($limit: Int) {
+        users(limit: $limit) {
+          id
+          name
+          email
+        }
+      }
+    `;
+
+    const { status, body } = await apiRequest({
+      method: 'POST',
+      path: GRAPHQL_ENDPOINT,
+      body: {
+        query,
+        variables: { limit: 10 },
+      },
+    });
+
+    expect(status).toBe(200);
+    expect(body.errors).toBeUndefined();
+    expect(body.data.users).toHaveLength(10);
+  });
+
+  test('should create user via mutation', async ({ apiRequest }) => {
+    const mutation = `
+      mutation CreateUser($input: CreateUserInput!) {
+        createUser(input: $input) {
+          id
+          name
+        }
+      }
+    `;
+
+    const { status, body } = await apiRequest({
+      method: 'POST',
+      path: GRAPHQL_ENDPOINT,
+      body: {
+        query: mutation,
+        variables: {
+          input: { name: 'GraphQL User', email: 'gql@example.com' },
+        },
+      },
+    });
+
+    expect(status).toBe(200);
+    expect(body.data.createUser.id).toBeDefined();
+  });
+});
+```
+
+**Key Points**:
+
+- GraphQL via POST request
+- Variables in request body
+- Check `body.errors` for GraphQL errors (not status code)
+- Works for queries and mutations
+
 ## Comparison with Vanilla Playwright
 
 | Vanilla Playwright                             | playwright-utils apiRequest                                                        |
@@ -251,11 +386,13 @@ test('should poll until job completes', async ({ apiRequest, recurse }) => {
 
 **Use apiRequest for:**
 
-- ✅ API endpoint testing
-- ✅ Background API calls in UI tests
+- ✅ Pure API/service testing (no browser needed)
+- ✅ Microservice integration testing
+- ✅ GraphQL API testing
 - ✅ Schema validation needs
 - ✅ Tests requiring retry logic
-- ✅ Typed API responses
+- ✅ Background API calls in UI tests
+- ✅ Contract testing support
 
 **Stick with vanilla Playwright for:**
 
@@ -265,11 +402,13 @@ test('should poll until job completes', async ({ apiRequest, recurse }) => {
 
 ## Related Fragments
 
+- `api-testing-patterns.md` - Comprehensive pure API testing patterns
 - `overview.md` - Installation and design principles
 - `auth-session.md` - Authentication token management
 - `recurse.md` - Polling for async operations
 - `fixtures-composition.md` - Combining utilities with mergeTests
 - `log.md` - Logging API requests
+- `contract-testing.md` - Pact contract testing
 
 ## Anti-Patterns
 

+ 197 - 1
_bmad/bmm/testarch/knowledge/auth-session.md

@@ -2,7 +2,7 @@
 
 ## Principle
 
-Persist authentication tokens to disk and reuse across test runs. Support multiple user identifiers, ephemeral authentication, and worker-specific accounts for parallel execution. Fetch tokens once, use everywhere.
+Persist authentication tokens to disk and reuse across test runs. Support multiple user identifiers, ephemeral authentication, and worker-specific accounts for parallel execution. Fetch tokens once, use everywhere. **Works for both API-only tests and browser tests.**
 
 ## Rationale
 
@@ -22,6 +22,7 @@ The `auth-session` utility provides:
 - **Worker-specific accounts**: Parallel execution with isolated user accounts
 - **Automatic token management**: Checks validity, renews if expired
 - **Flexible provider pattern**: Adapt to any auth system (OAuth2, JWT, custom)
+- **API-first design**: Get tokens for API tests without browser overhead
 
 ## Pattern Examples
 
@@ -244,6 +245,200 @@ test('parallel test 2', async ({ page }) => {
 - Token management automatic per worker
 - Scales to any number of workers
 
+### Example 6: Pure API Authentication (No Browser)
+
+**Context**: Get auth tokens for API-only tests using auth-session disk persistence.
+
+**Implementation**:
+
+```typescript
+// Step 1: Create API-only auth provider (no browser needed)
+// playwright/support/api-auth-provider.ts
+import { type AuthProvider } from '@seontechnologies/playwright-utils/auth-session';
+
+const apiAuthProvider: AuthProvider = {
+  getEnvironment: (options) => options.environment || 'local',
+  getUserIdentifier: (options) => options.userIdentifier || 'api-user',
+
+  extractToken: (storageState) => {
+    // Token stored in localStorage format for disk persistence
+    const tokenEntry = storageState.origins?.[0]?.localStorage?.find(
+      (item) => item.name === 'auth_token'
+    );
+    return tokenEntry?.value;
+  },
+
+  isTokenExpired: (storageState) => {
+    const expiryEntry = storageState.origins?.[0]?.localStorage?.find(
+      (item) => item.name === 'token_expiry'
+    );
+    if (!expiryEntry) return true;
+    return Date.now() > parseInt(expiryEntry.value, 10);
+  },
+
+  manageAuthToken: async (request, options) => {
+    const email = process.env.TEST_USER_EMAIL;
+    const password = process.env.TEST_USER_PASSWORD;
+
+    if (!email || !password) {
+      throw new Error('TEST_USER_EMAIL and TEST_USER_PASSWORD must be set');
+    }
+
+    // Pure API login - no browser!
+    const response = await request.post('/api/auth/login', {
+      data: { email, password },
+    });
+
+    if (!response.ok()) {
+      throw new Error(`Auth failed: ${response.status()}`);
+    }
+
+    const { token, expiresIn } = await response.json();
+    const expiryTime = Date.now() + expiresIn * 1000;
+
+    // Return storage state format for disk persistence
+    return {
+      cookies: [],
+      origins: [
+        {
+          origin: process.env.API_BASE_URL || 'http://localhost:3000',
+          localStorage: [
+            { name: 'auth_token', value: token },
+            { name: 'token_expiry', value: String(expiryTime) },
+          ],
+        },
+      ],
+    };
+  },
+};
+
+export default apiAuthProvider;
+
+// Step 2: Create auth fixture
+// playwright/support/fixtures.ts
+import { test as base } from '@playwright/test';
+import { createAuthFixtures, setAuthProvider } from '@seontechnologies/playwright-utils/auth-session';
+import apiAuthProvider from './api-auth-provider';
+
+setAuthProvider(apiAuthProvider);
+
+export const test = base.extend(createAuthFixtures());
+
+// Step 3: Use in tests - token persisted to disk!
+// tests/api/authenticated-api.spec.ts
+import { test } from '../support/fixtures';
+import { expect } from '@playwright/test';
+
+test('should access protected endpoint', async ({ authToken, apiRequest }) => {
+  // authToken is automatically loaded from disk or fetched if expired
+  const { status, body } = await apiRequest({
+    method: 'GET',
+    path: '/api/me',
+    headers: { Authorization: `Bearer ${authToken}` },
+  });
+
+  expect(status).toBe(200);
+});
+
+test('should create resource with auth', async ({ authToken, apiRequest }) => {
+  const { status, body } = await apiRequest({
+    method: 'POST',
+    path: '/api/orders',
+    headers: { Authorization: `Bearer ${authToken}` },
+    body: { items: [{ productId: 'prod-1', quantity: 2 }] },
+  });
+
+  expect(status).toBe(201);
+  expect(body.id).toBeDefined();
+});
+```
+
+**Key Points**:
+
+- Token persisted to disk (not in-memory) - survives test reruns
+- Provider fetches token once, reuses until expired
+- Pure API authentication - no browser context needed
+- `authToken` fixture handles disk read/write automatically
+- Environment variables validated with clear error message
+
+### Example 7: Service-to-Service Authentication
+
+**Context**: Test microservice authentication patterns (API keys, service tokens) with proper environment validation.
+
+**Implementation**:
+
+```typescript
+// tests/api/service-auth.spec.ts
+import { test as base, expect } from '@playwright/test';
+import { test as apiFixture } from '@seontechnologies/playwright-utils/api-request/fixtures';
+import { mergeTests } from '@playwright/test';
+
+// Validate environment variables at module load
+const SERVICE_API_KEY = process.env.SERVICE_API_KEY;
+const INTERNAL_SERVICE_URL = process.env.INTERNAL_SERVICE_URL;
+
+if (!SERVICE_API_KEY) {
+  throw new Error('SERVICE_API_KEY environment variable is required');
+}
+if (!INTERNAL_SERVICE_URL) {
+  throw new Error('INTERNAL_SERVICE_URL environment variable is required');
+}
+
+const test = mergeTests(base, apiFixture);
+
+test.describe('Service-to-Service Auth', () => {
+  test('should authenticate with API key', async ({ apiRequest }) => {
+    const { status, body } = await apiRequest({
+      method: 'GET',
+      path: '/internal/health',
+      baseUrl: INTERNAL_SERVICE_URL,
+      headers: { 'X-API-Key': SERVICE_API_KEY },
+    });
+
+    expect(status).toBe(200);
+    expect(body.status).toBe('healthy');
+  });
+
+  test('should reject invalid API key', async ({ apiRequest }) => {
+    const { status, body } = await apiRequest({
+      method: 'GET',
+      path: '/internal/health',
+      baseUrl: INTERNAL_SERVICE_URL,
+      headers: { 'X-API-Key': 'invalid-key' },
+    });
+
+    expect(status).toBe(401);
+    expect(body.code).toBe('INVALID_API_KEY');
+  });
+
+  test('should call downstream service with propagated auth', async ({ apiRequest }) => {
+    const { status, body } = await apiRequest({
+      method: 'POST',
+      path: '/internal/aggregate-data',
+      baseUrl: INTERNAL_SERVICE_URL,
+      headers: {
+        'X-API-Key': SERVICE_API_KEY,
+        'X-Request-ID': `test-${Date.now()}`,
+      },
+      body: { sources: ['users', 'orders', 'inventory'] },
+    });
+
+    expect(status).toBe(200);
+    expect(body.aggregatedFrom).toHaveLength(3);
+  });
+});
+```
+
+**Key Points**:
+
+- Environment variables validated at module load with clear errors
+- API key authentication (simpler than OAuth - no disk persistence needed)
+- Test internal/service endpoints
+- Validate auth rejection scenarios
+- Correlation ID for request tracing
+
+> **Note**: API keys are typically static secrets that don't expire, so disk persistence (auth-session) isn't needed. For rotating service tokens, use the auth-session provider pattern from Example 6.
+
 ## Custom Auth Provider Pattern
 
 **Context**: Adapt auth-session to your authentication system (OAuth2, JWT, SAML, custom).
@@ -310,6 +505,7 @@ test('authenticated API call', async ({ apiRequest, authToken }) => {
 
 ## Related Fragments
 
+- `api-testing-patterns.md` - Pure API testing patterns (no browser)
 - `overview.md` - Installation and fixture composition
 - `api-request.md` - Authenticated API requests
 - `fixtures-composition.md` - Merging auth with other utilities

+ 257 - 54
_bmad/bmm/testarch/knowledge/file-utils.md

@@ -22,6 +22,16 @@ The `file-utils` module provides:
 - **Validation helpers**: Row count, header checks, content validation
 - **Format support**: Multiple sheet support (XLSX), text extraction (PDF), archive extraction (ZIP)
 
+## Why Use This Instead of Vanilla Playwright?
+
+| Vanilla Playwright                          | File Utils                                       |
+| ------------------------------------------- | ------------------------------------------------ |
+| ~80 lines per CSV flow (download + parse)   | ~10 lines end-to-end                             |
+| Manual event orchestration for downloads    | Encapsulated in `handleDownload()`               |
+| Manual path handling and `saveAs`           | Returns a ready-to-use file path                 |
+| Manual existence checks and error handling  | Centralized in one place via utility patterns    |
+| Manual CSV parsing config (headers, typing) | `readCSV()` returns `{ data, headers }` directly |
+
 ## Pattern Examples
 
 ### Example 1: UI-Triggered CSV Download
@@ -40,20 +50,18 @@ test('should download and validate CSV', async ({ page }) => {
   const downloadPath = await handleDownload({
     page,
     downloadDir: DOWNLOAD_DIR,
-    trigger: () => page.click('[data-testid="export-csv"]'),
+    trigger: () => page.getByTestId('download-button-text/csv').click(),
   });
 
-  const { content } = await readCSV({ filePath: downloadPath });
+  const csvResult = await readCSV({ filePath: downloadPath });
 
-  // Validate headers
-  expect(content.headers).toEqual(['ID', 'Name', 'Email', 'Role']);
-
-  // Validate data
-  expect(content.data).toHaveLength(10);
-  expect(content.data[0]).toMatchObject({
+  // Access parsed data and headers
+  const { data, headers } = csvResult.content;
+  expect(headers).toEqual(['ID', 'Name', 'Email']);
+  expect(data[0]).toMatchObject({
     ID: expect.any(String),
     Name: expect.any(String),
-    Email: expect.stringMatching(/@/),
+    Email: expect.any(String),
   });
 });
 ```
@@ -81,25 +89,27 @@ test('should read multi-sheet XLSX', async () => {
     trigger: () => page.click('[data-testid="export-xlsx"]'),
   });
 
-  const { content } = await readXLSX({ filePath: downloadPath });
+  const xlsxResult = await readXLSX({ filePath: downloadPath });
 
-  // Access specific sheets
-  const summarySheet = content.sheets.find((s) => s.name === 'Summary');
-  const detailsSheet = content.sheets.find((s) => s.name === 'Details');
+  // Verify worksheet structure
+  expect(xlsxResult.content.worksheets.length).toBeGreaterThan(0);
+  const worksheet = xlsxResult.content.worksheets[0];
+  expect(worksheet).toBeDefined();
+  expect(worksheet).toHaveProperty('name');
 
-  // Validate summary
-  expect(summarySheet.data).toHaveLength(1);
-  expect(summarySheet.data[0].TotalRecords).toBe('150');
+  // Access sheet data
+  const sheetData = worksheet?.data;
+  expect(Array.isArray(sheetData)).toBe(true);
 
-  // Validate details
-  expect(detailsSheet.data).toHaveLength(150);
-  expect(detailsSheet.headers).toContain('TransactionID');
+  // Use type assertion for type safety
+  const firstRow = sheetData![0] as Record<string, unknown>;
+  expect(firstRow).toHaveProperty('id');
 });
 ```
 
 **Key Points**:
 
-- `sheets` array with `name` and `data` properties
+- `worksheets` array with `name` and `data` properties
 - Access sheets by name
 - Each sheet has its own headers and data
 - Type-safe sheet iteration
@@ -117,26 +127,48 @@ test('should validate PDF report', async () => {
   const downloadPath = await handleDownload({
     page,
     downloadDir: DOWNLOAD_DIR,
-    trigger: () => page.click('[data-testid="download-report"]'),
+    trigger: () => page.getByTestId('download-button-Text-based PDF Document').click(),
   });
 
-  const { content } = await readPDF({ filePath: downloadPath });
+  const pdfResult = await readPDF({ filePath: downloadPath });
 
-  // content.text is extracted text from all pages
-  expect(content.text).toContain('Financial Report Q4 2024');
-  expect(content.text).toContain('Total Revenue:');
+  // content is extracted text from all pages
+  expect(pdfResult.pagesCount).toBe(1);
+  expect(pdfResult.fileName).toContain('.pdf');
+  expect(pdfResult.content).toContain('All you need is the free Adobe Acrobat Reader');
+});
+```
+
+**PDF Reader Options:**
 
-  // Validate page count
-  expect(content.numpages).toBeGreaterThan(10);
+```typescript
+const result = await readPDF({
+  filePath: '/path/to/document.pdf',
+  mergePages: false, // Keep pages separate (default: true)
+  debug: true, // Enable debug logging
+  maxPages: 10, // Limit processing to first 10 pages
 });
 ```
 
-**Key Points**:
+**Important Limitation - Vector-based PDFs:**
 
-- `content.text` contains all extracted text
-- `content.numpages` for page count
-- PDF parsing handles multi-page documents
-- Search for specific phrases
+Text extraction may fail for PDFs that store text as vector graphics (e.g., those generated by jsPDF):
+
+```typescript
+// Vector-based PDF example (extraction fails gracefully)
+const pdfResult = await readPDF({ filePath: downloadPath });
+
+expect(pdfResult.pagesCount).toBe(1);
+expect(pdfResult.info.extractionNotes).toContain(
+  'Text extraction from vector-based PDFs is not supported.'
+);
+```
+
+Such PDFs will have:
+
+- `textExtractionSuccess: false`
+- `isVectorBased: true`
+- Explanatory message in `extractionNotes`
 
 ### Example 4: ZIP Archive Validation
 
@@ -154,25 +186,33 @@ test('should validate ZIP archive', async () => {
     trigger: () => page.click('[data-testid="download-backup"]'),
   });
 
-  const { content } = await readZIP({ filePath: downloadPath });
+  const zipResult = await readZIP({ filePath: downloadPath });
 
   // Check file list
-  expect(content.files).toContain('data.csv');
-  expect(content.files).toContain('config.json');
-  expect(content.files).toContain('readme.txt');
-
-  // Read specific file from archive
-  const configContent = content.zip.readAsText('config.json');
-  const config = JSON.parse(configContent);
+  expect(Array.isArray(zipResult.content.entries)).toBe(true);
+  expect(zipResult.content.entries).toContain(
+    'Case_53125_10-19-22_AM/Case_53125_10-19-22_AM_case_data.csv'
+  );
+
+  // Extract specific file
+  const targetFile = 'Case_53125_10-19-22_AM/Case_53125_10-19-22_AM_case_data.csv';
+  const zipWithExtraction = await readZIP({
+    filePath: downloadPath,
+    fileToExtract: targetFile,
+  });
 
-  expect(config.version).toBe('2.0');
+  // Access extracted file buffer
+  const extractedFiles = zipWithExtraction.content.extractedFiles || {};
+  const fileBuffer = extractedFiles[targetFile];
+  expect(fileBuffer).toBeInstanceOf(Buffer);
+  expect(fileBuffer?.length).toBeGreaterThan(0);
 });
 ```
 
 **Key Points**:
 
-- `content.files` lists all files in archive
-- `content.zip.readAsText()` extracts specific files
+- `content.entries` lists all files in archive
+- `fileToExtract` extracts specific files to Buffer
 - Validate archive structure
 - Read and parse individual files from ZIP
 
@@ -185,7 +225,7 @@ test('should validate ZIP archive', async () => {
 ```typescript
 test('should download via API', async ({ page, request }) => {
   const downloadPath = await handleDownload({
-    page,
+    page, // Still need page for download events
     downloadDir: DOWNLOAD_DIR,
     trigger: async () => {
       const response = await request.get('/api/export/csv', {
@@ -211,20 +251,123 @@ test('should download via API', async ({ page, request }) => {
 - Still need `page` for download events
 - Works with authenticated endpoints
 
-## Validation Helpers
+### Example 6: Reading CSV from Buffer (ZIP extraction)
+
+**Context**: Read CSV content directly from a Buffer (e.g., extracted from ZIP).
+
+**Implementation**:
 
 ```typescript
-// CSV validation
-const { isValid, errors } = await validateCSV({
-  filePath: downloadPath,
-  expectedRowCount: 10,
-  requiredHeaders: ['ID', 'Name', 'Email'],
+// Read from a Buffer (e.g., extracted from a ZIP)
+const zipResult = await readZIP({
+  filePath: 'archive.zip',
+  fileToExtract: 'data.csv',
 });
+const fileBuffer = zipResult.content.extractedFiles?.['data.csv'];
+const csvFromBuffer = await readCSV({ content: fileBuffer });
+
+// Read from a string
+const csvString = 'name,age\nJohn,30\nJane,25';
+const csvFromString = await readCSV({ content: csvString });
+
+const { data, headers } = csvFromString.content;
+expect(headers).toContain('name');
+expect(headers).toContain('age');
+```
+
+## API Reference
+
+### CSV Reader Options
+
+| Option         | Type               | Default  | Description                            |
+| -------------- | ------------------ | -------- | -------------------------------------- |
+| `filePath`     | `string`           | -        | Path to CSV file (mutually exclusive)  |
+| `content`      | `string \| Buffer` | -        | Direct content (mutually exclusive)    |
+| `delimiter`    | `string \| 'auto'` | `','`    | Value separator, auto-detect if 'auto' |
+| `encoding`     | `string`           | `'utf8'` | File encoding                          |
+| `parseHeaders` | `boolean`          | `true`   | Use first row as headers               |
+| `trim`         | `boolean`          | `true`   | Trim whitespace from values            |
+
+### XLSX Reader Options
+
+| Option      | Type     | Description                    |
+| ----------- | -------- | ------------------------------ |
+| `filePath`  | `string` | Path to XLSX file              |
+| `sheetName` | `string` | Name of sheet to set as active |
+
+### PDF Reader Options
+
+| Option       | Type      | Default | Description                 |
+| ------------ | --------- | ------- | --------------------------- |
+| `filePath`   | `string`  | -       | Path to PDF file (required) |
+| `mergePages` | `boolean` | `true`  | Merge text from all pages   |
+| `maxPages`   | `number`  | -       | Maximum pages to extract    |
+| `debug`      | `boolean` | `false` | Enable debug logging        |
+
+### ZIP Reader Options
+
+| Option          | Type     | Description                        |
+| --------------- | -------- | ---------------------------------- |
+| `filePath`      | `string` | Path to ZIP file                   |
+| `fileToExtract` | `string` | Specific file to extract to Buffer |
+
+### Return Values
 
-expect(isValid).toBe(true);
-expect(errors).toHaveLength(0);
+#### CSV Reader Return Value
+
+```typescript
+{
+  content: {
+    data: Array<Array<string | number>>,  // Parsed rows (excludes header row if parseHeaders: true)
+    headers: string[] | null              // Column headers (null if parseHeaders: false)
+  }
+}
 ```
 
+#### XLSX Reader Return Value
+
+```typescript
+{
+  content: {
+    worksheets: Array<{
+      name: string,                       // Sheet name
+      rows: Array<Array<any>>,            // All rows including headers
+      headers?: string[]                  // First row as headers (if present)
+    }>
+  }
+}
+```
+
+#### PDF Reader Return Value
+
+```typescript
+{
+  content: string,                        // Extracted text (merged or per-page based on mergePages)
+  pagesCount: number,                     // Total pages in PDF
+  fileName?: string,                      // Original filename if available
+  info?: Record<string, any>              // PDF metadata (author, title, etc.)
+}
+```
+
+> **Note**: When `mergePages: false`, `content` is an array of strings (one per page). When `maxPages` is set, only that many pages are extracted.
+
+#### ZIP Reader Return Value
+
+```typescript
+{
+  content: {
+    entries: Array<{
+      name: string,                       // File/directory path within ZIP
+      size: number,                       // Uncompressed size in bytes
+      isDirectory: boolean                // True for directories
+    }>,
+    extractedFiles: Record<string, Buffer | string>  // Extracted file contents by path
+  }
+}
+```
+
+> **Note**: When `fileToExtract` is specified, only that file appears in `extractedFiles`.
+
 ## Download Cleanup Pattern
 
 ```typescript
@@ -234,6 +377,66 @@ test.afterEach(async () => {
 });
 ```
 
+## Comparison with Vanilla Playwright
+
+Vanilla Playwright (real test) snippet:
+
+```typescript
+// ~80 lines of boilerplate!
+const [download] = await Promise.all([
+  page.waitForEvent('download'),
+  page.getByTestId('download-button-CSV Export').click(),
+]);
+
+const failure = await download.failure();
+expect(failure).toBeNull();
+
+const filePath = testInfo.outputPath(download.suggestedFilename());
+await download.saveAs(filePath);
+
+await expect
+  .poll(
+    async () => {
+      try {
+        await fs.access(filePath);
+        return true;
+      } catch {
+        return false;
+      }
+    },
+    { timeout: 5000, intervals: [100, 200, 500] }
+  )
+  .toBe(true);
+
+const csvContent = await fs.readFile(filePath, 'utf-8');
+
+const parseResult = parse(csvContent, {
+  header: true,
+  skipEmptyLines: true,
+  dynamicTyping: true,
+  transformHeader: (header: string) => header.trim(),
+});
+
+if (parseResult.errors.length > 0) {
+  throw new Error(`CSV parsing errors: ${JSON.stringify(parseResult.errors)}`);
+}
+
+const data = parseResult.data as Array<Record<string, unknown>>;
+const headers = parseResult.meta.fields || [];
+```
+
+With File Utils, the same flow becomes:
+
+```typescript
+const downloadPath = await handleDownload({
+  page,
+  downloadDir: DOWNLOAD_DIR,
+  trigger: () => page.getByTestId('download-button-text/csv').click(),
+});
+
+const { data, headers } = (await readCSV({ filePath: downloadPath })).content;
+```
+
 ## Related Fragments
 
 - `overview.md` - Installation and imports
@@ -242,7 +445,7 @@ test.afterEach(async () => {
 
 ## Anti-Patterns
 
-**❌ Not cleaning up downloads:**
+**DON'T leave downloads in place:**
 
 ```typescript
 test('creates file', async () => {
@@ -251,7 +454,7 @@ test('creates file', async () => {
 })
 ```
 
-**✅ Clean up after tests:**
+**DO clean up after tests:**
 
 ```typescript
 test.afterEach(async () => {

+ 159 - 9
_bmad/bmm/testarch/knowledge/intercept-network-call.md

@@ -183,7 +183,31 @@ test('should handle timeout', async ({ page, interceptNetworkCall }) => {
 - Validate error UI states
 - No real failures needed
 
-### Example 5: Multiple Intercepts (Order Matters!)
+### Example 5: Order Matters - Intercept Before Navigate
+
+**Context**: The interceptor must be set up before the network request occurs.
+
+**Implementation**:
+
+```typescript
+// INCORRECT - interceptor set up too late
+await page.goto('https://example.com'); // Request already happened
+const networkCall = interceptNetworkCall({ url: '**/api/data' });
+await networkCall; // Will hang indefinitely!
+
+// CORRECT - Set up interception first
+const networkCall = interceptNetworkCall({ url: '**/api/data' });
+await page.goto('https://example.com');
+const result = await networkCall;
+```
+
+This pattern follows the classic test spy/stub pattern:
+
+1. Define the spy/stub (set up interception)
+2. Perform the action (trigger the network request)
+3. Assert on the spy/stub (await and verify the response)
+
+### Example 6: Multiple Intercepts
 
 **Context**: Intercepting different endpoints in same test - setup order is critical.
 
@@ -191,7 +215,7 @@ test('should handle timeout', async ({ page, interceptNetworkCall }) => {
 
 ```typescript
 test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
-  // ✅ CORRECT: Setup all intercepts BEFORE navigation
+  // Setup all intercepts BEFORE navigation
   const usersCall = interceptNetworkCall({ url: '**/api/users' });
   const productsCall = interceptNetworkCall({ url: '**/api/products' });
   const ordersCall = interceptNetworkCall({ url: '**/api/orders' });
@@ -211,11 +235,85 @@ test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
 
 - Setup all intercepts before triggering actions
 - Use `Promise.all()` to wait for multiple calls
-- Order: intercept → navigate → await
+- Order: intercept -> navigate -> await
 - Prevents race conditions
 
+### Example 7: Capturing Multiple Requests to the Same Endpoint
+
+**Context**: Each `interceptNetworkCall` captures only the first matching request.
+
+**Implementation**:
+
+```typescript
+// Capturing a known number of requests
+const firstRequest = interceptNetworkCall({ url: '/api/data' });
+const secondRequest = interceptNetworkCall({ url: '/api/data' });
+
+await page.click('#load-data-button');
+
+const firstResponse = await firstRequest;
+const secondResponse = await secondRequest;
+
+expect(firstResponse.status).toBe(200);
+expect(secondResponse.status).toBe(200);
+
+// Handling an unknown number of requests
+const getDataRequestInterceptor = () =>
+  interceptNetworkCall({
+    url: '/api/data',
+    timeout: 1000, // Short timeout to detect when no more requests are coming
+  });
+
+let currentInterceptor = getDataRequestInterceptor();
+const allResponses = [];
+
+await page.click('#load-multiple-data-button');
+
+while (true) {
+  try {
+    const response = await currentInterceptor;
+    allResponses.push(response);
+    currentInterceptor = getDataRequestInterceptor();
+  } catch (error) {
+    // No more requests (timeout)
+    break;
+  }
+}
+
+console.log(`Captured ${allResponses.length} requests to /api/data`);
+```
+
+### Example 8: Using Timeout
+
+**Context**: Set a timeout for waiting on a network request.
+
+**Implementation**:
+
+```typescript
+const dataCall = interceptNetworkCall({
+  method: 'GET',
+  url: '/api/data-that-might-be-slow',
+  timeout: 5000, // 5 seconds timeout
+});
+
+await page.goto('/data-page');
+
+try {
+  const { responseJson } = await dataCall;
+  console.log('Data loaded successfully:', responseJson);
+} catch (error) {
+  if (error.message.includes('timeout')) {
+    console.log('Request timed out as expected');
+  } else {
+    throw error;
+  }
+}
+```
+
 ## URL Pattern Matching
 
+The utility uses [picomatch](https://github.com/micromatch/picomatch) for powerful glob pattern matching, dramatically simplifying URL targeting:
+
 **Supported glob patterns:**
 
 ```typescript
@@ -226,7 +324,59 @@ test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
 '**/api/users?id=*'; // With query params
 ```
 
-**Uses picomatch library** - same pattern syntax as Playwright's `page.route()` but cleaner API.
+**Comparison with vanilla Playwright:**
+
+```typescript
+// Vanilla Playwright - complex predicate
+const predicate = (response) => {
+  const url = response.url();
+  return (
+    url.endsWith('/api/users') ||
+    url.match(/\/api\/users\/\d+/) ||
+    (url.includes('/api/users/') && url.includes('/profile'))
+  );
+};
+page.waitForResponse(predicate);
+
+// With interceptNetworkCall - simple glob patterns
+interceptNetworkCall({ url: '/api/users' }); // Exact endpoint
+interceptNetworkCall({ url: '/api/users/*' }); // User by ID pattern
+interceptNetworkCall({ url: '/api/users/*/profile' }); // Specific sub-paths
+interceptNetworkCall({ url: '/api/users/**' }); // Match all
+```
+
+## API Reference
+
+### `interceptNetworkCall(options)`
+
+| Parameter         | Type       | Description                                                           |
+| ----------------- | ---------- | --------------------------------------------------------------------- |
+| `page`            | `Page`     | Required when using direct import (not needed with fixture)           |
+| `method`          | `string`   | Optional: HTTP method to match (e.g., 'GET', 'POST')                  |
+| `url`             | `string`   | Optional: URL pattern to match (supports glob patterns via picomatch) |
+| `fulfillResponse` | `object`   | Optional: Response to use when mocking                                |
+| `handler`         | `function` | Optional: Custom handler function for the route                       |
+| `timeout`         | `number`   | Optional: Timeout in milliseconds for the network request             |
+
+### `fulfillResponse` Object
+
+| Property  | Type                     | Description                                           |
+| --------- | ------------------------ | ----------------------------------------------------- |
+| `status`  | `number`                 | HTTP status code (default: 200)                       |
+| `headers` | `Record<string, string>` | Response headers                                      |
+| `body`    | `any`                    | Response body (will be JSON.stringified if an object) |
+
+### Return Value
+
+Returns a `Promise<NetworkCallResult>` with:
+
+| Property       | Type       | Description                             |
+| -------------- | ---------- | --------------------------------------- |
+| `request`      | `Request`  | The intercepted request                 |
+| `response`     | `Response` | The response (null if mocked)           |
+| `responseJson` | `any`      | Parsed JSON response (if available)     |
+| `status`       | `number`   | HTTP status code                        |
+| `requestJson`  | `any`      | Parsed JSON request body (if available) |
 
 ## Comparison with Vanilla Playwright
 
@@ -238,7 +388,7 @@ test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
 | `const status = resp.status()`                              | `const { status } = await call`                              |
 | Complex filter predicates                                   | Simple glob patterns                                         |
 
-**Reduction:** ~5-7 lines  ~2-3 lines per interception
+**Reduction:** ~5-7 lines -> ~2-3 lines per interception
 
 ## Related Fragments
 
@@ -248,14 +398,14 @@ test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
 
 ## Anti-Patterns
 
-**❌ Intercepting after navigation:**
+**DON'T intercept after navigation:**
 
 ```typescript
 await page.goto('/dashboard'); // Navigation starts
 const usersCall = interceptNetworkCall({ url: '**/api/users' }); // Too late!
 ```
 
-**✅ Intercept before navigate:**
+**DO intercept before navigate:**
 
 ```typescript
 const usersCall = interceptNetworkCall({ url: '**/api/users' }); // First
@@ -263,7 +413,7 @@ await page.goto('/dashboard'); // Then navigate
 const { responseJson } = await usersCall; // Then await
 ```
 
-**❌ Ignoring the returned Promise:**
+**DON'T ignore the returned Promise:**
 
 ```typescript
 interceptNetworkCall({ url: '**/api/users' }); // Not awaited!
@@ -271,7 +421,7 @@ await page.goto('/dashboard');
 // No deterministic wait - race condition
 ```
 
-**✅ Always await the intercept:**
+**DO always await the intercept:**
 
 ```typescript
 const usersCall = interceptNetworkCall({ url: '**/api/users' });

+ 170 - 35
_bmad/bmm/testarch/knowledge/log.md

@@ -21,6 +21,20 @@ The `log` utility provides:
 - **Multiple levels**: info, step, success, warning, error, debug
 - **Optional console**: Can disable console output but keep report logs
 
+## Quick Start
+
+```typescript
+import { log } from '@seontechnologies/playwright-utils';
+
+// Basic logging
+await log.info('Starting test');
+await log.step('Test step shown in Playwright UI');
+await log.success('Operation completed');
+await log.warning('Something to note');
+await log.error('Something went wrong');
+await log.debug('Debug information');
+```
+
 ## Pattern Examples
 
 ### Example 1: Basic Logging Levels
@@ -143,41 +157,105 @@ test('organized with steps', async ({ page, apiRequest }) => {
 - Steps visible in Playwright trace viewer
 - Better debugging when tests fail
 
-### Example 4: Conditional Logging
+### Example 4: Test Step Decorators
 
-**Context**: Log different messages based on environment or test conditions.
+**Context**: Create collapsible test steps in Playwright UI using decorators.
 
-**Implementation**:
+**Page Object Methods with @methodTestStep:**
 
 ```typescript
-test('conditional logging', async ({ page }) => {
-  const isCI = process.env.CI === 'true';
+import { methodTestStep } from '@seontechnologies/playwright-utils';
 
-  if (isCI) {
-    await log.info('Running in CI environment');
-  } else {
-    await log.debug('Running locally');
+class TodoPage {
+  constructor(private page: Page) {
+    this.name = 'TodoPage';
   }
 
-  const isKafkaWorking = await checkKafkaHealth();
+  readonly name: string;
 
-  if (!isKafkaWorking) {
-    await log.warning('Kafka unavailable - skipping event checks');
-  } else {
-    await log.step('Verifying Kafka events');
-    // ... event verification
+  @methodTestStep('Add todo item')
+  async addTodo(text: string) {
+    await log.info(`Adding todo: ${text}`);
+    const newTodo = this.page.getByPlaceholder('What needs to be done?');
+    await newTodo.fill(text);
+    await newTodo.press('Enter');
+    await log.step('step within a decorator');
+    await log.success(`Added todo: ${text}`);
   }
+
+  @methodTestStep('Get all todos')
+  async getTodos() {
+    await log.info('Getting all todos');
+    return this.page.getByTestId('todo-title');
+  }
+}
+```
+
+**Function Helpers with functionTestStep:**
+
+```typescript
+import { functionTestStep } from '@seontechnologies/playwright-utils';
+
+// Define todo items for the test
+const TODO_ITEMS = ['buy groceries', 'pay bills', 'schedule meeting'];
+
+const createDefaultTodos = functionTestStep('Create default todos', async (page: Page) => {
+  await log.info('Creating default todos');
+  await log.step('step within a functionWrapper');
+  const todoPage = new TodoPage(page);
+
+  for (const item of TODO_ITEMS) {
+    await todoPage.addTodo(item);
+  }
+
+  await log.success('Created all default todos');
 });
+
+const checkNumberOfTodosInLocalStorage = functionTestStep(
+  'Check total todos count fn-step',
+  async (page: Page, expected: number) => {
+    await log.info(`Verifying todo count: ${expected}`);
+    const result = await page.waitForFunction(
+      (e) => JSON.parse(localStorage['react-todos']).length === e,
+      expected
+    );
+    await log.success(`Verified todo count: ${expected}`);
+    return result;
+  }
+);
 ```
 
-**Key Points**:
+### Example 5: File Logging
+
+**Context**: Enable file logging for persistent logs.
+
+**Implementation**:
+
+```typescript
+// playwright/support/fixtures.ts
+import { test as base } from '@playwright/test';
+import { log, captureTestContext } from '@seontechnologies/playwright-utils';
+
+// Configure file logging globally
+log.configure({
+  fileLogging: {
+    enabled: true,
+    outputDir: 'playwright-logs/organized-logs',
+    forceConsolidated: false, // One file per test
+  },
+});
 
-- Log based on environment
-- Skip logging with conditionals
-- Use appropriate log levels
-- Debug info for local, minimal for CI
+// Extend base test with file logging context capture
+export const test = base.extend({
+  // Auto-capture test context for file logging
+  autoTestContext: [async ({}, use, testInfo) => {
+    captureTestContext(testInfo);
+    await use(undefined);
+  }, { auto: true }],
+});
+```
 
-### Example 5: Integration with Auth and API
+### Example 6: Integration with Auth and API
 
 **Context**: Log authenticated API requests with tokens (safely).
 
@@ -221,16 +299,73 @@ test('should log auth flow', async ({ authToken, apiRequest }) => {
 - Combine with auth and API utilities
 - Log at appropriate detail level
 
+## Configuration
+
+**Defaults:** console logging enabled, file logging disabled.
+
+```typescript
+// Enable file logging in config
+log.configure({
+  console: true, // default
+  fileLogging: {
+    enabled: true,
+    outputDir: 'playwright-logs',
+    forceConsolidated: false, // One file per test
+  },
+});
+
+// Per-test override
+await log.info('Message', {
+  console: { enabled: false },
+  fileLogging: { enabled: true },
+});
+```
+
+### Environment Variables
+
+```bash
+# Disable all logging
+SILENT=true
+
+# Disable only file logging
+DISABLE_FILE_LOGS=true
+
+# Disable only console logging
+DISABLE_CONSOLE_LOGS=true
+```
+
+### Level Filtering
+
+```typescript
+log.configure({
+  level: 'warning', // Only warning, error levels will show
+});
+
+// Available levels (in priority order):
+// debug < info < step < success < warning < error
+```
+
+### Sync Methods
+
+For non-test contexts (global setup, utility functions):
+
+```typescript
+// Use sync methods when async/await isn't available
+log.infoSync('Initializing configuration');
+log.successSync('Environment configured');
+log.errorSync('Setup failed');
+```
+
 ## Log Levels Guide
 
-| Level     | When to Use                         | Shows in Report      | Shows in Console |
-| --------- | ----------------------------------- | -------------------- | ---------------- |
-| `step`    | Test organization, major actions    | ✅ Collapsible steps | ✅ Yes           |
-| `info`    | General information, state changes  | ✅ Yes               | ✅ Yes           |
-| `success` | Successful operations               | ✅ Yes               | ✅ Yes           |
-| `warning` | Non-critical issues, skipped checks | ✅ Yes               | ✅ Yes           |
-| `error`   | Failures, exceptions                | ✅ Yes               | ✅ Configurable  |
-| `debug`   | Detailed data, objects              | ✅ Yes (attached)    | ✅ Configurable  |
+| Level     | When to Use                         | Shows in Report   | Shows in Console |
+| --------- | ----------------------------------- | ----------------- | ---------------- |
+| `step`    | Test organization, major actions    | Collapsible steps | Yes              |
+| `info`    | General information, state changes  | Yes               | Yes              |
+| `success` | Successful operations               | Yes               | Yes              |
+| `warning` | Non-critical issues, skipped checks | Yes               | Yes              |
+| `error`   | Failures, exceptions                | Yes               | Configurable     |
+| `debug`   | Detailed data, objects              | Yes (attached)    | Configurable     |
 
 ## Comparison with console.log
 
@@ -251,34 +386,34 @@ test('should log auth flow', async ({ authToken, apiRequest }) => {
 
 ## Anti-Patterns
 
-**❌ Logging objects in steps:**
+**DON'T log objects in steps:**
 
 ```typescript
 await log.step({ user: 'test', action: 'create' }); // Shows empty in UI
 ```
 
-**✅ Use strings for steps, objects for debug:**
+**DO use strings for steps, objects for debug:**
 
 ```typescript
 await log.step('Creating user: test'); // Readable in UI
 await log.debug({ user: 'test', action: 'create' }); // Detailed data
 ```
 
-**❌ Logging sensitive data:**
+**DON'T log sensitive data:**
 
 ```typescript
 await log.info(`Password: ${password}`); // Security risk!
 await log.info(`Token: ${authToken}`); // Full token exposed!
 ```
 
-**✅ Use previews or omit sensitive data:**
+**DO use previews or omit sensitive data:**
 
 ```typescript
 await log.info('User authenticated successfully'); // No sensitive data
 await log.debug({ tokenPreview: token.slice(0, 6) + '...' });
 ```
 
-**❌ Excessive logging in loops:**
+**DON'T log excessively in loops:**
 
 ```typescript
 for (const item of items) {
@@ -286,7 +421,7 @@ for (const item of items) {
 }
 ```
 
-**✅ Log summary or use debug level:**
+**DO log summary or use debug level:**
 
 ```typescript
 await log.step(`Processing ${items.length} items`);

+ 228 - 95
_bmad/bmm/testarch/knowledge/network-error-monitor.md

@@ -21,6 +21,19 @@ The `network-error-monitor` provides:
 - **Smart opt-out**: Disable for validation tests expecting errors
 - **Deduplication**: Group repeated errors by pattern
 - **Domino effect prevention**: Limit test failures per error pattern
+- **Respects test status**: Won't suppress actual test failures
+
+## Quick Start
+
+```typescript
+import { test } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
+
+// That's it! Network monitoring is automatically enabled
+test('my test', async ({ page }) => {
+  await page.goto('/dashboard');
+  // If any HTTP 4xx/5xx errors occur, the test will fail
+});
+```
 
 ## Pattern Examples
 
@@ -38,8 +51,8 @@ test('should load dashboard', async ({ page }) => {
   await page.goto('/dashboard');
   await expect(page.locator('h1')).toContainText('Dashboard');
 
-  // Passes if no HTTP errors
-  // Fails if any 4xx/5xx errors detected with clear message:
+  // Passes if no HTTP errors
+  // Fails if any 4xx/5xx errors detected with clear message:
   //    "Network errors detected: 2 request(s) failed"
   //    Failed requests:
   //      GET 500 https://api.example.com/users
@@ -64,13 +77,17 @@ test('should load dashboard', async ({ page }) => {
 import { test } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
 
 // Opt-out with annotation
-test('should show error on invalid input', { annotation: [{ type: 'skipNetworkMonitoring' }] }, async ({ page }) => {
-  await page.goto('/form');
-  await page.click('#submit'); // Triggers 400 error
-
-  // Monitoring disabled - test won't fail on 400
-  await expect(page.getByText('Invalid input')).toBeVisible();
-});
+test(
+  'should show error on invalid input',
+  { annotation: [{ type: 'skipNetworkMonitoring' }] },
+  async ({ page }) => {
+    await page.goto('/form');
+    await page.click('#submit'); // Triggers 400 error
+
+    // Monitoring disabled - test won't fail on 400
+    await expect(page.getByText('Invalid input')).toBeVisible();
+  }
+);
 
 // Or opt-out entire describe block
 test.describe('error handling', { annotation: [{ type: 'skipNetworkMonitoring' }] }, () => {
@@ -91,7 +108,139 @@ test.describe('error handling', { annotation: [{ type: 'skipNetworkMonitoring' }
 - Monitoring still active for other tests
 - Perfect for intentional error scenarios
 
-### Example 3: Integration with Merged Fixtures
+### Example 3: Respects Test Status
+
+**Context**: The monitor respects final test statuses to avoid suppressing important test outcomes.
+
+**Behavior by test status:**
+
+- **`failed`**: Network errors logged as additional context, not thrown
+- **`timedOut`**: Network errors logged as additional context
+- **`skipped`**: Network errors logged, skip status preserved
+- **`interrupted`**: Network errors logged, interrupted status preserved
+- **`passed`**: Network errors throw and fail the test
+
+**Example with test.skip():**
+
+```typescript
+test('feature gated test', async ({ page }) => {
+  const featureEnabled = await checkFeatureFlag();
+  test.skip(!featureEnabled, 'Feature not enabled');
+  // If skipped, network errors won't turn this into a failure
+  await page.goto('/new-feature');
+});
+```
+
+### Example 4: Excluding Legitimate Errors
+
+**Context**: Some endpoints legitimately return 4xx/5xx responses.
+
+**Implementation**:
+
+```typescript
+import { test as base } from '@playwright/test';
+import { createNetworkErrorMonitorFixture } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
+
+export const test = base.extend(
+  createNetworkErrorMonitorFixture({
+    excludePatterns: [
+      /email-cluster\/ml-app\/has-active-run/, // ML service returns 404 when no active run
+      /idv\/session-templates\/list/, // IDV service returns 404 when not configured
+      /sentry\.io\/api/, // External Sentry errors should not fail tests
+    ],
+  })
+);
+```
+
+**For merged fixtures:**
+
+```typescript
+import { test as base, mergeTests } from '@playwright/test';
+import { createNetworkErrorMonitorFixture } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
+
+const networkErrorMonitor = base.extend(
+  createNetworkErrorMonitorFixture({
+    excludePatterns: [/analytics\.google\.com/, /cdn\.example\.com/],
+  })
+);
+
+export const test = mergeTests(authFixture, networkErrorMonitor);
+```
+
+### Example 5: Preventing Domino Effect
+
+**Context**: One failing endpoint shouldn't fail all tests.
+
+**Implementation**:
+
+```typescript
+import { test as base } from '@playwright/test';
+import { createNetworkErrorMonitorFixture } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
+
+const networkErrorMonitor = base.extend(
+  createNetworkErrorMonitorFixture({
+    excludePatterns: [], // Required when using maxTestsPerError
+    maxTestsPerError: 1, // Only first test fails per error pattern, rest just log
+  })
+);
+```
+
+**How it works:**
+
+When `/api/v2/case-management/cases` returns 500:
+
+- **First test** encountering this error: **FAILS** with clear error message
+- **Subsequent tests** encountering same error: **PASSES** but logs warning
+
+Error patterns are grouped by `method + status + base path`:
+
+- `GET /api/v2/case-management/cases/123` -> Pattern: `GET:500:/api/v2/case-management`
+- `GET /api/v2/case-management/quota` -> Pattern: `GET:500:/api/v2/case-management` (same group!)
+- `POST /api/v2/case-management/cases` -> Pattern: `POST:500:/api/v2/case-management` (different group!)
+
+**Why include HTTP method?** A GET 404 vs POST 404 might represent different issues:
+
+- `GET 404 /api/users/123` -> User not found (expected in some tests)
+- `POST 404 /api/users` -> Endpoint doesn't exist (critical error)
+
+**Output for subsequent tests:**
+
+```
+Warning: Network errors detected but not failing test (maxTestsPerError limit reached):
+  GET 500 https://api.example.com/api/v2/case-management/cases
+```
+
+**Recommended configuration:**
+
+```typescript
+createNetworkErrorMonitorFixture({
+  excludePatterns: [...], // Required - known broken endpoints (can be empty [])
+  maxTestsPerError: 1     // Stop domino effect (requires excludePatterns)
+})
+```
+
+**Understanding worker-level state:**
+
+Error pattern counts are stored in worker-level global state:
+
+```typescript
+// test-file-1.spec.ts (runs in Worker 1)
+test('test A', () => {
+  /* triggers GET:500:/api/v2/cases */
+}); // FAILS
+
+// test-file-2.spec.ts (runs later in Worker 1)
+test('test B', () => {
+  /* triggers GET:500:/api/v2/cases */
+}); // PASSES (limit reached)
+
+// test-file-3.spec.ts (runs in Worker 2 - different worker)
+test('test C', () => {
+  /* triggers GET:500:/api/v2/cases */
+}); // FAILS (fresh worker)
+```
+
+### Example 6: Integration with Merged Fixtures
 
 **Context**: Combine network-error-monitor with other utilities.
 
@@ -105,7 +254,7 @@ import { test as networkErrorMonitorFixture } from '@seontechnologies/playwright
 
 export const test = mergeTests(
   authFixture,
-  networkErrorMonitorFixture,
+  networkErrorMonitorFixture
   // Add other fixtures
 );
 
@@ -127,110 +276,94 @@ test('authenticated with monitoring', async ({ page, authToken }) => {
 - Monitoring active automatically
 - No extra setup needed
 
-### Example 4: Domino Effect Prevention
-
-**Context**: One failing endpoint shouldn't fail all tests.
-
-**Implementation**:
-
-```typescript
-// Configuration (internal to utility)
-const config = {
-  maxTestsPerError: 3, // Max 3 tests fail per unique error pattern
-};
-
-// Scenario:
-// Test 1: GET /api/broken → 500 error → Test fails ❌
-// Test 2: GET /api/broken → 500 error → Test fails ❌
-// Test 3: GET /api/broken → 500 error → Test fails ❌
-// Test 4: GET /api/broken → 500 error → Test passes ⚠️ (limit reached, warning logged)
-// Test 5: Different error pattern → Test fails ❌ (new pattern, counter resets)
-```
-
-**Key Points**:
-
-- Limits cascading failures
-- Groups errors by URL + status code pattern
-- Warns when limit reached
-- Prevents flaky backend from failing entire suite
-
-### Example 5: Artifact Structure
+### Example 7: Artifact Structure
 
 **Context**: Debugging failed tests with network error artifacts.
 
-**Implementation**:
-
 When test fails due to network errors, artifact attached:
 
 ```json
-// test-results/my-test/network-errors.json
-{
-  "errors": [
-    {
-      "url": "https://api.example.com/users",
-      "method": "GET",
-      "status": 500,
-      "statusText": "Internal Server Error",
-      "timestamp": "2024-08-13T10:30:45.123Z"
-    },
-    {
-      "url": "https://api.example.com/metrics",
-      "method": "POST",
-      "status": 503,
-      "statusText": "Service Unavailable",
-      "timestamp": "2024-08-13T10:30:46.456Z"
-    }
-  ],
-  "summary": {
-    "totalErrors": 2,
-    "uniquePatterns": 2
+[
+  {
+    "url": "https://api.example.com/users",
+    "status": 500,
+    "method": "GET",
+    "timestamp": "2025-11-10T12:34:56.789Z"
+  },
+  {
+    "url": "https://api.example.com/metrics",
+    "status": 503,
+    "method": "POST",
+    "timestamp": "2025-11-10T12:34:57.123Z"
   }
-}
+]
 ```
 
-**Key Points**:
+## Implementation Details
+
+### How It Works
+
+1. **Fixture Extension**: Uses Playwright's `base.extend()` with `auto: true`
+2. **Response Listener**: Attaches `page.on('response')` listener at test start
+3. **Multi-Page Monitoring**: Automatically monitors popups and new tabs via `context.on('page')`
+4. **Error Collection**: Captures 4xx/5xx responses, checking exclusion patterns
+5. **Try/Finally**: Ensures error processing runs even if test fails early
+6. **Status Check**: Only throws errors if test hasn't already reached final status
+7. **Artifact**: Attaches JSON file to test report for debugging
 
-- JSON artifact per failed test
-- Full error details (URL, method, status, timestamp)
-- Summary statistics
-- Easy debugging with structured data
+### Performance
 
-## Comparison with Manual Error Checks
+The monitor has minimal performance impact:
 
-| Manual Approach                                        | network-error-monitor      |
-| ------------------------------------------------------ | -------------------------- |
-| `page.on('response', resp => { if (!resp.ok()) ... })` | Auto-enabled, zero setup   |
-| Check each response manually                           | Automatic for all requests |
-| Custom error tracking logic                            | Built-in deduplication     |
-| No structured artifacts                                | JSON artifacts attached    |
-| Easy to forget                                         | Never miss a backend error |
+- Event listener overhead: ~0.1ms per response
+- Memory: ~200 bytes per unique error
+- No network delay (observes responses, doesn't intercept them)
+
+## Comparison with Alternatives
+
+| Approach                    | Network Error Monitor | Manual afterEach      |
+| --------------------------- | --------------------- | --------------------- |
+| **Setup Required**          | Zero (auto-enabled)   | Every test file       |
+| **Catches Silent Failures** | Yes                   | Yes (if configured)   |
+| **Structured Artifacts**    | JSON attached         | Custom impl           |
+| **Test Failure Safety**     | Try/finally           | afterEach may not run |
+| **Opt-Out Mechanism**       | Annotation            | Custom logic          |
+| **Status Aware**            | Respects skip/failed  | No                    |
 
 ## When to Use
 
 **Auto-enabled for:**
 
-- ✅ All E2E tests
-- ✅ Integration tests
-- Any test hitting real APIs
+- All E2E tests
+- Integration tests
+- Any test hitting real APIs
 
 **Opt-out for:**
 
-- ❌ Validation tests (expecting 4xx)
-- ❌ Error handling tests (expecting 5xx)
-- ❌ Offline tests (network-recorder playback)
+- Validation tests (expecting 4xx)
+- Error handling tests (expecting 5xx)
+- Offline tests (network-recorder playback)
+
+## Troubleshooting
+
+### Test fails with network errors but I don't see them in my app
+
+The errors might be happening during page load or in background polling. Check the `network-errors.json` artifact in your test report for full details including timestamps.
+
+### False positives from external services
 
-## Integration with Framework Setup
+Configure exclusion patterns as shown in the "Excluding Legitimate Errors" section above.
 
-In `*framework` workflow, mention network-error-monitor:
+### Network errors not being caught
+
+Ensure you're importing the test from the correct fixture:
 
 ```typescript
-// Add to merged-fixtures.ts
-import { test as networkErrorMonitorFixture } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
+// Correct
+import { test } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
 
-export const test = mergeTests(
-  // ... other fixtures
-  networkErrorMonitorFixture,
-);
+// Wrong - this won't have network monitoring
+import { test } from '@playwright/test';
 ```
 
 ## Related Fragments
@@ -241,14 +374,14 @@ export const test = mergeTests(
 
 ## Anti-Patterns
 
-**❌ Opting out of monitoring globally:**
+**DON'T opt out of monitoring globally:**
 
 ```typescript
 // Every test skips monitoring
 test.use({ annotation: [{ type: 'skipNetworkMonitoring' }] });
 ```
 
-**✅ Opt-out only for specific error tests:**
+**DO opt-out only for specific error tests:**
 
 ```typescript
 test.describe('error scenarios', { annotation: [{ type: 'skipNetworkMonitoring' }] }, () => {
@@ -256,17 +389,17 @@ test.describe('error scenarios', { annotation: [{ type: 'skipNetworkMonitoring'
 });
 ```
 
-**❌ Ignoring network error artifacts:**
+**DON'T ignore network error artifacts:**
 
 ```typescript
 // Test fails, artifact shows 500 errors
 // Developer: "Works on my machine" ¯\_(ツ)_/¯
 ```
 
-**✅ Check artifacts for root cause:**
+**DO check artifacts for root cause:**
 
 ```typescript
 // Read network-errors.json artifact
-// Identify failing endpoint: GET /api/users  500
+// Identify failing endpoint: GET /api/users -> 500
 // Fix backend issue before merging
 ```

+ 314 - 52
_bmad/bmm/testarch/knowledge/network-recorder.md

@@ -21,6 +21,46 @@ HAR-based recording/playback provides:
 - **Stateful mocking**: CRUD operations work naturally (not just read-only)
 - **Environment flexibility**: Map URLs for any environment
 
+## Quick Start
+
+### 1. Record Network Traffic
+
+```typescript
+// Set mode to 'record' to capture network traffic
+process.env.PW_NET_MODE = 'record';
+
+test('should add, edit and delete a movie', async ({ page, context, networkRecorder }) => {
+  // Setup network recorder - it will record all network traffic
+  await networkRecorder.setup(context);
+
+  // Your normal test code
+  await page.goto('/');
+  await page.fill('#movie-name', 'Inception');
+  await page.click('#add-movie');
+
+  // Network traffic is automatically saved to HAR file
+});
+```
+
+### 2. Playback Network Traffic
+
+```typescript
+// Set mode to 'playback' to use recorded traffic
+process.env.PW_NET_MODE = 'playback';
+
+test('should add, edit and delete a movie', async ({ page, context, networkRecorder }) => {
+  // Setup network recorder - it will replay from HAR file
+  await networkRecorder.setup(context);
+
+  // Same test code runs without hitting real backend!
+  await page.goto('/');
+  await page.fill('#movie-name', 'Inception');
+  await page.click('#add-movie');
+});
+```
+
+That's it! Your tests now run completely offline using recorded network traffic.
+
 ## Pattern Examples
 
 ### Example 1: Basic Record and Playback
@@ -115,74 +155,173 @@ test.describe('Movie CRUD - offline with network recorder', () => {
 - Combine with `interceptNetworkCall` for deterministic waits
 - First run records, subsequent runs replay
 
-### Example 3: Environment Switching
+### Example 3: Common Patterns
 
-**Context**: Record in dev environment, play back in CI with different base URLs.
+**Recording Only API Calls**:
 
-**Implementation**:
+```typescript
+await networkRecorder.setup(context, {
+  recording: {
+    urlFilter: /\/api\// // Only record API calls, ignore static assets
+  }
+});
+```
+
+**Playback with Fallback**:
 
 ```typescript
-// playwright.config.ts - Map URLs for different environments
-export default defineConfig({
-  use: {
-    baseURL: process.env.CI ? 'https://app.ci.example.com' : 'http://localhost:3000',
-  },
+await networkRecorder.setup(context, {
+  playback: {
+    fallback: true // Fall back to live requests if HAR entry missing
+  }
 });
+```
 
-// Test works in both environments
-test('cross-environment playback', async ({ page, context, networkRecorder }) => {
-  await networkRecorder.setup(context);
+**Custom HAR File Location**:
 
-  // In dev: hits http://localhost:3000/api/movies
-  // In CI: HAR replays with https://app.ci.example.com/api/movies
-  await page.goto('/movies');
+```typescript
+await networkRecorder.setup(context, {
+  harFile: {
+    harDir: 'recordings/api-calls',
+    baseName: 'user-journey',
+    organizeByTestFile: false // Optional: flatten directory structure
+  }
+});
+```
 
-  // Network recorder auto-maps URLs
-  await expect(page.getByTestId('movie-list')).toBeVisible();
+**Directory Organization:**
+
+- `organizeByTestFile: true` (default): `har-files/test-file-name/baseName-test-title.har`
+- `organizeByTestFile: false`: `har-files/baseName-test-title.har`
+
+### Example 4: Response Content Storage - Embed vs Attach
+
+**Context**: Choose how response content is stored in HAR files.
+
+**`embed` (Default - Recommended):**
+
+```typescript
+await networkRecorder.setup(context, {
+  recording: {
+    content: 'embed' // Store content inline (default)
+  }
 });
 ```
 
-**Key Points**:
+**Pros:**
 
-- HAR files record absolute URLs
-- Playback maps to current baseURL
-- Same HAR works across environments
-- No manual URL rewriting needed
+- Single self-contained file - Easy to share, version control
+- Better for small-medium responses (API JSON, HTML pages)
+- HAR specification compliant
 
-### Example 4: Automatic vs Manual Mode Control
+**Cons:**
 
-**Context**: Choose between environment-based switching or in-test mode control.
+- Larger HAR files
+- Not ideal for large binary content (images, videos)
 
-**Implementation**:
+**`attach` (Alternative):**
 
 ```typescript
-// Option 1: Environment variable (recommended for CI)
-PW_NET_MODE=record npm run test:pw   # Record traffic
-PW_NET_MODE=playback npm run test:pw # Playback traffic
+await networkRecorder.setup(context, {
+  recording: {
+    content: 'attach' // Store content separately
+  }
+});
+```
 
-// Option 2: In-test control (recommended for development)
-process.env.PW_NET_MODE = 'record'  // Set at top of test file
+**Pros:**
 
-test('my test', async ({ page, context, networkRecorder }) => {
-  await networkRecorder.setup(context)
-  // ...
-})
-
-// Option 3: Auto-fallback (record if HAR missing, else playback)
-// This is the default behavior when PW_NET_MODE not set
-test('auto mode', async ({ page, context, networkRecorder }) => {
-  await networkRecorder.setup(context)
-  // First run: auto-records
-  // Subsequent runs: auto-plays back
-})
+- Smaller HAR files
+- Better for large responses (images, videos, documents)
+
+**Cons:**
+
+- Multiple files to manage
+- Harder to share
+
+**When to Use Each:**
+
+| Use `embed` (default) when | Use `attach` when |
+|---------------------------|-------------------|
+| Recording API responses (JSON, XML) | Recording large images, videos |
+| Small to medium HTML pages | HAR file size >50MB |
+| You want a single, portable file | Maximum disk efficiency needed |
+| Sharing HAR files with team | Working with ZIP archive output |
+
+### Example 5: Cross-Environment Compatibility (URL Mapping)
+
+**Context**: Record in dev environment, play back in CI with different base URLs.
+
+**The Problem**: HAR files contain URLs for the recording environment (e.g., `dev.example.com`). Playing back on a different environment fails.
+
+**Simple Hostname Mapping:**
+
+```typescript
+await networkRecorder.setup(context, {
+  playback: {
+    urlMapping: {
+      hostMapping: {
+        'preview.example.com': 'dev.example.com',
+        'staging.example.com': 'dev.example.com',
+        'localhost:3000': 'dev.example.com'
+      }
+    }
+  }
+});
 ```
 
-**Key Points**:
+**Pattern-Based Mapping (Recommended):**
+
+```typescript
+await networkRecorder.setup(context, {
+  playback: {
+    urlMapping: {
+      patterns: [
+        // Map any preview-XXXX subdomain to dev
+        { match: /preview-\d+\.example\.com/, replace: 'dev.example.com' }
+      ]
+    }
+  }
+});
+```
+
+**Custom Function:**
+
+```typescript
+await networkRecorder.setup(context, {
+  playback: {
+    urlMapping: {
+      mapUrl: (url) => url.replace('staging.example.com', 'dev.example.com')
+    }
+  }
+});
+```
+
+**Complex Multi-Environment Example:**
+
+```typescript
+await networkRecorder.setup(context, {
+  playback: {
+    urlMapping: {
+      hostMapping: {
+        'localhost:3000': 'admin.seondev.space',
+        'admin-staging.seon.io': 'admin.seondev.space',
+        'admin.seon.io': 'admin.seondev.space',
+      },
+      patterns: [
+        { match: /admin-\d+\.seondev\.space/, replace: 'admin.seondev.space' },
+        { match: /admin-staging-pr-\w+-\d\.seon\.io/, replace: 'admin.seondev.space' }
+      ]
+    }
+  }
+});
+```
+
+**Benefits:**
 
-- Three mode options: record, playback, auto
-- `PW_NET_MODE` environment variable
-- In-test `process.env.PW_NET_MODE` assignment
-- Auto-fallback when no mode specified
+- Record once on dev, all environments map back to recordings
+- CORS headers automatically updated based on request origin
+- Debug with: `LOG_LEVEL=debug npm run test`
 
 ## Why Use This Instead of Native Playwright?
 
@@ -191,7 +330,7 @@ test('auto mode', async ({ page, context, networkRecorder }) => {
 | ~80 lines setup boilerplate        | ~5 lines total                 |
 | Manual HAR file management         | Automatic file organization    |
 | Complex setup/teardown             | Automatic cleanup via fixtures |
-| **Read-only tests**                | **Full CRUD support**          |
+| **Read-only tests only**           | **Full CRUD support**          |
 | **Stateless**                      | **Stateful mocking**           |
 | Manual URL mapping                 | Automatic environment mapping  |
 
@@ -199,9 +338,132 @@ test('auto mode', async ({ page, context, networkRecorder }) => {
 
 Native Playwright HAR playback is stateless - a POST create followed by GET list won't show the created item. This utility intelligently tracks CRUD operations in memory to reflect state changes, making offline tests behave like real APIs.
 
+## How Stateful CRUD Detection Works
+
+When in playback mode, the Network Recorder automatically analyzes your HAR file to detect CRUD patterns. If it finds:
+
+- Multiple GET requests to the same resource endpoint (e.g., `/movies`)
+- Mutation operations (POST, PUT, DELETE) to those resources
+- Evidence of state changes between identical requests
+
+It automatically switches from static HAR playback to an intelligent stateful mock that:
+
+- Maintains state across requests
+- Auto-generates IDs for new resources
+- Returns proper 404s for deleted resources
+- Supports polling scenarios where state changes over time
+
+**This happens automatically - no configuration needed!**
+
+## API Reference
+
+### NetworkRecorder Methods
+
+| Method               | Return Type              | Description                                           |
+| -------------------- | ------------------------ | ----------------------------------------------------- |
+| `setup(context)`     | `Promise<void>`          | Sets up recording/playback on browser context         |
+| `cleanup()`          | `Promise<void>`          | Flushes data to disk and cleans up memory             |
+| `getContext()`       | `NetworkRecorderContext` | Gets current recorder context information             |
+| `getStatusMessage()` | `string`                 | Gets human-readable status message                    |
+| `getHarStats()`      | `Promise<HarFileStats>`  | Gets HAR file statistics and metadata                 |
+
+### Understanding `cleanup()`
+
+The `cleanup()` method performs memory and resource cleanup - **it does NOT delete HAR files**:
+
+**What it does:**
+
+- Flushes recorded data to disk (writes HAR file in recording mode)
+- Releases file locks
+- Clears in-memory data
+- Resets internal state
+
+**What it does NOT do:**
+
+- Delete HAR files from disk
+- Remove recorded network traffic
+- Clear browser context or cookies
+
+### Configuration Options
+
+```typescript
+type NetworkRecorderConfig = {
+  harFile?: {
+    harDir?: string // Directory for HAR files (default: 'har-files')
+    baseName?: string // Base name for HAR files (default: 'network-traffic')
+    organizeByTestFile?: boolean // Organize by test file (default: true)
+  }
+
+  recording?: {
+    content?: 'embed' | 'attach' // Response content handling (default: 'embed')
+    urlFilter?: string | RegExp // URL filter for recording
+    update?: boolean // Update existing HAR files (default: false)
+  }
+
+  playback?: {
+    fallback?: boolean // Fall back to live requests (default: false)
+    urlFilter?: string | RegExp // URL filter for playback
+    updateMode?: boolean // Update mode during playback (default: false)
+  }
+
+  forceMode?: 'record' | 'playback' | 'disabled'
+}
+```
+
+## Environment Configuration
+
+Control the recording mode using the `PW_NET_MODE` environment variable:
+
+```bash
+# Record mode - captures network traffic to HAR files
+PW_NET_MODE=record npm run test:pw
+
+# Playback mode - replays network traffic from HAR files
+PW_NET_MODE=playback npm run test:pw
+
+# Disabled mode - no network recording/playback
+PW_NET_MODE=disabled npm run test:pw
+
+# Default behavior (when PW_NET_MODE is empty/unset) - same as disabled
+npm run test:pw
+```
+
+**Tip**: We recommend setting `process.env.PW_NET_MODE` directly in your test file for better control.
+
+## Troubleshooting
+
+### HAR File Not Found
+
+If you see "HAR file not found" errors during playback:
+
+1. Ensure you've recorded the test first with `PW_NET_MODE=record`
+2. Check the HAR file exists in the expected location (usually `har-files/`)
+3. Enable fallback mode: `playback: { fallback: true }`
+
+### Authentication and Network Recording
+
+The network recorder works seamlessly with authentication:
+
+```typescript
+test('Authenticated recording', async ({ page, context, authSession, networkRecorder }) => {
+  // First authenticate
+  await authSession.login('testuser', 'password');
+
+  // Then setup network recording with authenticated context
+  await networkRecorder.setup(context);
+
+  // Test authenticated flows
+  await page.goto('/dashboard');
+});
+```
+
+### Concurrent Test Issues
+
+The recorder includes built-in file locking for safe parallel execution. Each test gets its own HAR file based on the test name.
+
 ## Integration with Other Utilities
 
-**With interceptNetworkCall** (deterministic waits):
+**With interceptNetworkCall (deterministic waits):**
 
 ```typescript
 test('use both utilities', async ({ page, context, networkRecorder, interceptNetworkCall }) => {
@@ -228,7 +490,7 @@ test('use both utilities', async ({ page, context, networkRecorder, interceptNet
 
 ## Anti-Patterns
 
-**❌ Mixing record and playback in same test:**
+**DON'T mix record and playback in same test:**
 
 ```typescript
 process.env.PW_NET_MODE = 'record';
@@ -236,7 +498,7 @@ process.env.PW_NET_MODE = 'record';
 process.env.PW_NET_MODE = 'playback'; // Don't switch mid-test
 ```
 
-**✅ One mode per test:**
+**DO use one mode per test:**
 
 ```typescript
 process.env.PW_NET_MODE = 'playback'; // Set once at top
@@ -247,7 +509,7 @@ test('my test', async ({ page, context, networkRecorder }) => {
 });
 ```
 
-**❌ Forgetting to call setup:**
+**DON'T forget to call setup:**
 
 ```typescript
 test('broken', async ({ page, networkRecorder }) => {
@@ -255,7 +517,7 @@ test('broken', async ({ page, networkRecorder }) => {
 });
 ```
 
-**✅ Always call setup before navigation:**
+**DO always call setup before navigation:**
 
 ```typescript
 test('correct', async ({ page, context, networkRecorder }) => {

+ 15 - 12
_bmad/bmm/testarch/knowledge/overview.md

@@ -2,7 +2,7 @@
 
 ## Principle
 
-Use production-ready, fixture-based utilities from `@seontechnologies/playwright-utils` for common Playwright testing patterns. Build test helpers as pure functions first, then wrap in framework-specific fixtures for composability and reuse.
+Use production-ready, fixture-based utilities from `@seontechnologies/playwright-utils` for common Playwright testing patterns. Build test helpers as pure functions first, then wrap in framework-specific fixtures for composability and reuse. **Works equally well for pure API testing (no browser) and UI testing.**
 
 ## Rationale
 
@@ -20,6 +20,7 @@ Writing Playwright utilities from scratch for every project leads to:
 - **Composable fixtures**: Use `mergeTests` to combine utilities
 - **TypeScript support**: Full type safety with generic types
 - **Comprehensive coverage**: API requests, auth, network, logging, file handling, burn-in
+- **Backend-first mentality**: Most utilities work without a browser - pure API/service testing is a first-class use case
 
 ## Installation
 
@@ -37,17 +38,19 @@ npm install -D @seontechnologies/playwright-utils
 
 ### Core Testing Utilities
 
-| Utility                    | Purpose                                    | Test Context  |
-| -------------------------- | ------------------------------------------ | ------------- |
-| **api-request**            | Typed HTTP client with schema validation   | API tests     |
-| **network-recorder**       | HAR record/playback for offline testing    | UI tests      |
-| **auth-session**           | Token persistence, multi-user auth         | Both UI & API |
-| **recurse**                | Cypress-style polling for async conditions | Both UI & API |
-| **intercept-network-call** | Network spy/stub with auto JSON parsing    | UI tests      |
-| **log**                    | Playwright report-integrated logging       | Both UI & API |
-| **file-utils**             | CSV/XLSX/PDF/ZIP reading & validation      | Both UI & API |
-| **burn-in**                | Smart test selection with git diff         | CI/CD         |
-| **network-error-monitor**  | Automatic HTTP 4xx/5xx detection           | UI tests      |
+| Utility                    | Purpose                                              | Test Context       |
+| -------------------------- | ---------------------------------------------------- | ------------------ |
+| **api-request**            | Typed HTTP client with schema validation and retry   | **API/Backend**    |
+| **recurse**                | Polling for async operations, background jobs        | **API/Backend**    |
+| **auth-session**           | Token persistence, multi-user, service-to-service    | **API/Backend/UI** |
+| **log**                    | Playwright report-integrated logging                 | **API/Backend/UI** |
+| **file-utils**             | CSV/XLSX/PDF/ZIP reading & validation                | **API/Backend/UI** |
+| **burn-in**                | Smart test selection with git diff                   | **CI/CD**          |
+| **network-recorder**       | HAR record/playback for offline testing              | UI only            |
+| **intercept-network-call** | Network spy/stub with auto JSON parsing              | UI only            |
+| **network-error-monitor**  | Automatic HTTP 4xx/5xx detection                     | UI only            |
+
+**Note**: 6 of 9 utilities work without a browser. Only 3 are UI-specific (network-recorder, intercept-network-call, network-error-monitor).
 
 ## Design Patterns
 

+ 173 - 48
_bmad/bmm/testarch/knowledge/recurse.md

@@ -2,7 +2,7 @@
 
 ## Principle
 
-Use Cypress-style polling with Playwright's `expect.poll` to wait for asynchronous conditions. Provides configurable timeout, interval, logging, and post-polling callbacks with enhanced error categorization.
+Use Cypress-style polling with Playwright's `expect.poll` to wait for asynchronous conditions. Provides configurable timeout, interval, logging, and post-polling callbacks with enhanced error categorization. **Ideal for backend testing**: polling API endpoints for job completion, database eventual consistency, message queue processing, and cache propagation.
 
 ## Rationale
 
@@ -21,6 +21,29 @@ The `recurse` utility provides:
 - **Post-poll callbacks**: Process results after success
 - **Type-safe**: Full TypeScript generic support
 
+## Quick Start
+
+```typescript
+import { test } from '@seontechnologies/playwright-utils/recurse/fixtures';
+
+test('wait for job completion', async ({ recurse, apiRequest }) => {
+  const { body } = await apiRequest({
+    method: 'POST',
+    path: '/api/jobs',
+    body: { type: 'export' },
+  });
+
+  // Poll until job completes
+  const result = await recurse(
+    () => apiRequest({ method: 'GET', path: `/api/jobs/${body.id}` }),
+    (response) => response.body.status === 'completed',
+    { timeout: 60000 }
+  );
+
+  expect(result.body.downloadUrl).toBeDefined();
+});
+```
+
 ## Pattern Examples
 
 ### Example 1: Basic Polling
@@ -48,7 +71,7 @@ test('should wait for job completion', async ({ recurse, apiRequest }) => {
       timeout: 60000, // 60 seconds max
       interval: 2000, // Check every 2 seconds
       log: 'Waiting for export job to complete',
-    },
+    }
   );
 
   expect(result.body.downloadUrl).toBeDefined();
@@ -62,7 +85,7 @@ test('should wait for job completion', async ({ recurse, apiRequest }) => {
 - Options: timeout, interval, log message
 - Returns the value when predicate returns true
 
-### Example 2: Polling with Assertions
+### Example 2: Working with Assertions
 
 **Context**: Use assertions directly in predicate for more expressive tests.
 
@@ -76,35 +99,76 @@ test('should poll with assertions', async ({ recurse, apiRequest }) => {
     body: { type: 'user-created', userId: '123' },
   });
 
-  // Poll with assertions in predicate
+  // Poll with assertions in predicate - no return true needed!
   await recurse(
     async () => {
       const { body } = await apiRequest({ method: 'GET', path: '/api/events/123' });
       return body;
     },
     (event) => {
-      // Use assertions instead of boolean returns
+      // If all assertions pass, predicate succeeds
       expect(event.processed).toBe(true);
       expect(event.timestamp).toBeDefined();
-      // If assertions pass, predicate succeeds
+      // No need to return true - just let assertions pass
     },
-    { timeout: 30000 },
+    { timeout: 30000 }
   );
 });
 ```
 
-**Key Points**:
+**Why no `return true` needed?**
 
-- Predicate can use `expect()` assertions
-- If assertions throw, polling continues
-- If assertions pass, polling succeeds
-- More expressive than boolean returns
+The predicate checks for "truthiness" of the return value. But there's a catch - in JavaScript, an empty `return` (or no return) returns `undefined`, which is falsy!
 
-### Example 3: Custom Error Messages
+The utility handles this by checking if:
 
-**Context**: Provide context-specific error messages for timeout failures.
+1. The predicate didn't throw (assertions passed)
+2. The return value was either `undefined` (implicit return) or truthy
 
-**Implementation**:
+So you can:
+
+```typescript
+// Option 1: Use assertions only (recommended)
+(event) => {
+  expect(event.processed).toBe(true);
+};
+
+// Option 2: Return boolean (also works)
+(event) => event.processed === true;
+
+// Option 3: Mixed (assertions + explicit return)
+(event) => {
+  expect(event.processed).toBe(true);
+  return true;
+};
+```
+
+### Example 3: Error Handling
+
+**Context**: Understanding the different error types.
+
+**Error Types:**
+
+```typescript
+// RecurseTimeoutError - Predicate never returned true within timeout
+// Contains last command value and predicate error
+try {
+  await recurse(/* ... */);
+} catch (error) {
+  if (error instanceof RecurseTimeoutError) {
+    console.log('Timed out. Last value:', error.lastCommandValue);
+    console.log('Last predicate error:', error.lastPredicateError);
+  }
+}
+
+// RecurseCommandError - Command function threw an error
+// The command itself failed (e.g., network error, API error)
+
+// RecursePredicateError - Predicate function threw (not from assertions failing)
+// Logic error in your predicate code
+```
+
+**Custom Error Messages:**
 
 ```typescript
 test('custom error on timeout', async ({ recurse, apiRequest }) => {
@@ -115,7 +179,7 @@ test('custom error on timeout', async ({ recurse, apiRequest }) => {
       {
         timeout: 10000,
         error: 'System failed to become ready within 10 seconds - check background workers',
-      },
+      }
     );
   } catch (error) {
     // Error message includes custom context
@@ -125,13 +189,6 @@ test('custom error on timeout', async ({ recurse, apiRequest }) => {
 });
 ```
 
-**Key Points**:
-
-- `error` option provides custom message
-- Replaces default "Timed out after X ms"
-- Include debugging hints in error message
-- Helps diagnose failures faster
-
 ### Example 4: Post-Polling Callback
 
 **Context**: Process or log results after successful polling.
@@ -151,7 +208,7 @@ test('post-poll processing', async ({ recurse, apiRequest }) => {
         console.log(`Processed ${result.body.itemsProcessed} items`);
         return result.body;
       },
-    },
+    }
   );
 
   expect(finalResult.itemsProcessed).toBeGreaterThan(0);
@@ -165,7 +222,67 @@ test('post-poll processing', async ({ recurse, apiRequest }) => {
 - Can transform or log results
 - Return value becomes final `recurse` result
 
-### Example 5: Integration with API Request (Common Pattern)
+### Example 5: UI Testing Scenarios
+
+**Context**: Wait for UI elements to reach a specific state through polling.
+
+**Implementation**:
+
+```typescript
+test('table data loads', async ({ page, recurse }) => {
+  await page.goto('/reports');
+
+  // Poll for table rows to appear
+  await recurse(
+    async () => page.locator('table tbody tr').count(),
+    (count) => count >= 10, // Wait for at least 10 rows
+    {
+      timeout: 15000,
+      interval: 500,
+      log: 'Waiting for table data to load',
+    }
+  );
+
+  // Now safe to interact with table
+  await page.locator('table tbody tr').first().click();
+});
+```
+
+### Example 6: Event-Based Systems (Kafka/Message Queues)
+
+**Context**: Testing eventual consistency with message queue processing.
+
+**Implementation**:
+
+```typescript
+test('kafka event processed', async ({ recurse, apiRequest }) => {
+  // Trigger action that publishes Kafka event
+  await apiRequest({
+    method: 'POST',
+    path: '/api/orders',
+    body: { productId: 'ABC123', quantity: 2 },
+  });
+
+  // Poll for downstream effect of Kafka consumer processing
+  const inventoryResult = await recurse(
+    () => apiRequest({ method: 'GET', path: '/api/inventory/ABC123' }),
+    (res) => {
+      // Assumes test fixture seeds inventory at 100; in production tests,
+      // fetch baseline first and assert: expect(res.body.available).toBe(baseline - 2)
+      expect(res.body.available).toBeLessThanOrEqual(98);
+    },
+    {
+      timeout: 30000, // Kafka processing may take time
+      interval: 1000,
+      log: 'Waiting for Kafka event to be processed',
+    }
+  );
+
+  expect(inventoryResult.body.lastOrderId).toBeDefined();
+});
+```
+
+### Example 7: Integration with API Request (Common Pattern)
 
 **Context**: Most common use case - polling API endpoints for state changes.
 
@@ -193,7 +310,7 @@ test('end-to-end polling', async ({ apiRequest, recurse }) => {
       timeout: 120000, // 2 minutes for large imports
       interval: 5000, // Check every 5 seconds
       log: `Polling import ${createResp.importId}`,
-    },
+    }
   );
 
   expect(importResult.body.rowsImported).toBeGreaterThan(1000);
@@ -208,20 +325,26 @@ test('end-to-end polling', async ({ apiRequest, recurse }) => {
 - Complex predicates with multiple conditions
 - Logging shows polling progress in test reports
 
-## Enhanced Error Types
+## API Reference
 
-The utility categorizes errors for easier debugging:
+### RecurseOptions
 
-```typescript
-// TimeoutError - Predicate never returned true
-Error: Polling timed out after 30000ms: Job never completed
+| Option     | Type               | Default     | Description                          |
+| ---------- | ------------------ | ----------- | ------------------------------------ |
+| `timeout`  | `number`           | `30000`     | Maximum time to wait (ms)            |
+| `interval` | `number`           | `1000`      | Time between polls (ms)              |
+| `log`      | `string`           | `undefined` | Message logged on each poll          |
+| `error`    | `string`           | `undefined` | Custom error message for timeout     |
+| `post`     | `(result: T) => R` | `undefined` | Callback after successful poll       |
+| `delay`    | `number`           | `0`         | Initial delay before first poll (ms) |
 
-// CommandError - Command function threw
-Error: Command failed: Request failed with status 500
+### Error Types
 
-// PredicateError - Predicate function threw (not from assertions)
-Error: Predicate failed: Cannot read property 'status' of undefined
-```
+| Error Type              | When Thrown                             | Properties                               |
+| ----------------------- | --------------------------------------- | ---------------------------------------- |
+| `RecurseTimeoutError`   | Predicate never passed within timeout   | `lastCommandValue`, `lastPredicateError` |
+| `RecurseCommandError`   | Command function threw an error         | `cause` (original error)                 |
+| `RecursePredicateError` | Predicate threw (not assertion failure) | `cause` (original error)                 |
 
 ## Comparison with Vanilla Playwright
 
@@ -236,11 +359,11 @@ Error: Predicate failed: Cannot read property 'status' of undefined
 
 **Use recurse for:**
 
-- Background job completion
-- Webhook/event processing
-- Database eventual consistency
-- Cache propagation
-- State machine transitions
+- Background job completion
+- Webhook/event processing
+- Database eventual consistency
+- Cache propagation
+- State machine transitions
 
 **Stick with vanilla expect.poll for:**
 
@@ -250,13 +373,15 @@ Error: Predicate failed: Cannot read property 'status' of undefined
 
 ## Related Fragments
 
+- `api-testing-patterns.md` - Comprehensive pure API testing patterns
 - `api-request.md` - Combine for API endpoint polling
 - `overview.md` - Fixture composition patterns
 - `fixtures-composition.md` - Using with mergeTests
+- `contract-testing.md` - Contract testing with async verification
 
 ## Anti-Patterns
 
-**❌ Using hard waits instead of polling:**
+**DON'T use hard waits instead of polling:**
 
 ```typescript
 await page.click('#export');
@@ -264,33 +389,33 @@ await page.waitForTimeout(5000); // Arbitrary wait
 expect(await page.textContent('#status')).toBe('Ready');
 ```
 
-**✅ Poll for actual condition:**
+**DO poll for actual condition:**
 
 ```typescript
 await page.click('#export');
 await recurse(
   () => page.textContent('#status'),
   (status) => status === 'Ready',
-  { timeout: 10000 },
+  { timeout: 10000 }
 );
 ```
 
-**❌ Polling too frequently:**
+**DON'T poll too frequently:**
 
 ```typescript
 await recurse(
   () => apiRequest({ method: 'GET', path: '/status' }),
   (res) => res.body.ready,
-  { interval: 100 }, // Hammers API every 100ms!
+  { interval: 100 } // Hammers API every 100ms!
 );
 ```
 
-**✅ Reasonable interval for API calls:**
+**DO use reasonable interval for API calls:**
 
 ```typescript
 await recurse(
   () => apiRequest({ method: 'GET', path: '/status' }),
   (res) => res.body.ready,
-  { interval: 2000 }, // Check every 2 seconds (reasonable)
+  { interval: 2000 } // Check every 2 seconds (reasonable)
 );
 ```

+ 19 - 18
_bmad/bmm/testarch/tea-index.csv

@@ -1,33 +1,34 @@
 id,name,description,tags,fragment_file
 fixture-architecture,Fixture Architecture,"Composable fixture patterns (pure function → fixture → merge) and reuse rules","fixtures,architecture,playwright,cypress",knowledge/fixture-architecture.md
-network-first,Network-First Safeguards,"Intercept-before-navigate workflow, HAR capture, deterministic waits, edge mocking","network,stability,playwright,cypress",knowledge/network-first.md
-data-factories,Data Factories and API Setup,"Factories with overrides, API seeding, cleanup discipline","data,factories,setup,api",knowledge/data-factories.md
+network-first,Network-First Safeguards,"Intercept-before-navigate workflow, HAR capture, deterministic waits, edge mocking","network,stability,playwright,cypress,ui",knowledge/network-first.md
+data-factories,Data Factories and API Setup,"Factories with overrides, API seeding, cleanup discipline","data,factories,setup,api,backend,seeding",knowledge/data-factories.md
 component-tdd,Component TDD Loop,"Red→green→refactor workflow, provider isolation, accessibility assertions","component-testing,tdd,ui",knowledge/component-tdd.md
 playwright-config,Playwright Config Guardrails,"Environment switching, timeout standards, artifact outputs","playwright,config,env",knowledge/playwright-config.md
 ci-burn-in,CI and Burn-In Strategy,"Staged jobs, shard orchestration, burn-in loops, artifact policy","ci,automation,flakiness",knowledge/ci-burn-in.md
 selective-testing,Selective Test Execution,"Tag/grep usage, spec filters, diff-based runs, promotion rules","risk-based,selection,strategy",knowledge/selective-testing.md
 feature-flags,Feature Flag Governance,"Enum management, targeting helpers, cleanup, release checklists","feature-flags,governance,launchdarkly",knowledge/feature-flags.md
-contract-testing,Contract Testing Essentials,"Pact publishing, provider verification, resilience coverage","contract-testing,pact,api",knowledge/contract-testing.md
+contract-testing,Contract Testing Essentials,"Pact publishing, provider verification, resilience coverage","contract-testing,pact,api,backend,microservices,service-contract",knowledge/contract-testing.md
 email-auth,Email Authentication Testing,"Magic link extraction, state preservation, caching, negative flows","email-authentication,security,workflow",knowledge/email-auth.md
-error-handling,Error Handling Checks,"Scoped exception handling, retry validation, telemetry logging","resilience,error-handling,stability",knowledge/error-handling.md
-visual-debugging,Visual Debugging Toolkit,"Trace viewer usage, artifact expectations, accessibility integration","debugging,dx,tooling",knowledge/visual-debugging.md
+error-handling,Error Handling Checks,"Scoped exception handling, retry validation, telemetry logging","resilience,error-handling,stability,api,backend",knowledge/error-handling.md
+visual-debugging,Visual Debugging Toolkit,"Trace viewer usage, artifact expectations, accessibility integration","debugging,dx,tooling,ui",knowledge/visual-debugging.md
 risk-governance,Risk Governance,"Scoring matrix, category ownership, gate decision rules","risk,governance,gates",knowledge/risk-governance.md
 probability-impact,Probability and Impact Scale,"Shared definitions for scoring matrix and gate thresholds","risk,scoring,scale",knowledge/probability-impact.md
 test-quality,Test Quality Definition of Done,"Execution limits, isolation rules, green criteria","quality,definition-of-done,tests",knowledge/test-quality.md
 nfr-criteria,NFR Review Criteria,"Security, performance, reliability, maintainability status definitions","nfr,assessment,quality",knowledge/nfr-criteria.md
-test-levels,Test Levels Framework,"Guidelines for choosing unit, integration, or end-to-end coverage","testing,levels,selection",knowledge/test-levels-framework.md
+test-levels,Test Levels Framework,"Guidelines for choosing unit, integration, or end-to-end coverage","testing,levels,selection,api,backend,ui",knowledge/test-levels-framework.md
 test-priorities,Test Priorities Matrix,"P0–P3 criteria, coverage targets, execution ordering","testing,prioritization,risk",knowledge/test-priorities-matrix.md
 test-healing-patterns,Test Healing Patterns,"Common failure patterns and automated fixes","healing,debugging,patterns",knowledge/test-healing-patterns.md
-selector-resilience,Selector Resilience,"Robust selector strategies and debugging techniques","selectors,locators,debugging",knowledge/selector-resilience.md
+selector-resilience,Selector Resilience,"Robust selector strategies and debugging techniques","selectors,locators,debugging,ui",knowledge/selector-resilience.md
 timing-debugging,Timing Debugging,"Race condition identification and deterministic wait fixes","timing,async,debugging",knowledge/timing-debugging.md
-overview,Playwright Utils Overview,"Installation, design principles, fixture patterns","playwright-utils,fixtures",knowledge/overview.md
-api-request,API Request,"Typed HTTP client, schema validation","api,playwright-utils",knowledge/api-request.md
-network-recorder,Network Recorder,"HAR record/playback, CRUD detection","network,playwright-utils",knowledge/network-recorder.md
-auth-session,Auth Session,"Token persistence, multi-user","auth,playwright-utils",knowledge/auth-session.md
-intercept-network-call,Intercept Network Call,"Network spy/stub, JSON parsing","network,playwright-utils",knowledge/intercept-network-call.md
-recurse,Recurse Polling,"Async polling, condition waiting","polling,playwright-utils",knowledge/recurse.md
-log,Log Utility,"Report logging, structured output","logging,playwright-utils",knowledge/log.md
-file-utils,File Utilities,"CSV/XLSX/PDF/ZIP validation","files,playwright-utils",knowledge/file-utils.md
-burn-in,Burn-in Runner,"Smart test selection, git diff","ci,playwright-utils",knowledge/burn-in.md
-network-error-monitor,Network Error Monitor,"HTTP 4xx/5xx detection","monitoring,playwright-utils",knowledge/network-error-monitor.md
-fixtures-composition,Fixtures Composition,"mergeTests composition patterns","fixtures,playwright-utils",knowledge/fixtures-composition.md
+overview,Playwright Utils Overview,"Installation, design principles, fixture patterns for API and UI testing","playwright-utils,fixtures,api,backend,ui",knowledge/overview.md
+api-request,API Request,"Typed HTTP client, schema validation, retry logic for API and service testing","api,backend,service-testing,api-testing,playwright-utils",knowledge/api-request.md
+network-recorder,Network Recorder,"HAR record/playback, CRUD detection for offline UI testing","network,playwright-utils,ui,har",knowledge/network-recorder.md
+auth-session,Auth Session,"Token persistence, multi-user, API and browser authentication","auth,playwright-utils,api,backend,jwt,token",knowledge/auth-session.md
+intercept-network-call,Intercept Network Call,"Network spy/stub, JSON parsing for UI tests","network,playwright-utils,ui",knowledge/intercept-network-call.md
+recurse,Recurse Polling,"Async polling for API responses, background jobs, eventual consistency","polling,playwright-utils,api,backend,async,eventual-consistency",knowledge/recurse.md
+log,Log Utility,"Report logging, structured output for API and UI tests","logging,playwright-utils,api,ui",knowledge/log.md
+file-utils,File Utilities,"CSV/XLSX/PDF/ZIP validation for API exports and UI downloads","files,playwright-utils,api,backend,ui",knowledge/file-utils.md
+burn-in,Burn-in Runner,"Smart test selection, git diff for CI optimization","ci,playwright-utils",knowledge/burn-in.md
+network-error-monitor,Network Error Monitor,"HTTP 4xx/5xx detection for UI tests","monitoring,playwright-utils,ui",knowledge/network-error-monitor.md
+fixtures-composition,Fixtures Composition,"mergeTests composition patterns for combining utilities","fixtures,playwright-utils",knowledge/fixtures-composition.md
+api-testing-patterns,API Testing Patterns,"Pure API test patterns without browser: service testing, microservices, GraphQL","api,backend,service-testing,api-testing,microservices,graphql,no-browser",knowledge/api-testing-patterns.md

+ 3 - 8
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md

@@ -2,17 +2,12 @@
 name: 'step-01-init'
 description: 'Initialize the product brief workflow by detecting continuation state and setting up the document'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-01-init.md'
-nextStepFile: '{workflow_path}/steps/step-02-vision.md'
-workflowFile: '{workflow_path}/workflow.md'
+nextStepFile: './step-02-vision.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 
 # Template References
-productBriefTemplate: '{workflow_path}/product-brief.template.md'
+productBriefTemplate: '../product-brief.template.md'
 ---
 
 # Step 1: Product Brief Initialization
@@ -78,7 +73,7 @@ If the document exists and has frontmatter with `stepsCompleted`:
 
 **Continuation Protocol:**
 
-- **STOP immediately** and load `{workflow_path}/steps/step-01b-continue.md`
+- **STOP immediately** and load `./step-01b-continue.md`
 - Do not proceed with any initialization tasks
 - Let step-01b handle all continuation logic
 - This is an auto-proceed situation - no user choice needed

+ 0 - 5
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md

@@ -2,12 +2,7 @@
 name: 'step-01b-continue'
 description: 'Resume the product brief workflow from where it was left off, ensuring smooth continuation'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-01b-continue.md'
-workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 ---
 

+ 1 - 6
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md

@@ -2,13 +2,8 @@
 name: 'step-02-vision'
 description: 'Discover and define the core product vision, problem statement, and unique value proposition'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-02-vision.md'
-nextStepFile: '{workflow_path}/steps/step-03-users.md'
-workflowFile: '{workflow_path}/workflow.md'
+nextStepFile: './step-03-users.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 
 # Task References

+ 1 - 6
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md

@@ -2,13 +2,8 @@
 name: 'step-03-users'
 description: 'Define target users with rich personas and map their key interactions with the product'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-03-users.md'
-nextStepFile: '{workflow_path}/steps/step-04-metrics.md'
-workflowFile: '{workflow_path}/workflow.md'
+nextStepFile: './step-04-metrics.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 
 # Task References

+ 1 - 6
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md

@@ -2,13 +2,8 @@
 name: 'step-04-metrics'
 description: 'Define comprehensive success metrics that include user success, business objectives, and key performance indicators'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-04-metrics.md'
-nextStepFile: '{workflow_path}/steps/step-05-scope.md'
-workflowFile: '{workflow_path}/workflow.md'
+nextStepFile: './step-05-scope.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 
 # Task References

+ 1 - 6
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md

@@ -2,13 +2,8 @@
 name: 'step-05-scope'
 description: 'Define MVP scope with clear boundaries and outline future vision while managing scope creep'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-05-scope.md'
-nextStepFile: '{workflow_path}/steps/step-06-complete.md'
-workflowFile: '{workflow_path}/workflow.md'
+nextStepFile: './step-06-complete.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 
 # Task References

+ 0 - 5
_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md

@@ -2,12 +2,7 @@
 name: 'step-06-complete'
 description: 'Complete the product brief workflow, update status files, and suggest next steps for the project'
 
-# Path Definitions
-workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief'
-
 # File References
-thisStepFile: '{workflow_path}/steps/step-06-complete.md'
-workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md'
 ---
 

+ 96 - 9
_bmad/bmm/workflows/2-plan-workflows/prd/workflow.md

@@ -1,15 +1,70 @@
 ---
-name: create-prd
-description: Creates a comprehensive PRD through collaborative step-by-step discovery between two product managers working as peers.
+name: prd
+description: PRD tri-modal workflow - Create, Validate, or Edit comprehensive PRDs
 main_config: '{project-root}/_bmad/bmm/config.yaml'
+nextStep: './steps-c/step-01-init.md'
+validateWorkflow: './steps-v/step-v-01-discovery.md'
+editWorkflow: './steps-e/step-e-01-discovery.md'
 web_bundle: true
 ---
 
-# PRD Workflow
+# PRD Workflow (Tri-Modal)
 
-**Goal:** Create comprehensive PRDs through collaborative step-by-step discovery between two product managers working as peers.
+**Goal:** Create, Validate, or Edit comprehensive PRDs through structured workflows.
 
-**Your Role:** You are a product-focused PM facilitator collaborating with an expert peer. This is a partnership, not a client-vendor relationship. You bring structured thinking and facilitation skills, while the user brings domain expertise and product vision. Work together as equals. You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
+**Your Role:**
+- **Create Mode:** Product-focused PM facilitator collaborating with an expert peer
+- **Validate Mode:** Validation Architect and Quality Assurance Specialist
+- **Edit Mode:** PRD improvement specialist
+
+You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
+
+---
+
+## MODE DETERMINATION
+
+### Detect Workflow Mode
+
+Determine which mode to invoke based on:
+
+1. **Command/Invocation:**
+   - "create prd" or "new prd" → Create mode
+   - "validate prd" or "check prd" → Validate mode
+   - "edit prd" or "improve prd" → Edit mode
+
+2. **Context Detection:**
+   - If invoked with -c flag → Create mode
+   - If invoked with -v flag → Validate mode
+   - If invoked with -e flag → Edit mode
+
+3. **Menu Selection (if unclear):**
+
+If mode cannot be determined from invocation:
+"**PRD Workflow - Select Mode:**
+
+**[C] Create** - Create a new PRD from scratch
+**[V] Validate** - Validate an existing PRD against BMAD standards
+**[E] Edit** - Improve an existing PRD
+
+Which mode would you like?"
+
+Wait for user selection.
+
+### Route to Appropriate Workflow
+
+**IF Create Mode:**
+"**Create Mode: Creating a new PRD from scratch.**"
+Load, read entire file, then execute: `{nextStep}` (steps-c/step-01-init.md)
+
+**IF Validate Mode:**
+"**Validate Mode: Validating an existing PRD against BMAD standards.**"
+Prompt for PRD path: "Which PRD would you like to validate? Please provide the path to the PRD.md file."
+Then load, read entire file, and execute: `{validateWorkflow}` (steps-v/step-v-01-discovery.md)
+
+**IF Edit Mode:**
+"**Edit Mode: Improving an existing PRD.**"
+Prompt for PRD path: "Which PRD would you like to edit? Please provide the path to the PRD.md file."
+Then load, read entire file, and execute: `{editWorkflow}` (steps-e/step-e-01-discovery.md)
 
 ---
 
@@ -48,7 +103,27 @@ This uses **step-file architecture** for disciplined execution:
 
 ## INITIALIZATION SEQUENCE
 
-### 1. Configuration Loading
+### 1. Mode Determination
+
+**Check if mode was specified in the command invocation:**
+
+- If user invoked with "create prd" or "new prd" or "build prd" or "-c" or "--create" → Set mode to **create**
+- If user invoked with "validate prd" or "review prd" or "check prd" or "-v" or "--validate" → Set mode to **validate**
+- If user invoked with "edit prd" or "modify prd" or "improve prd" or "-e" or "--edit" → Set mode to **edit**
+
+**If mode is still unclear, ask user:**
+
+"**PRD Workflow - Select Mode:**
+
+**[C] Create** - Create a new PRD from scratch
+**[V] Validate** - Validate an existing PRD against BMAD standards
+**[E] Edit** - Improve an existing PRD
+
+Which mode would you like?"
+
+Wait for user selection.
+
+### 2. Configuration Loading
 
 Load and read full config from {main_config} and resolve:
 
@@ -56,8 +131,20 @@ Load and read full config from {main_config} and resolve:
 - `communication_language`, `document_output_language`, `user_skill_level`
 - `date` as system-generated current datetime
 
-### 2. First Step EXECUTION
+✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the configured `{communication_language}`.
+
+### 3. Route to Appropriate Workflow
+
+**IF mode == create:**
+"**Create Mode: Creating a new PRD from scratch.**"
+Load, read entire file, then execute `{nextStep}` (steps-c/step-01-init.md)
 
+**IF mode == validate:**
+"**Validate Mode: Validating an existing PRD against BMAD standards.**"
+Prompt for PRD path: "Which PRD would you like to validate? Please provide the path to the PRD.md file."
+Then load, read entire file, and execute `{validateWorkflow}` (steps-v/step-v-01-discovery.md)
 
-YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`.
-Load, read the full file and then execute `steps/step-01-init.md` to begin the workflow.
+**IF mode == edit:**
+"**Edit Mode: Improving an existing PRD.**"
+Prompt for PRD path: "Which PRD would you like to edit? Please provide the path to the PRD.md file."
+Then load, read entire file, and execute `{editWorkflow}` (steps-e/step-e-01-discovery.md)

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md

@@ -6,8 +6,8 @@ description: 'Discover and inventory all project documents, handling duplicates
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-01-document-discovery.md'
-nextStepFile: '{workflow_path}/steps/step-02-prd-analysis.md'
+thisStepFile: './step-01-document-discovery.md'
+nextStepFile: './step-02-prd-analysis.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 templateFile: '{workflow_path}/templates/readiness-report-template.md'

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md

@@ -6,8 +6,8 @@ description: 'Read and analyze PRD to extract all FRs and NFRs for coverage vali
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-02-prd-analysis.md'
-nextStepFile: '{workflow_path}/steps/step-03-epic-coverage-validation.md'
+thisStepFile: './step-02-prd-analysis.md'
+nextStepFile: './step-03-epic-coverage-validation.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 epicsFile: '{planning_artifacts}/*epic*.md' # Will be resolved to actual file

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md

@@ -6,8 +6,8 @@ description: 'Validate that all PRD FRs are covered in epics and stories'
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-03-epic-coverage-validation.md'
-nextStepFile: '{workflow_path}/steps/step-04-ux-alignment.md'
+thisStepFile: './step-03-epic-coverage-validation.md'
+nextStepFile: './step-04-ux-alignment.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 ---

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md

@@ -6,8 +6,8 @@ description: 'Check for UX document and validate alignment with PRD and Architec
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-04-ux-alignment.md'
-nextStepFile: '{workflow_path}/steps/step-05-epic-quality-review.md'
+thisStepFile: './step-04-ux-alignment.md'
+nextStepFile: './step-05-epic-quality-review.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 ---

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md

@@ -6,8 +6,8 @@ description: 'Validate epics and stories against create-epics-and-stories best p
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-05-epic-quality-review.md'
-nextStepFile: '{workflow_path}/steps/step-06-final-assessment.md'
+thisStepFile: './step-05-epic-quality-review.md'
+nextStepFile: './step-06-final-assessment.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 epicsBestPractices: '{project-root}/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories'

+ 1 - 1
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md

@@ -6,7 +6,7 @@ description: 'Compile final assessment and polish the readiness report'
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/implementation-readiness'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-06-final-assessment.md'
+thisStepFile: './step-06-final-assessment.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/implementation-readiness-report-{{date}}.md'
 ---

+ 1 - 1
_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md

@@ -52,4 +52,4 @@ Load and read full config from {project-root}/_bmad/bmm/config.yaml and resolve:
 
 ### 2. First Step EXECUTION
 
-Load, read the full file and then execute `{workflow_path}/steps/step-01-document-discovery.md` to begin the workflow.
+Load, read the full file and then execute `./step-01-document-discovery.md` to begin the workflow.

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md

@@ -6,8 +6,8 @@ description: 'Validate required documents exist and extract all requirements for
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-01-validate-prerequisites.md'
-nextStepFile: '{workflow_path}/steps/step-02-design-epics.md'
+thisStepFile: './step-01-validate-prerequisites.md'
+nextStepFile: './step-02-design-epics.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/epics.md'
 epicsTemplate: '{workflow_path}/templates/epics-template.md'

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md

@@ -6,8 +6,8 @@ description: 'Design and approve the epics_list that will organize all requireme
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-02-design-epics.md'
-nextStepFile: '{workflow_path}/steps/step-03-create-stories.md'
+thisStepFile: './step-02-design-epics.md'
+nextStepFile: './step-03-create-stories.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/epics.md'
 

+ 2 - 2
_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md

@@ -6,8 +6,8 @@ description: 'Generate all epics with their stories following the template struc
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-03-create-stories.md'
-nextStepFile: '{workflow_path}/steps/step-04-final-validation.md'
+thisStepFile: './step-03-create-stories.md'
+nextStepFile: './step-04-final-validation.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/epics.md'
 

+ 1 - 1
_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md

@@ -6,7 +6,7 @@ description: 'Validate complete coverage of all requirements and ensure implemen
 workflow_path: '{project-root}/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories'
 
 # File References
-thisStepFile: '{workflow_path}/steps/step-04-final-validation.md'
+thisStepFile: './step-04-final-validation.md'
 workflowFile: '{workflow_path}/workflow.md'
 outputFile: '{planning_artifacts}/epics.md'
 

+ 2 - 0
_bmad/bmm/workflows/4-implementation/code-review/instructions.xml

@@ -12,6 +12,8 @@
   <critical>Read EVERY file in the File List - verify implementation against story requirements</critical>
   <critical>Tasks marked complete but not done = CRITICAL finding</critical>
   <critical>Acceptance Criteria not implemented = HIGH severity finding</critical>
+  <critical>Do not review files that are not part of the application's source code. Always exclude the _bmad/ and _bmad-output/ folders from the review. Always exclude IDE and CLI configuration folders like .cursor/ and .windsurf/ and .claude/</critical>
+
 
   <step n="1" goal="Load story and discover changes">
     <action>Use provided {{story_path}} or ask user which story file to review</action>

+ 1 - 1
_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml

@@ -13,7 +13,7 @@ implementation_artifacts: "{config_source}:implementation_artifacts"
 planning_artifacts: "{config_source}:planning_artifacts"
 project_knowledge: "{config_source}:project_knowledge"
 output_folder: "{implementation_artifacts}"
-sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml"
+sprint_status: "{implementation_artifacts}/sprint-status.yaml"
 
 # Smart input file references - handles both whole docs and sharded docs
 # Priority: Whole document first, then sharded version

+ 2 - 2
_bmad/bmm/workflows/4-implementation/create-story/checklist.md

@@ -33,7 +33,7 @@ This is a COMPETITION to create the **ULTIMATE story context** that makes LLM de
 
 ### **When Running from Create-Story Workflow:**
 
-- The `{project_root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically:
+- The `{project-root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically:
   - Load this checklist file
   - Load the newly created story file (`{story_file_path}`)
   - Load workflow variables from `{installed_path}/workflow.yaml`
@@ -63,7 +63,7 @@ You will systematically re-do the entire story creation process, but with a crit
 
 1. **Load the workflow configuration**: `{installed_path}/workflow.yaml` for variable inclusion
 2. **Load the story file**: `{story_file_path}` (provided by user or discovered)
-3. **Load validation framework**: `{project_root}/_bmad/core/tasks/validate-workflow.xml`
+3. **Load validation framework**: `{project-root}/_bmad/core/tasks/validate-workflow.xml`
 4. **Extract metadata**: epic_num, story_num, story_key, story_title from story file
 5. **Resolve all workflow variables**: story_dir, output_folder, epics_file, architecture_file, etc.
 6. **Understand current status**: What story implementation guidance is currently provided?

+ 2 - 1
_bmad/bmm/workflows/4-implementation/create-story/instructions.xml

@@ -336,9 +336,10 @@
       1. Review the comprehensive story in {{story_file}}
       2. Run dev agents `dev-story` for optimized implementation
       3. Run `code-review` when complete (auto-marks done)
+      4. Optional: Run TEA `*automate` after `dev-story` to generate guardrail tests
 
       **The developer now has everything needed for flawless implementation!**
     </output>
   </step>
 
-</workflow>
+</workflow>

+ 1 - 1
_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml

@@ -20,7 +20,7 @@ validation: "{installed_path}/checklist.md"
 
 # Variables and inputs
 variables:
-  sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" # Primary source for story tracking
+  sprint_status: "{implementation_artifacts}/sprint-status.yaml" # Primary source for story tracking
   epics_file: "{planning_artifacts}/epics.md" # Enhanced epics+stories with BDD and source hints
   prd_file: "{planning_artifacts}/prd.md" # Fallback for requirements (if not in epics file)
   architecture_file: "{planning_artifacts}/architecture.md" # Fallback for constraints (if not in epics file)

+ 2 - 1
_bmad/bmm/workflows/4-implementation/dev-story/instructions.xml

@@ -397,6 +397,7 @@
       - Verify all acceptance criteria are met
       - Ensure deployment readiness if applicable
       - Run `code-review` workflow for peer review
+      - Optional: Run TEA `*automate` to expand guardrail tests
     </action>
 
     <output>💡 **Tip:** For best results, run `code-review` using a **different** LLM than the one that implemented this story.</output>
@@ -406,4 +407,4 @@
     <action>Remain flexible - allow user to choose their own path or ask for other assistance</action>
   </step>
 
-</workflow>
+</workflow>

+ 2 - 2
_bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml

@@ -19,14 +19,14 @@ instructions: "{installed_path}/instructions.md"
 
 # Inputs
 variables:
-  sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml"
+  sprint_status_file: "{implementation_artifacts}/sprint-status.yaml"
   tracking_system: "file-system"
 
 # Smart input file references
 input_file_patterns:
   sprint_status:
     description: "Sprint status file generated by sprint-planning"
-    whole: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml"
+    whole: "{implementation_artifacts}/sprint-status.yaml"
     load_strategy: "FULL_LOAD"
 
 # Standalone so IDE commands get generated

+ 6 - 6
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md

@@ -3,9 +3,9 @@ name: 'step-01-mode-detection'
 description: 'Determine execution mode (tech-spec vs direct), handle escalation, set state variables'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-01-mode-detection.md'
-nextStepFile_modeA: '{workflow_path}/steps/step-03-execute.md'
-nextStepFile_modeB: '{workflow_path}/steps/step-02-context-gathering.md'
+thisStepFile: './step-01-mode-detection.md'
+nextStepFile_modeA: './step-03-execute.md'
+nextStepFile_modeB: './step-02-context-gathering.md'
 ---
 
 # Step 1: Mode Detection
@@ -95,7 +95,7 @@ Present choice:
 **[e] Execute directly** - Start now
 ```
 
-- **[t]:** Direct user to `{create_tech_spec_workflow}`. **EXIT Quick Dev.**
+- **[t]:** Direct user to `{quick_spec_workflow}`. **EXIT Quick Dev.**
 - **[e]:** Ask for any additional guidance, then **NEXT:** Load `step-02-context-gathering.md`
 
 ### Escalation Triggered - Level 0-2
@@ -108,7 +108,7 @@ This looks like a focused feature with multiple components.
 **[e] Execute directly**
 ```
 
-- **[t]:** Direct to `{create_tech_spec_workflow}`. **EXIT Quick Dev.**
+- **[t]:** Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
 - **[w]:** Direct to `{workflow_init}`. **EXIT Quick Dev.**
 - **[e]:** Ask for guidance, then **NEXT:** Load `step-02-context-gathering.md`
 
@@ -123,7 +123,7 @@ This sounds like platform/system work.
 ```
 
 - **[w]:** Direct to `{workflow_init}`. **EXIT Quick Dev.**
-- **[t]:** Direct to `{create_tech_spec_workflow}`. **EXIT Quick Dev.**
+- **[t]:** Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
 - **[e]:** Ask for guidance, then **NEXT:** Load `step-02-context-gathering.md`
 
 ---

+ 2 - 2
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md

@@ -3,8 +3,8 @@ name: 'step-02-context-gathering'
 description: 'Quick context gathering for direct mode - identify files, patterns, dependencies'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-02-context-gathering.md'
-nextStepFile: '{workflow_path}/steps/step-03-execute.md'
+thisStepFile: './step-02-context-gathering.md'
+nextStepFile: './step-03-execute.md'
 ---
 
 # Step 2: Context Gathering (Direct Mode)

+ 2 - 2
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md

@@ -3,8 +3,8 @@ name: 'step-03-execute'
 description: 'Execute implementation - iterate through tasks, write code, run tests'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-03-execute.md'
-nextStepFile: '{workflow_path}/steps/step-04-self-check.md'
+thisStepFile: './step-03-execute.md'
+nextStepFile: './step-04-self-check.md'
 ---
 
 # Step 3: Execute Implementation

+ 2 - 2
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md

@@ -3,8 +3,8 @@ name: 'step-04-self-check'
 description: 'Self-audit implementation against tasks, tests, AC, and patterns'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-04-self-check.md'
-nextStepFile: '{workflow_path}/steps/step-05-adversarial-review.md'
+thisStepFile: './step-04-self-check.md'
+nextStepFile: './step-05-adversarial-review.md'
 ---
 
 # Step 4: Self-Check

+ 2 - 2
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md

@@ -3,8 +3,8 @@ name: 'step-05-adversarial-review'
 description: 'Construct diff and invoke adversarial review task'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-05-adversarial-review.md'
-nextStepFile: '{workflow_path}/steps/step-06-resolve-findings.md'
+thisStepFile: './step-05-adversarial-review.md'
+nextStepFile: './step-06-resolve-findings.md'
 ---
 
 # Step 5: Adversarial Code Review

+ 1 - 1
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md

@@ -3,7 +3,7 @@ name: 'step-06-resolve-findings'
 description: 'Handle review findings interactively, apply fixes, update tech-spec with final status'
 
 workflow_path: '{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev'
-thisStepFile: '{workflow_path}/steps/step-06-resolve-findings.md'
+thisStepFile: './step-06-resolve-findings.md'
 ---
 
 # Step 6: Resolve Findings

+ 1 - 1
_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md

@@ -40,7 +40,7 @@ Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
 
 ### Related Workflows
 
-- `create_tech_spec_workflow` = `{project-root}/_bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.yaml`
+- `quick_spec_workflow` = `{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md`
 - `workflow_init` = `{project-root}/_bmad/bmm/workflows/workflow-status/init/workflow.yaml`
 - `party_mode_exec` = `{project-root}/_bmad/core/workflows/party-mode/workflow.md`
 - `advanced_elicitation` = `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml`

+ 2 - 2
_bmad/core/config.yaml

@@ -1,7 +1,7 @@
 # CORE Module Configuration
 # Generated by BMAD installer
-# Version: 6.0.0-alpha.22
-# Date: 2026-01-07T11:38:43.396Z
+# Version: 6.0.0-alpha.23
+# Date: 2026-01-16T01:30:22.208Z
 
 user_name: Root
 communication_language: chinese

+ 2 - 2
_bmad/core/tasks/shard-doc.xml

@@ -1,4 +1,4 @@
-<tool id="_bmad/core/tasks/shard-doc" name="Shard Document"
+<task id="_bmad/core/tasks/shard-doc" name="Shard Document"
   description="Splits large markdown documents into smaller, organized files based on level 2 (default) sections" webskip="true"
   standalone="true">
   <objective>Split large markdown documents into smaller, organized files based on level 2 sections using @kayvan/markdown-tree-parser tool</objective>
@@ -106,4 +106,4 @@
   <halt-conditions critical="true">
     <i>HALT if npx command fails or produces no output files</i>
   </halt-conditions>
-</tool>
+</task>

+ 68 - 9
_bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md

@@ -1,19 +1,36 @@
 # Step 3: Interactive Technique Execution and Facilitation
 
+---
+advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml'
+---
+
 ## MANDATORY EXECUTION RULES (READ FIRST):
 
 - ✅ YOU ARE A CREATIVE FACILITATOR, engaging in genuine back-and-forth coaching
+- 🎯 AIM FOR 100+ IDEAS before suggesting organization - quantity unlocks quality (quality must grow as we progress)
+- 🔄 DEFAULT IS TO KEEP EXPLORING - only move to organization when user explicitly requests it
+- 🧠 **THOUGHT BEFORE INK (CoT):** Before generating each idea, you must internally reason: "What domain haven't we explored yet? What would make this idea surprising or 'uncomfortable' for the user?"
+- 🛡️ **ANTI-BIAS DOMAIN PIVOT:** Every 10 ideas, review existing themes and consciously pivot to an orthogonal domain (e.g., UX -> Business -> Physics -> Social Impact).
+- 🌡️ **SIMULATED TEMPERATURE:** Act as if your creativity is set to 0.85 - take wilder leaps and suggest "provocative" concepts.
+- ⏱️ Spend minimum 30-45 minutes in active ideation before offering to conclude
 - 🎯 EXECUTE ONE TECHNIQUE ELEMENT AT A TIME with interactive exploration
 - 📋 RESPOND DYNAMICALLY to user insights and build upon their ideas
 - 🔍 ADAPT FACILITATION based on user engagement and emerging directions
 - 💬 CREATE TRUE COLLABORATION, not question-answer sequences
 - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the `communication_language`
 
+## IDEA FORMAT TEMPLATE:
+
+Every idea you capture should follow this structure:
+**[Category #X]**: [Mnemonic Title]
+_Concept_: [2-3 sentence description]
+_Novelty_: [What makes this different from obvious solutions]
+
 ## EXECUTION PROTOCOLS:
 
 - 🎯 Present one technique element at a time for deep exploration
 - ⚠️ Ask "Continue with current technique?" before moving to next technique
-- 💾 Document insights and ideas as they emerge organically
+- 💾 Document insights and ideas using the **IDEA FORMAT TEMPLATE**
 - 📖 Follow user's creative energy and interests within technique structure
 - 🚫 FORBIDDEN rushing through technique elements without user engagement
 
@@ -142,6 +159,26 @@ Before moving to next technique element:
 
 **Remember:** At any time, just say **"next technique"** or **"move on"** and I'll immediately document our current progress and start the next technique!"
 
+### 4.1. Energy Checkpoint (After Every 4-5 Exchanges)
+
+**Periodic Check-In (DO NOT skip this):**
+
+"We've generated [X] ideas so far - great momentum!
+
+**Quick energy check:**
+
+- Want to **keep pushing** on this angle?
+- **Switch techniques** for a fresh perspective?
+- Or are you feeling like we've **thoroughly explored** this space?
+
+Remember: The goal is quantity first - we can organize later. What feels right?"
+
+**IMPORTANT:** Default to continuing exploration. Only suggest organization if:
+
+- User has explicitly asked to wrap up, OR
+- You've been exploring for 45+ minutes AND generated 100+ ideas, OR
+- User's energy is clearly depleted (short responses, "I don't know", etc.)
+
 ### 4a. Handle Immediate Technique Transition
 
 **When user says "next technique" or "move on":**
@@ -208,13 +245,15 @@ This connects beautifully with what we discovered earlier about _[previous conne
 
 **After Deep Exploration:**
 
-"Let me summarize what we've uncovered in this exploration:
+"Let me summarize what we've uncovered in this exploration using our **IDEA FORMAT TEMPLATE**:
 
 **Key Ideas Generated:**
 
-- **[Idea 1]:** [Context and development]
-- **[Idea 2]:** [How this emerged and evolved]
-- **[Idea 3]:** [User's insight plus your coaching contribution]
+**[Category #X]**: [Mnemonic Title]
+_Concept_: [2-3 sentence description]
+_Novelty_: [What makes this different from obvious solutions]
+
+(Repeat for all ideas generated)
 
 **Creative Breakthrough:** [Most innovative insight from the dialogue]
 
@@ -243,17 +282,29 @@ After final technique element:
 
 **Before we move to idea organization, any final thoughts about this technique? Any insights you want to make sure we carry forward?**
 
-**Ready to organize all these brilliant ideas and identify your top priorities?**
-[C] Continue - Organize ideas and create action plans
+**What would you like to do next?**
+
+[K] **Keep exploring this technique** - We're just getting warmed up!
+[T] **Try a different technique** - Fresh perspective on the same topic
+[A] **Go deeper on a specific idea** - Develop a promising concept further (Advanced Elicitation)
+[B] **Take a quick break** - Pause and return with fresh energy
+[C] **Move to organization** - Only when you feel we've thoroughly explored
 
-### 8. Handle Continue Selection
+**Default recommendation:** Unless you feel we've generated at least 100+ ideas, I suggest we keep exploring! The best insights often come after the obvious ideas are exhausted.
 
-#### If 'C' (Continue):
+### 8. Handle Menu Selection
+
+#### If 'C' (Move to organization):
 
 - **Append the technique execution content to `{output_folder}/analysis/brainstorming-session-{{date}}.md`**
 - **Update frontmatter:** `stepsCompleted: [1, 2, 3]`
 - **Load:** `./step-04-idea-organization.md`
 
+#### If 'K', 'T', 'A', or 'B' (Continue Exploring):
+
+- **Stay in Step 3** and restart the facilitation loop for the chosen path (or pause if break requested).
+- For option A, invoke Advanced Elicitation: `{advancedElicitationTask}`
+
 ### 9. Update Documentation
 
 Update frontmatter and document with interactive session insights:
@@ -279,6 +330,7 @@ facilitation_notes: [key insights about user's creative process]
 
 - **Interactive Focus:** [Main exploration directions]
 - **Key Breakthroughs:** [Major insights from coaching dialogue]
+
 - **User Creative Strengths:** [What user demonstrated]
 - **Energy Level:** [Observation about engagement]
 
@@ -308,6 +360,9 @@ When user selects 'C', append the content directly to `{output_folder}/analysis/
 
 ## SUCCESS METRICS:
 
+✅ Minimum 100 ideas generated before organization is offered
+✅ User explicitly confirms readiness to conclude (not AI-initiated)
+✅ Multiple technique exploration encouraged over single-technique completion
 ✅ True back-and-forth facilitation rather than question-answer format
 ✅ User's creative energy and interests guide technique direction
 ✅ Deep exploration of promising ideas before moving on
@@ -318,6 +373,10 @@ When user selects 'C', append the content directly to `{output_folder}/analysis/
 
 ## FAILURE MODES:
 
+❌ Offering organization after only one technique or <20 ideas
+❌ AI initiating conclusion without user explicitly requesting it
+❌ Treating technique completion as session completion signal
+❌ Rushing to document rather than staying in generative mode
 ❌ Rushing through technique elements without user engagement
 ❌ Not following user's creative energy and interests
 ❌ Missing opportunities to develop promising ideas deeper

+ 7 - 0
_bmad/core/workflows/brainstorming/workflow.md

@@ -10,6 +10,12 @@ context_file: '' # Optional context file path for project-specific guidance
 
 **Your Role:** You are a brainstorming facilitator and creative thinking guide. You bring structured creativity techniques, facilitation expertise, and an understanding of how to guide users through effective ideation processes that generate innovative ideas and breakthrough solutions. During this entire workflow it is critical that you speak to the user in the config loaded `communication_language`.
 
+**Critical Mindset:** Your job is to keep the user in generative exploration mode as long as possible. The best brainstorming sessions feel slightly uncomfortable - like you've pushed past the obvious ideas into truly novel territory. Resist the urge to organize or conclude. When in doubt, ask another question, try another technique, or dig deeper into a promising thread.
+
+**Anti-Bias Protocol:** LLMs naturally drift toward semantic clustering (sequential bias). To combat this, you MUST consciously shift your creative domain every 10 ideas. If you've been focusing on technical aspects, pivot to user experience, then to business viability, then to edge cases or "black swan" events. Force yourself into orthogonal categories to maintain true divergence.
+
+**Quantity Goal:** Aim for 100+ ideas before any organization. The first 20 ideas are usually obvious - the magic happens in ideas 50-100.
+
 ---
 
 ## WORKFLOW ARCHITECTURE
@@ -41,6 +47,7 @@ Load config from `{project-root}/_bmad/core/config.yaml` and resolve:
 - `brain_techniques_path` = `{installed_path}/brain-methods.csv`
 - `default_output_file` = `{output_folder}/analysis/brainstorming-session-{{date}}.md`
 - `context_file` = Optional context file path from workflow invocation for project-specific guidance
+- `advancedElicitationTask` = `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml`
 
 ---