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,518 @@
1
+ # Product Requirement Prompt (PRP): Default Error Merger Implementation
2
+
3
+ **Work Item:** P1.M2.T2.S3 - Create default error merger implementation
4
+
5
+ ---
6
+
7
+ ## Goal
8
+
9
+ **Feature Goal:** Extract and modularize the error merging logic from `src/decorators/task.ts` into a reusable utility function for concurrent workflow error aggregation.
10
+
11
+ **Deliverable:** A standalone `mergeWorkflowErrors()` utility function exported from `src/utils/workflow-error-utils.ts` that aggregates multiple `WorkflowError` objects into a single merged error.
12
+
13
+ **Success Definition:**
14
+ 1. `mergeWorkflowErrors()` function is created and exported from `src/utils/workflow-error-utils.ts`
15
+ 2. The function aggregates errors according to the specification in `plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md`
16
+ 3. The existing `defaultErrorMerger` in `src/decorators/task.ts` is replaced with an import from the new utility
17
+ 4. Tests pass validating the merge behavior
18
+ 5. The function is exported from `src/utils/index.ts` and `src/index.ts` for public API access
19
+
20
+ ## Why
21
+
22
+ - **Maintainability:** Error merging logic currently lives inline in the Task decorator. Extracting it to a utility enables reuse and independent testing.
23
+ - **Testability:** A standalone function is easier to unit test than inline decorator logic.
24
+ - **API Completeness:** Users may want to merge errors programmatically for custom error handling scenarios.
25
+ - **Consistency:** Other utilities (generateId, Observable) live in `src/utils/`, making this the correct home for error utilities.
26
+ - **Previous Work:** The `defaultErrorMerger` function already exists in `src/decorators/task.ts` (lines 23-56) with a comment indicating it should be extracted in this subtask.
27
+
28
+ ## What
29
+
30
+ Create a `mergeWorkflowErrors()` utility function that:
31
+
32
+ 1. **Accepts:** An array of `WorkflowError` objects, task name, parent workflow ID, and total children count
33
+ 2. **Aggregates:**
34
+ - Message: `"X of Y concurrent child workflows failed in task 'taskName'"`
35
+ - All unique workflow IDs that failed
36
+ - All logs from all errors (flattened)
37
+ - First error's stack trace
38
+ - First error's state snapshot
39
+ - Original errors array in the `original` field with metadata
40
+ 3. **Returns:** A single merged `WorkflowError` object
41
+
42
+ ### Success Criteria
43
+
44
+ - [ ] `mergeWorkflowErrors()` function created in `src/utils/workflow-error-utils.ts`
45
+ - [ ] Function aggregates messages with count and task name
46
+ - [ ] Function collects unique failed workflow IDs
47
+ - [ ] Function flattens all logs arrays
48
+ - [ ] Function uses first error's stack and state
49
+ - [ ] Function includes original errors array in metadata
50
+ - [ ] Function exported from `src/utils/index.ts`
51
+ - [ ] Function exported from `src/index.ts`
52
+ - [ ] `defaultErrorMerger` in `src/decorators/task.ts` replaced with import
53
+ - [ ] Unit tests created and passing
54
+ - [ ] Existing tests still pass (no regressions)
55
+
56
+ ---
57
+
58
+ ## All Needed Context
59
+
60
+ ### Context Completeness Check
61
+
62
+ **No Prior Knowledge Test:** If someone knew nothing about this codebase, they would have:
63
+ - The exact `WorkflowError` interface structure
64
+ - The exact `ErrorMergeStrategy` interface structure
65
+ - The existing `defaultErrorMerger` implementation to reference
66
+ - Test patterns used in the codebase
67
+ - File locations and naming conventions
68
+ - Export patterns from the main index
69
+
70
+ ### Documentation & References
71
+
72
+ ```yaml
73
+ # MUST READ - Include these in your context window
74
+ - file: /home/dustin/projects/groundswell/src/types/error.ts
75
+ why: Defines WorkflowError interface with all required fields (message, original, workflowId, stack, state, logs)
76
+ critical: The merge function must return a WorkflowError that matches this interface exactly
77
+
78
+ - file: /home/dustin/projects/groundswell/src/types/error-strategy.ts
79
+ why: Defines ErrorMergeStrategy interface for understanding the merge strategy pattern
80
+ gotcha: The combine() function signature takes WorkflowError[] and returns WorkflowError
81
+
82
+ - file: /home/dustin/projects/groundswell/src/decorators/task.ts (lines 18-56)
83
+ why: Contains the existing defaultErrorMerger implementation that should be extracted
84
+ pattern: Use this as the reference implementation - it already implements the required merge logic
85
+ gotcha: The comment on line 21 explicitly states "This will be extracted to src/utils/error-merger.ts in P1.M2.T2.S3"
86
+ critical: This is the source implementation - copy the logic structure exactly
87
+
88
+ - file: /home/dustin/projects/groundswell/src/decorators/task.ts (lines 160-177)
89
+ why: Shows how defaultErrorMerger is currently called - maintain this call signature
90
+ pattern: defaultErrorMerger(errors, taskName, parentWorkflowId, totalChildren)
91
+
92
+ - file: /home/dustin/projects/groundswell/src/utils/index.ts
93
+ why: Shows the export pattern for utils - add mergeWorkflowErrors export here
94
+ pattern: export { generateId } from './id.js'; - follow this pattern
95
+
96
+ - file: /home/dustin/projects/groundswell/src/index.ts (lines 84-86)
97
+ why: Shows how utils are re-exported from main index
98
+ pattern: export { generateId } from './utils/id.js'; - follow this pattern
99
+
100
+ - file: /home/dustin/projects/groundswell/src/types/logging.ts
101
+ why: Defines LogEntry type which is used in WorkflowError.logs array
102
+ gotcha: logs is LogEntry[] - use flatMap to flatten multiple log arrays
103
+
104
+ - file: /home/dustin/projects/groundswell/src/types/snapshot.ts
105
+ why: Defines SerializedWorkflowState type used in WorkflowError.state
106
+ gotcha: state is Record<string, unknown> - use first error's state or empty object
107
+
108
+ - file: /home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md (lines 207-217)
109
+ why: Contains the recommended default merger implementation from architecture doc
110
+ critical: This documents the intended merge behavior per the PRD specification
111
+
112
+ - docfile: /home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md (lines 72-90)
113
+ why: Documents Issue 3 about Missing Error Merge Strategy Implementation
114
+ section: "### Issue 3: Missing Error Merge Strategy Implementation"
115
+ ```
116
+
117
+ ### Current Codebase Tree (relevant portions)
118
+
119
+ ```bash
120
+ src/
121
+ ├── core/
122
+ │ └── workflow.ts # Workflow class, error handling
123
+ ├── decorators/
124
+ │ ├── index.ts
125
+ │ └── task.ts # Contains defaultErrorMerger (lines 23-56) - TO BE EXTRACTED
126
+ ├── types/
127
+ │ ├── index.ts # Exports WorkflowError, ErrorMergeStrategy
128
+ │ ├── error.ts # WorkflowError interface
129
+ │ ├── error-strategy.ts # ErrorMergeStrategy interface
130
+ │ ├── logging.ts # LogEntry type
131
+ │ └── snapshot.ts # SerializedWorkflowState type
132
+ ├── utils/
133
+ │ ├── id.ts # generateId utility
134
+ │ ├── observable.ts # Observable utility
135
+ │ └── index.ts # Exports from utils module
136
+ └── index.ts # Main export file
137
+ ```
138
+
139
+ ### Desired Codebase Tree (files to be added)
140
+
141
+ ```bash
142
+ src/
143
+ ├── utils/
144
+ │ ├── workflow-error-utils.ts # NEW - mergeWorkflowErrors function
145
+ │ └── index.ts # MODIFY - Add export for mergeWorkflowErrors
146
+ ├── decorators/
147
+ │ └── task.ts # MODIFY - Import mergeWorkflowErrors, remove inline defaultErrorMerger
148
+ └── index.ts # MODIFY - Add re-export of mergeWorkflowErrors
149
+ ```
150
+
151
+ ### Known Gotchas of Our Codebase & Library Quirks
152
+
153
+ ```typescript
154
+ // CRITICAL: TypeScript ES modules - use .js extensions in imports
155
+ // Even though source files are .ts, imports use .js extension
156
+ // Example: import { WorkflowError } from './types/error.js';
157
+
158
+ // CRITICAL: The existing defaultErrorMerger includes metadata in the 'original' field
159
+ // This metadata (name, message, errors, totalChildren, failedChildren, failedWorkflowIds)
160
+ // should be preserved in the extracted function
161
+
162
+ // GOTCHA: WorkflowError.original is typed as 'unknown' - the metadata object
163
+ // must be cast with 'as unknown' to satisfy the type checker
164
+
165
+ // PATTERN: Use flatMap for flattening logs arrays
166
+ // allLogs = errors.flatMap((e) => e.logs);
167
+
168
+ // PATTERN: Use Set to get unique workflow IDs
169
+ // failedWorkflowIds = [...new Set(errors.map((e) => e.workflowId))];
170
+
171
+ // GOTCHA: stack and state are optional fields - use optional chaining
172
+ // stack: errors[0]?.stack
173
+ // state: errors[0]?.state || ({} as SerializedWorkflowState)
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Implementation Blueprint
179
+
180
+ ### Data Models and Structure
181
+
182
+ The `WorkflowError` interface is already defined in `src/types/error.ts`:
183
+
184
+ ```typescript
185
+ export interface WorkflowError {
186
+ message: string; // Error message
187
+ original: unknown; // Original thrown error (will contain metadata object)
188
+ workflowId: string; // ID of workflow where error occurred
189
+ stack?: string; // Stack trace if available
190
+ state: SerializedWorkflowState; // State snapshot at time of error
191
+ logs: LogEntry[]; // Logs from the failing workflow node
192
+ }
193
+ ```
194
+
195
+ ### Implementation Tasks (ordered by dependencies)
196
+
197
+ ```yaml
198
+ Task 1: CREATE src/utils/workflow-error-utils.ts
199
+ - IMPLEMENT: mergeWorkflowErrors function with exact signature from existing defaultErrorMerger
200
+ - FUNCTION SIGNATURE: mergeWorkflowErrors(errors: WorkflowError[], taskName: string, parentWorkflowId: string, totalChildren: number): WorkflowError
201
+ - COPY logic from: src/decorators/task.ts lines 23-56 (defaultErrorMerger function)
202
+ - IMPORT types: WorkflowError from '../types/error.js', SerializedWorkflowState from '../types/snapshot.js'
203
+ - MERGE LOGIC:
204
+ - message: "${errors.length} of ${totalChildren} concurrent child workflows failed in task '${taskName}'"
205
+ - failedWorkflowIds: [...new Set(errors.map((e) => e.workflowId))]
206
+ - allLogs: errors.flatMap((e) => e.logs)
207
+ - stack: errors[0]?.stack (first error's stack)
208
+ - state: errors[0]?.state || ({} as SerializedWorkflowState) (first error's state)
209
+ - original: metadata object with name, message, errors, totalChildren, failedChildren, failedWorkflowIds
210
+ - NAMING: camelCase for function, snake_case for imports
211
+ - PLACEMENT: New file in src/utils/
212
+ - JSDOC: Add documentation explaining the merge behavior
213
+
214
+ Task 2: MODIFY src/utils/index.ts
215
+ - ADD export: export { mergeWorkflowErrors } from './workflow-error-utils.js';
216
+ - PRESERVE: All existing exports (generateId, Observable)
217
+ - PATTERN: Follow existing export pattern - one export per line
218
+
219
+ Task 3: MODIFY src/decorators/task.ts
220
+ - ADD import: import { mergeWorkflowErrors } from '../utils/workflow-error-utils.js';
221
+ - REMOVE: defaultErrorMerger function definition (lines 18-56)
222
+ - REPLACE: All references to 'defaultErrorMerger' with 'mergeWorkflowErrors'
223
+ - FIND: Line 167 where defaultErrorMerger is called
224
+ - PRESERVE: All other Task decorator logic unchanged
225
+ - VERIFY: No other references to defaultErrorMerger exist
226
+
227
+ Task 4: MODIFY src/index.ts
228
+ - ADD export: export { mergeWorkflowErrors } from './utils/workflow-error-utils.js';
229
+ - PLACEMENT: In the utilities section (after line 86, near generateId export)
230
+ - PRESERVE: All existing exports
231
+
232
+ Task 5: CREATE src/__tests__/unit/utils/workflow-error-utils.test.ts
233
+ - IMPLEMENT: Unit tests for mergeWorkflowErrors function
234
+ - TEST CASES:
235
+ - Single error (returns error with count 1)
236
+ - Multiple errors with unique workflow IDs
237
+ - Multiple errors with duplicate workflow IDs
238
+ - Empty errors array (edge case - should handle gracefully)
239
+ - Logs aggregation (flatMap behavior)
240
+ - Stack trace selection (first error's stack)
241
+ - State selection (first error's state)
242
+ - Metadata object structure in original field
243
+ - FOLLOW pattern: src/__tests__/unit/decorators.test.ts (test structure and patterns)
244
+ - NAMING: test files use *.test.ts suffix
245
+ - FRAMEWORK: Vitest - use describe, it, expect from 'vitest'
246
+ - PLACEMENT: Test file alongside the code it tests in src/__tests__/unit/utils/
247
+
248
+ Task 6: VERIFY existing tests still pass
249
+ - RUN: npm test (or uv run vitest run)
250
+ - CHECK: All 344 existing tests still pass
251
+ - NO regressions: The change is a refactoring - behavior should be identical
252
+ ```
253
+
254
+ ### Implementation Patterns & Key Details
255
+
256
+ ```typescript
257
+ // ============================================================================
258
+ // CRITICAL: Function signature (must match defaultErrorMerger exactly)
259
+ // ============================================================================
260
+ /**
261
+ * Merge multiple WorkflowError objects into a single aggregated error
262
+ * This is the default merger used when errorMergeStrategy is enabled
263
+ *
264
+ * @param errors - Array of WorkflowError objects to merge
265
+ * @param taskName - Name of the task that spawned the concurrent workflows
266
+ * @param parentWorkflowId - ID of the parent workflow
267
+ * @param totalChildren - Total number of child workflows that were spawned
268
+ * @returns A merged WorkflowError containing aggregated information
269
+ */
270
+ export function mergeWorkflowErrors(
271
+ errors: WorkflowError[],
272
+ taskName: string,
273
+ parentWorkflowId: string,
274
+ totalChildren: number
275
+ ): WorkflowError
276
+
277
+ // ============================================================================
278
+ // PATTERN: Message construction with count and task name
279
+ // ============================================================================
280
+ const message = `${errors.length} of ${totalChildren} concurrent child workflows failed in task '${taskName}'`;
281
+
282
+ // ============================================================================
283
+ // PATTERN: Unique workflow IDs using Set
284
+ // ============================================================================
285
+ const failedWorkflowIds = [...new Set(errors.map((e) => e.workflowId))];
286
+
287
+ // ============================================================================
288
+ // PATTERN: Flatten logs arrays using flatMap
289
+ // ============================================================================
290
+ const allLogs = errors.flatMap((e) => e.logs);
291
+
292
+ // ============================================================================
293
+ // PATTERN: First error's stack and state with optional chaining
294
+ // ============================================================================
295
+ stack: errors[0]?.stack,
296
+ state: errors[0]?.state || ({} as SerializedWorkflowState),
297
+
298
+ // ============================================================================
299
+ // CRITICAL: Metadata object structure in 'original' field (as unknown cast)
300
+ // ============================================================================
301
+ original: {
302
+ name: 'WorkflowAggregateError',
303
+ message,
304
+ errors,
305
+ totalChildren,
306
+ failedChildren: errors.length,
307
+ failedWorkflowIds,
308
+ } as unknown,
309
+
310
+ // ============================================================================
311
+ // IMPORT PATTERN: Use .js extensions for ES modules
312
+ // ============================================================================
313
+ import type { WorkflowError } from '../types/error.js';
314
+ import type { SerializedWorkflowState } from '../types/snapshot.js';
315
+ ```
316
+
317
+ ### Integration Points
318
+
319
+ ```yaml
320
+ TASK_DECORATOR:
321
+ - file: src/decorators/task.ts
322
+ - remove: defaultErrorMerger function definition (lines 18-56)
323
+ - add_import: import { mergeWorkflowErrors } from '../utils/workflow-error-utils.js';
324
+ - replace_call: Line 167 - change defaultErrorMerger to mergeWorkflowErrors
325
+
326
+ UTILS_EXPORTS:
327
+ - file: src/utils/index.ts
328
+ - add_export: export { mergeWorkflowErrors } from './workflow-error-utils.js';
329
+
330
+ MAIN_EXPORT:
331
+ - file: src/index.ts
332
+ - add_export: export { mergeWorkflowErrors } from './utils/workflow-error-utils.js';
333
+ - location: In utilities section (around line 86)
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Validation Loop
339
+
340
+ ### Level 1: Syntax & Style (Immediate Feedback)
341
+
342
+ ```bash
343
+ # Run after each file creation - fix before proceeding
344
+ npm run lint
345
+
346
+ # This runs: tsc --noEmit (TypeScript type checking)
347
+ # Expected: Zero type errors. If errors exist, READ output and fix before proceeding.
348
+
349
+ # Manual checks after implementation:
350
+ # 1. Verify .js extensions in all import statements
351
+ # 2. Verify all types are imported from correct paths
352
+ # 3. Verify function signature matches defaultErrorMerger
353
+ ```
354
+
355
+ ### Level 2: Unit Tests (Component Validation)
356
+
357
+ ```bash
358
+ # Test the new utility function specifically
359
+ npm test -- src/__tests__/unit/utils/workflow-error-utils.test.ts
360
+
361
+ # Full test suite for affected areas
362
+ npm test -- src/__tests__/unit/decorators.test.ts
363
+ npm test -- src/__tests__/unit/
364
+
365
+ # Coverage validation
366
+ npm test -- --coverage
367
+
368
+ # Expected: All tests pass. If failing, debug root cause and fix implementation.
369
+ ```
370
+
371
+ ### Level 3: Integration Testing (System Validation)
372
+
373
+ ```bash
374
+ # Run the full test suite to verify no regressions
375
+ npm test
376
+
377
+ # Expected: All 344 existing tests pass plus new tests
378
+ # This refactoring should NOT change any behavior - it's purely extraction
379
+
380
+ # Test specific concurrent task scenarios
381
+ npm test -- examples/examples/06-concurrent-tasks.ts
382
+
383
+ # Test error handling examples
384
+ npm test -- examples/examples/05-error-handling.ts
385
+
386
+ # Expected: All concurrent task and error handling tests still work
387
+ ```
388
+
389
+ ### Level 4: Manual Validation
390
+
391
+ ```bash
392
+ # Run concurrent tasks example to verify error merging still works
393
+ npm run start:concurrent
394
+
395
+ # Run error handling example
396
+ npm run start:errors
397
+
398
+ # Expected: Both examples run successfully, errors are properly merged
399
+ # when errorMergeStrategy is enabled
400
+
401
+ # Check exports are working
402
+ node -e "const { mergeWorkflowErrors } = require('./dist/index.js'); console.log('Export check:', typeof mergeWorkflowErrors);"
403
+ # Expected: "Export check: function"
404
+ ```
405
+
406
+ ---
407
+
408
+ ## Final Validation Checklist
409
+
410
+ ### Technical Validation
411
+
412
+ - [ ] All 4 validation levels completed successfully
413
+ - [ ] All tests pass: `npm test` (344+ tests)
414
+ - [ ] No type errors: `npm run lint` returns cleanly
415
+ - [ ] Function signature matches defaultErrorMerger exactly
416
+ - [ ] mergeWorkflowErrors exported from src/utils/index.ts
417
+ - [ ] mergeWorkflowErrors re-exported from src/index.ts
418
+ - [ ] defaultErrorMerger removed from src/decorators/task.ts
419
+
420
+ ### Feature Validation
421
+
422
+ - [ ] Message includes error count, total children, and task name
423
+ - [ ] Unique workflow IDs collected correctly
424
+ - [ ] Logs flattened using flatMap
425
+ - [ ] First error's stack used
426
+ - [ ] First error's state used (or empty object)
427
+ - [ ] Metadata object in 'original' field with all required properties
428
+ - [ ] Concurrent task error scenarios still work
429
+ - [ ] Error merge strategy integration still works
430
+
431
+ ### Code Quality Validation
432
+
433
+ - [ ] Follows existing codebase patterns and naming conventions
434
+ - [ ] File placement matches desired codebase tree structure
435
+ - [ ] JSDoc comments added to the function
436
+ - [ ] Imports use .js extensions for ES modules
437
+ - [ ] No breaking changes to existing behavior
438
+ - [ ] Tests cover happy path and edge cases
439
+
440
+ ### Documentation & Deployment
441
+
442
+ - [ ] Code is self-documenting with clear variable names
443
+ - [ ] Function behavior documented in JSDoc
444
+ - [ ] Comment in src/decorators/task.ts line 21 acknowledged/removed
445
+
446
+ ---
447
+
448
+ ## Anti-Patterns to Avoid
449
+
450
+ - ❌ Don't change the merge logic - this is a pure extraction, behavior must be identical
451
+ - ❌ Don't forget to add the export to src/utils/index.ts and src/index.ts
452
+ - ❌ Don't use .ts extensions in imports - must use .js for ES modules
453
+ - ❌ Don't skip the cast `as unknown` for the metadata object in `original` field
454
+ - ❌ Don't forget to handle optional fields (stack, state) with optional chaining
455
+ - ❌ Don't remove the metadata from the `original` field - it contains important context
456
+ - ❌ Don't change the function signature - it must match defaultErrorMerger exactly
457
+ - ❌ Don't forget to run full test suite - this is a refactoring, no behavior should change
458
+ - ❌ Don't place the file anywhere other than src/utils/ - that's the established pattern
459
+ - ❌ Don't create a new directory for error utilities - put it in existing utils/
460
+
461
+ ---
462
+
463
+ ## Confidence Score
464
+
465
+ **8/10** - High confidence for one-pass implementation success
466
+
467
+ **Reasoning:**
468
+ - Existing implementation (defaultErrorMerger) provides exact reference
469
+ - Clear file location and export patterns established in codebase
470
+ - Well-defined types and interfaces
471
+ - Comprehensive test patterns available
472
+ - The only complexity is ensuring exact behavior preservation during extraction
473
+
474
+ **Risk Factors:**
475
+ - Must preserve exact behavior of defaultErrorMerger
476
+ - Must handle TypeScript ES module import syntax correctly (.js extensions)
477
+ - Must update all export locations (utils/index.ts and main index.ts)
478
+
479
+ ---
480
+
481
+ ## Additional Context from Research
482
+
483
+ ### Existing Test Patterns Found
484
+
485
+ From `src/__tests__/unit/decorators.test.ts`:
486
+ ```typescript
487
+ // Error testing pattern
488
+ it('should wrap errors in WorkflowError', async () => {
489
+ class FailingWorkflow extends Workflow {
490
+ @Step()
491
+ async failingStep(): Promise<void> {
492
+ throw new Error('Step failed');
493
+ }
494
+ async run(): Promise<void> {
495
+ await this.failingStep();
496
+ }
497
+ }
498
+ const wf = new FailingWorkflow();
499
+ await expect(wf.run()).rejects.toMatchObject({
500
+ message: 'Step failed',
501
+ workflowId: wf.id,
502
+ });
503
+ });
504
+ ```
505
+
506
+ ### Related Work Items (for context)
507
+
508
+ - **P1.M2.T2.S1** (Complete): Added errorMergeStrategy to TaskOptions interface
509
+ - **P1.M2.T2.S2** (Complete): Implemented error aggregation logic in @Task decorator
510
+ - **P1.M2.T2.S4** (Pending): Add tests for ErrorMergeStrategy functionality
511
+
512
+ This subtask (P1.M2.T2.S3) extracts the default merger for better modularity and testability.
513
+
514
+ ### References
515
+
516
+ - Error handling architecture: `plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md`
517
+ - PRD snapshot: `plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md`
518
+ - Existing implementation: `src/decorators/task.ts` lines 23-56