groundswell 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/.claude/commands/subtask-planning/prp-base-create.md +120 -0
  2. package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
  3. package/.claude/commands/task-breakdown.md +94 -0
  4. package/.claude/system_prompts/task-breakdown.md +1 -0
  5. package/CHANGELOG.md +188 -0
  6. package/PRD.md +543 -0
  7. package/README.md +99 -5
  8. package/examples/README.md +15 -1
  9. package/examples/examples/11-reparenting-workflows.ts +269 -0
  10. package/examples/index.ts +4 -0
  11. package/package-lock.json +2398 -0
  12. package/package.json +3 -1
  13. package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
  14. package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
  15. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
  16. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
  17. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
  18. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
  19. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
  20. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
  21. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
  22. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
  23. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
  24. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
  25. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
  26. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
  27. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
  28. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
  29. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
  30. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
  31. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
  32. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
  33. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
  34. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
  35. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
  36. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
  37. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
  38. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
  39. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
  40. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
  41. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
  42. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
  43. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
  44. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
  45. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
  46. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
  47. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
  48. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
  49. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
  50. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
  51. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
  52. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
  53. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
  54. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
  55. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
  56. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
  57. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
  58. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
  59. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
  60. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
  61. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
  62. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
  63. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
  64. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
  65. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
  66. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
  67. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
  68. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
  69. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
  70. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
  71. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
  72. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
  73. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
  74. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
  75. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
  76. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
  77. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
  78. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
  79. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
  80. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
  81. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
  82. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
  83. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
  84. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
  85. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
  86. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
  87. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
  88. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
  89. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
  90. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
  91. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
  92. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
  93. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
  94. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
  95. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
  96. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
  97. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
  98. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
  99. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
  100. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
  101. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
  102. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
  103. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
  104. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
  105. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
  106. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
  107. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
  108. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
  109. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
  110. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
  111. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
  112. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
  113. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
  114. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
  115. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
  116. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
  117. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
  118. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
  119. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
  120. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
  121. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
  122. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
  123. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
  124. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
  125. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
  126. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
  127. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
  128. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
  129. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
  130. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
  131. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
  132. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
  133. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
  134. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
  135. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
  136. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
  137. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
  138. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
  139. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
  140. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
  141. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
  142. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
  143. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
  144. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
  145. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
  146. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
  147. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
  148. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
  149. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
  150. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
  151. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
  152. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
  153. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
  154. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
  155. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
  156. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
  157. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
  158. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
  159. package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
  160. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
  161. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
  162. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
  163. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
  164. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
  165. package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
  166. package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
  167. package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
  168. package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
  169. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
  170. package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
  171. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
  172. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
  173. package/src/__tests__/adversarial/edge-case.test.ts +703 -0
  174. package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
  175. package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
  176. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
  177. package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
  178. package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
  179. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
  180. package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
  181. package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
  182. package/src/__tests__/helpers/index.ts +18 -0
  183. package/src/__tests__/helpers/tree-verification.ts +257 -0
  184. package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
  185. package/src/__tests__/integration/observer-logging.test.ts +643 -0
  186. package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
  187. package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
  188. package/src/__tests__/unit/context.test.ts +79 -0
  189. package/src/__tests__/unit/logger.test.ts +293 -0
  190. package/src/__tests__/unit/observable.test.ts +321 -0
  191. package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
  192. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
  193. package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
  194. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
  195. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
  196. package/src/__tests__/unit/workflow.test.ts +277 -1
  197. package/src/core/agent.ts +21 -1
  198. package/src/core/logger.ts +27 -2
  199. package/src/core/workflow-context.ts +6 -4
  200. package/src/core/workflow.ts +252 -14
  201. package/src/debugger/tree-debugger.ts +52 -7
  202. package/src/decorators/task.ts +65 -2
  203. package/src/index.ts +4 -2
  204. package/src/types/decorators.ts +8 -1
  205. package/src/types/events.ts +1 -0
  206. package/src/utils/index.ts +1 -0
  207. package/src/utils/observable.ts +32 -3
  208. package/src/utils/workflow-error-utils.ts +56 -0
  209. package/tsconfig.json +1 -1
  210. package/llms_full.txt +0 -5890
  211. package/tasks.json +0 -0
  212. /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
  213. /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
  214. /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
  215. /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
  216. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
  217. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
  218. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
  219. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
  220. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
  221. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
  222. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
  223. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
  224. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
  225. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
  226. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
  227. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
  228. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
  229. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
  230. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
  231. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
  232. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
  233. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
  234. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
  235. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
  236. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
  237. /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
  238. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
  239. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
  240. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
  241. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
  242. /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
@@ -0,0 +1,668 @@
1
+ # Testing Error Aggregation Research Index
2
+
3
+ **Research Date:** 2026-01-12
4
+ **Task:** P1.M2.T2.S2 - Research testing patterns for error aggregation
5
+ **Project:** groundswell - Hierarchical workflow orchestration engine
6
+
7
+ ## Quick Start
8
+
9
+ **For immediate implementation:** Start with `02-error-merge-strategy-testing-guide.md`
10
+ **For comprehensive understanding:** Read `01-testing-aggregated-errors.md`
11
+ **For Promise.allSettled specifics:** Reference `03-promise-allsettled-testing-patterns.md`
12
+
13
+ ---
14
+
15
+ ## Research Documents
16
+
17
+ ### Core Research Documents
18
+
19
+ #### 1. Testing Aggregated Errors (Comprehensive Guide)
20
+ **File:** `01-testing-aggregated-errors.md` (29.5 KB)
21
+ **Sections:**
22
+ - Testing aggregated errors patterns
23
+ - Promise.allSettled error scenarios
24
+ - Error event emission testing
25
+ - Mock patterns for error scenarios
26
+ - Assertion patterns for complex error objects
27
+ - Testing library recommendations (Vitest vs Jest)
28
+ - Best practices (10 key practices)
29
+
30
+ **Key Takeaways:**
31
+ - ARRANGE-ACT-ASSERT test structure
32
+ - Type guards for WorkflowError validation
33
+ - Partial object matching with `toMatchObject`
34
+ - Event observer setup patterns
35
+ - Factory functions for mock errors
36
+
37
+ ---
38
+
39
+ #### 2. ErrorMergeStrategy Implementation & Testing Guide
40
+ **File:** `02-error-merge-strategy-testing-guide.md` (30.9 KB)
41
+ **Sections:**
42
+ - ErrorMergeStrategy interface specification
43
+ - Default error merger implementation
44
+ - Testing ErrorMergeStrategy functionality
45
+ - Integration with @Task decorator
46
+ - Complete test examples
47
+ - Best practices for error merging
48
+
49
+ **Key Takeaways:**
50
+ - Default merger aggregates: message, original errors, workflowId, stack, logs
51
+ - Custom combine function support
52
+ - maxMergeDepth parameter for limiting recursion
53
+ - Backward compatibility: disabled throws first error only
54
+ - Complete @Task decorator integration code
55
+
56
+ **Code Provided:**
57
+ ```typescript
58
+ // Default merger implementation
59
+ export function mergeWorkflowErrors(errors: WorkflowError[]): WorkflowError {
60
+ // Aggregates message, stack, logs from all errors
61
+ // Uses first error's workflowId and state
62
+ // Returns merged WorkflowError
63
+ }
64
+
65
+ // @Task decorator integration
66
+ if (opts.errorMergeStrategy?.enabled) {
67
+ const mergedError = opts.errorMergeStrategy.combine
68
+ ? opts.errorMergeStrategy.combine(errors)
69
+ : mergeWorkflowErrors(errors);
70
+
71
+ wf.emitEvent({ type: 'error', node: wf.node, error: mergedError });
72
+ throw mergedError;
73
+ }
74
+ ```
75
+
76
+ ---
77
+
78
+ #### 3. Promise.allSettled Testing Patterns
79
+ **File:** `03-promise-allsettled-testing-patterns.md` (24.4 KB)
80
+ **Sections:**
81
+ - Promise.allSettled basics
82
+ - Type guards for PromiseSettledResult
83
+ - Testing patterns (basic, all-rejected, all-fulfilled, empty)
84
+ - Workflow-specific scenarios
85
+ - Error collection strategies
86
+ - Performance & concurrency testing
87
+ - Edge cases
88
+
89
+ **Key Takeaways:**
90
+ - Type guards: `isRejected` and `isFulfilled`
91
+ - Error extraction patterns
92
+ - Orphan prevention testing
93
+ - Concurrency verification with timestamps
94
+ - Performance testing with large batches (100+ workflows)
95
+
96
+ **Code Provided:**
97
+ ```typescript
98
+ // Type guards
99
+ function isRejected(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult {
100
+ return result.status === 'rejected';
101
+ }
102
+
103
+ // Extract errors
104
+ function extractErrors(results: PromiseSettledResult<unknown>[]): unknown[] {
105
+ return results.filter(isRejected).map(r => r.reason);
106
+ }
107
+
108
+ // Orphan prevention test
109
+ const completions = new Map<string, 'success' | 'failure'>();
110
+ // Track all workflow completions
111
+ expect(completions.size).toBe(totalWorkflows);
112
+ ```
113
+
114
+ ---
115
+
116
+ ### Additional Reference Materials
117
+
118
+ #### 4. TypeScript Error Aggregation Patterns
119
+ **File:** `01_typescript_error_aggregation_patterns.md` (20.9 KB)
120
+ **Content:**
121
+ - TypeScript-specific patterns for error aggregation
122
+ - Type safety in error handling
123
+ - Generic error aggregation utilities
124
+ - Type-level error handling
125
+
126
+ ---
127
+
128
+ #### 5. Aggregate Error Patterns
129
+ **File:** `02_aggregate_error_patterns.md` (27.3 KB)
130
+ **Content:**
131
+ - Aggregate error design patterns
132
+ - Error collection strategies
133
+ - Error hierarchy management
134
+ - Best practices for aggregate errors
135
+
136
+ ---
137
+
138
+ #### 6. Error Merging Strategies
139
+ **File:** `03_error_merging_strategies.md` (24.8 KB)
140
+ **Content:**
141
+ - Different error merging approaches
142
+ - Strategy pattern implementation
143
+ - Custom error merger examples
144
+ - Error deduplication techniques
145
+
146
+ ---
147
+
148
+ #### 7. GitHub & StackOverflow Examples
149
+ **File:** `04_github_stackoverflow_examples.md` (24.1 KB)
150
+ **Content:**
151
+ - Real-world examples from GitHub
152
+ - StackOverflow Q&A on error aggregation
153
+ - Community patterns and solutions
154
+ - Common pitfalls and how to avoid them
155
+
156
+ ---
157
+
158
+ ## Project-Specific Context
159
+
160
+ ### Implementation Files
161
+
162
+ **Current Implementation:**
163
+ ```typescript
164
+ // File: /home/dustin/projects/groundswell/src/decorators/task.ts
165
+ // Lines 111-122: Promise.allSettled implementation
166
+
167
+ const results = await Promise.allSettled(runnable.map((w) => w.run()));
168
+
169
+ const rejected = results.filter(
170
+ (r): r is PromiseRejectedResult => r.status === 'rejected'
171
+ );
172
+
173
+ if (rejected.length > 0) {
174
+ throw rejected[0].reason; // Currently throws first error only
175
+ }
176
+ ```
177
+
178
+ **Required Changes for P1.M2.T2.S2:**
179
+ 1. Check if `opts.errorMergeStrategy?.enabled` is true
180
+ 2. Collect all errors from `rejected` results
181
+ 3. Call custom or default merger
182
+ 4. Emit error event with merged error
183
+ 5. Throw merged error instead of first error
184
+
185
+ ---
186
+
187
+ ### Type Definitions
188
+
189
+ **ErrorMergeStrategy Interface:**
190
+ ```typescript
191
+ // File: /home/dustin/projects/groundswell/src/types/error-strategy.ts
192
+ export interface ErrorMergeStrategy {
193
+ enabled: boolean;
194
+ maxMergeDepth?: number;
195
+ combine?(errors: WorkflowError[]): WorkflowError;
196
+ }
197
+ ```
198
+
199
+ **WorkflowError Interface:**
200
+ ```typescript
201
+ // File: /home/dustin/projects/groundswell/src/types/error.ts
202
+ export interface WorkflowError {
203
+ message: string;
204
+ original: unknown;
205
+ workflowId: string;
206
+ stack?: string;
207
+ state: SerializedWorkflowState;
208
+ logs: LogEntry[];
209
+ }
210
+ ```
211
+
212
+ ---
213
+
214
+ ### Existing Tests
215
+
216
+ **Concurrent Task Failures Test:**
217
+ ```typescript
218
+ // File: /home/dustin/projects/groundswell/src/__tests__/adversarial/concurrent-task-failures.test.ts
219
+ // 571 lines of comprehensive Promise.allSettled tests
220
+
221
+ describe('@Task decorator concurrent failure scenarios', () => {
222
+ // Single child failure
223
+ // Multiple concurrent failures
224
+ // Mixed success/failure scenarios
225
+ // All children failing
226
+ // No orphaned workflows
227
+ // Event emission verification
228
+ // Error collection correctness
229
+ });
230
+ ```
231
+
232
+ ---
233
+
234
+ ## Implementation Workflow
235
+
236
+ ### Step 1: Create Default Error Merger
237
+
238
+ **File to create:** `src/utils/error-merger.ts`
239
+
240
+ ```typescript
241
+ import type { WorkflowError } from '../types/error.js';
242
+
243
+ export function mergeWorkflowErrors(errors: WorkflowError[]): WorkflowError {
244
+ if (errors.length === 0) {
245
+ throw new Error('Cannot merge empty error array');
246
+ }
247
+
248
+ if (errors.length === 1) {
249
+ return errors[0];
250
+ }
251
+
252
+ const message = `${errors.length} concurrent error${errors.length > 1 ? 's' : ''}: ` +
253
+ errors.map((e, i) => `[${i + 1}] ${e.message}`).join('; ');
254
+
255
+ const stack = errors
256
+ .map((e, i) => `=== Error ${i + 1} ===\n${e.stack || 'No stack trace'}`)
257
+ .join('\n\n');
258
+
259
+ const logs = errors.flatMap(e => e.logs);
260
+ const workflowId = errors[0].workflowId;
261
+ const state = errors[0].state;
262
+
263
+ return {
264
+ message,
265
+ original: errors,
266
+ workflowId,
267
+ stack,
268
+ state,
269
+ logs,
270
+ };
271
+ }
272
+ ```
273
+
274
+ **Tests to create:** `src/__tests__/unit/error-merger.test.ts`
275
+
276
+ ---
277
+
278
+ ### Step 2: Update @Task Decorator
279
+
280
+ **File to edit:** `src/decorators/task.ts`
281
+
282
+ **Changes at lines 118-120:**
283
+
284
+ ```typescript
285
+ if (rejected.length > 0) {
286
+ // Convert to WorkflowError
287
+ const errors = rejected.map((r) => {
288
+ const error = r.reason;
289
+ return isWorkflowError(error)
290
+ ? error
291
+ : convertToWorkflowError(error, wf.id);
292
+ });
293
+
294
+ // Apply error merge strategy
295
+ if (opts.errorMergeStrategy?.enabled) {
296
+ const mergedError = opts.errorMergeStrategy.combine
297
+ ? opts.errorMergeStrategy.combine(errors)
298
+ : mergeWorkflowErrors(errors);
299
+
300
+ wf.emitEvent({
301
+ type: 'error',
302
+ node: wf.node,
303
+ error: mergedError,
304
+ });
305
+
306
+ throw mergedError;
307
+ } else {
308
+ // Backward compatible: throw first error
309
+ wf.emitEvent({
310
+ type: 'error',
311
+ node: wf.node,
312
+ error: errors[0],
313
+ });
314
+
315
+ throw errors[0];
316
+ }
317
+ }
318
+ ```
319
+
320
+ ---
321
+
322
+ ### Step 3: Create Test Suite
323
+
324
+ **File to create:** `src/__tests__/unit/error-merge-strategy.test.ts`
325
+
326
+ **Test coverage:**
327
+ - Default merger functionality
328
+ - Empty error array (throws)
329
+ - Single error (returned unchanged)
330
+ - Two errors (merged correctly)
331
+ - Multiple errors (3, 5, 10+)
332
+ - Message aggregation
333
+ - Stack trace concatenation
334
+ - Log flattening
335
+ - Parent context preservation
336
+ - Custom combine function
337
+ - maxMergeDepth parameter
338
+ - Backward compatibility
339
+ - Integration with @Task decorator
340
+
341
+ ---
342
+
343
+ ### Step 4: Run Tests
344
+
345
+ ```bash
346
+ # Run all tests
347
+ npm test
348
+
349
+ # Run specific test file
350
+ npx vitest run src/__tests__/unit/error-merge-strategy.test.ts
351
+
352
+ # Watch mode
353
+ npm run test:watch
354
+
355
+ # Coverage
356
+ npm run test:coverage
357
+ ```
358
+
359
+ **Expected outcome:**
360
+ - All 344+ existing tests pass
361
+ - New tests pass with 100% coverage
362
+ - No regressions introduced
363
+
364
+ ---
365
+
366
+ ## Testing Patterns Summary
367
+
368
+ ### 1. Basic Error Aggregation Test
369
+
370
+ ```typescript
371
+ it('should aggregate errors from multiple concurrent workflows', async () => {
372
+ // ARRANGE
373
+ const parent = new ParentWorkflow('Parent');
374
+
375
+ // ACT
376
+ const result = await parent.run();
377
+
378
+ // ASSERT
379
+ expect(result.message).toContain('3 concurrent errors');
380
+ expect(result.logs).toHaveLength(3);
381
+ });
382
+ ```
383
+
384
+ ### 2. Custom Merger Test
385
+
386
+ ```typescript
387
+ it('should use custom error merge function', async () => {
388
+ const customMerger = (errors: WorkflowError[]) => ({
389
+ message: `CUSTOM: ${errors.length} errors`,
390
+ original: errors,
391
+ workflowId: 'custom',
392
+ state: {} as any,
393
+ logs: [],
394
+ });
395
+
396
+ const workflow = new TestWorkflow('Test');
397
+ const result = await workflow.run();
398
+
399
+ expect(result.message).toBe('CUSTOM: 3 errors');
400
+ });
401
+ ```
402
+
403
+ ### 3. Backward Compatibility Test
404
+
405
+ ```typescript
406
+ it('should throw first error when disabled', async () => {
407
+ const workflow = new TestWorkflow('Test');
408
+ const result = await workflow.run();
409
+
410
+ expect(result.message).toContain('First error');
411
+ expect(result.message).not.toContain('Second error');
412
+ });
413
+ ```
414
+
415
+ ### 4. Event Emission Test
416
+
417
+ ```typescript
418
+ it('should emit error event with merged error', async () => {
419
+ const events: WorkflowEvent[] = [];
420
+ const workflow = new TestWorkflow('Test');
421
+
422
+ workflow.addObserver({
423
+ onEvent: (e) => events.push(e),
424
+ onLog: () => {},
425
+ onStateUpdated: () => {},
426
+ onTreeChanged: () => {},
427
+ });
428
+
429
+ await workflow.run();
430
+
431
+ const errorEvents = events.filter(e => e.type === 'error');
432
+ expect(errorEvents[0].error.message).toContain('concurrent errors');
433
+ });
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Helper Functions
439
+
440
+ ### Error Creation Helpers
441
+
442
+ ```typescript
443
+ function createMockError(overrides?: Partial<WorkflowError>): WorkflowError {
444
+ return {
445
+ message: 'Mock error',
446
+ original: new Error('Mock'),
447
+ workflowId: 'mock-workflow',
448
+ state: {} as any,
449
+ logs: [],
450
+ ...overrides
451
+ };
452
+ }
453
+
454
+ function createFailingWorkflow(parent: Workflow, name: string, errorMessage: string): Workflow {
455
+ return new (class extends Workflow {
456
+ async run() {
457
+ throw new Error(errorMessage);
458
+ }
459
+ })(name, parent);
460
+ }
461
+ ```
462
+
463
+ ### Type Guards
464
+
465
+ ```typescript
466
+ function isWorkflowError(error: unknown): error is WorkflowError {
467
+ return (
468
+ typeof error === 'object' &&
469
+ error !== null &&
470
+ 'message' in error &&
471
+ 'workflowId' in error &&
472
+ 'logs' in error
473
+ );
474
+ }
475
+
476
+ function isRejected(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult {
477
+ return result.status === 'rejected';
478
+ }
479
+
480
+ function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
481
+ return result.status === 'fulfilled';
482
+ }
483
+ ```
484
+
485
+ ### Test Setup Helpers
486
+
487
+ ```typescript
488
+ function setupEventObserver(workflow: Workflow): WorkflowEvent[] {
489
+ const events: WorkflowEvent[] = [];
490
+ workflow.addObserver({
491
+ onLog: () => {},
492
+ onEvent: (e) => events.push(e),
493
+ onStateUpdated: () => {},
494
+ onTreeChanged: () => {},
495
+ });
496
+ return events;
497
+ }
498
+ ```
499
+
500
+ ---
501
+
502
+ ## Best Practices Checklist
503
+
504
+ ### Test Structure
505
+ - [ ] Use nested `describe` blocks for organization
506
+ - [ ] Follow ARRANGE-ACT-ASSERT pattern
507
+ - [ ] Keep tests independent (no shared state)
508
+ - [ ] Use descriptive test names
509
+
510
+ ### Error Testing
511
+ - [ ] Test empty, single, and multiple error scenarios
512
+ - [ ] Verify all error properties are preserved
513
+ - [ ] Test both default and custom mergers
514
+ - [ ] Ensure backward compatibility
515
+
516
+ ### Assertions
517
+ - [ ] Use `toMatchObject` for partial matching
518
+ - [ ] Use type guards for complex objects
519
+ - [ ] Test both positive and negative cases
520
+ - [ ] Include edge cases (0 errors, 1 error, 100+ errors)
521
+
522
+ ### Performance
523
+ - [ ] Test with large error counts (10+, 100+)
524
+ - [ ] Verify concurrent execution (not sequential)
525
+ - [ ] Check for memory leaks
526
+ - [ ] Ensure no hanging promises
527
+
528
+ ### Event Testing
529
+ - [ ] Verify error events are emitted
530
+ - [ ] Check event structure is correct
531
+ - [ ] Ensure events propagate to observers
532
+ - [ ] Test event ordering when relevant
533
+
534
+ ---
535
+
536
+ ## Common Pitfalls
537
+
538
+ ### 1. Not Testing Empty Array
539
+ ```typescript
540
+ // Bad: Doesn't test empty case
541
+ it('should merge errors', () => {
542
+ const result = mergeErrors([error1, error2]);
543
+ expect(result).toBeDefined();
544
+ });
545
+
546
+ // Good: Tests empty case
547
+ it('should throw on empty array', () => {
548
+ expect(() => mergeErrors([])).toThrow();
549
+ });
550
+ ```
551
+
552
+ ### 2. Only Testing with 2 Errors
553
+ ```typescript
554
+ // Bad: Only tests 2 errors (edge case)
555
+ it('should merge two errors', () => {
556
+ const result = mergeErrors([error1, error2]);
557
+ expect(result.message).toContain('2 errors');
558
+ });
559
+
560
+ // Good: Tests 3+ errors (tests pluralization)
561
+ it('should merge multiple errors', () => {
562
+ const result = mergeErrors([error1, error2, error3]);
563
+ expect(result.message).toContain('3 concurrent errors');
564
+ });
565
+ ```
566
+
567
+ ### 3. Not Verifying All Properties
568
+ ```typescript
569
+ // Bad: Only checks message
570
+ it('should merge errors', () => {
571
+ const result = mergeErrors([error1, error2]);
572
+ expect(result.message).toBeDefined();
573
+ });
574
+
575
+ // Good: Checks all properties
576
+ it('should merge all error properties', () => {
577
+ const result = mergeErrors([error1, error2]);
578
+ expect(result.message).toBeDefined();
579
+ expect(result.workflowId).toBeDefined();
580
+ expect(result.stack).toBeDefined();
581
+ expect(result.logs).toBeDefined();
582
+ expect(result.original).toEqual([error1, error2]);
583
+ });
584
+ ```
585
+
586
+ ### 4. Not Testing Backward Compatibility
587
+ ```typescript
588
+ // Bad: Only tests new behavior
589
+ it('should merge errors when enabled', async () => {
590
+ const workflow = new TestWorkflow('Test');
591
+ const result = await workflow.run();
592
+ expect(result.message).toContain('concurrent errors');
593
+ });
594
+
595
+ // Good: Tests both old and new behavior
596
+ it('should maintain backward compatibility when disabled', async () => {
597
+ const workflow = new TestWorkflow('Test');
598
+ const result = await workflow.run();
599
+ expect(result.message).not.toContain('concurrent errors');
600
+ expect(result.message).toContain('First error');
601
+ });
602
+ ```
603
+
604
+ ---
605
+
606
+ ## External Resources
607
+
608
+ ### Documentation
609
+ - **Vitest Guide:** https://vitest.dev/guide/
610
+ - **Promise.allSettled MDN:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
611
+ - **TypeScript Handbook:** https://www.typescriptlang.org/docs/handbook/intro.html
612
+
613
+ ### Related Projects
614
+ - **Jest:** https://jestjs.io/
615
+ - **Testing Library:** https://testing-library.com/
616
+
617
+ ### Design Patterns
618
+ - **Strategy Pattern:** Pluggable error merge strategies
619
+ - **Observer Pattern:** Error event emission
620
+ - **Aggregate Pattern:** Combining multiple errors
621
+
622
+ ---
623
+
624
+ ## Success Criteria
625
+
626
+ ### Functional Requirements
627
+ - ✅ ErrorMergeStrategy interface in TaskOptions
628
+ - ✅ Default error merger implemented
629
+ - ✅ Custom combine function supported
630
+ - ✅ maxMergeDepth parameter working
631
+ - ✅ Error events emitted with merged errors
632
+ - ✅ Backward compatible (disabled throws first error)
633
+
634
+ ### Test Requirements
635
+ - ✅ All 344+ existing tests pass
636
+ - ✅ New tests have 100% coverage
637
+ - ✅ No performance degradation
638
+ - ✅ No breaking changes
639
+
640
+ ### Documentation Requirements
641
+ - ✅ JSDoc comments on public functions
642
+ - ✅ Code examples in tests
643
+ - ✅ PRD updated if needed
644
+
645
+ ---
646
+
647
+ ## Next Steps
648
+
649
+ 1. **Implement mergeWorkflowErrors()** in `src/utils/error-merger.ts`
650
+ 2. **Update @Task decorator** to use error merge strategy
651
+ 3. **Create comprehensive test suite** in `src/__tests__/unit/error-merge-strategy.test.ts`
652
+ 4. **Run all tests** to ensure no regressions
653
+ 5. **Update documentation** with new behavior
654
+
655
+ ---
656
+
657
+ ## Questions?
658
+
659
+ Refer to individual research documents for detailed information:
660
+ - Implementation guide: `02-error-merge-strategy-testing-guide.md`
661
+ - Testing patterns: `01-testing-aggregated-errors.md`
662
+ - Promise.allSettled: `03-promise-allsettled-testing-patterns.md`
663
+
664
+ ---
665
+
666
+ **Last Updated:** 2026-01-12
667
+ **Status:** Research Complete
668
+ **Next Phase:** Implementation (P1.M2.T2.S2)