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,571 @@
1
+ /**
2
+ * Concurrent Task Failure Scenarios Test Suite
3
+ *
4
+ * Tests the Promise.allSettled implementation in @Task decorator
5
+ * for concurrent execution with various failure scenarios.
6
+ *
7
+ * Validates:
8
+ * - Single child failure in concurrent batch
9
+ * - Multiple children failing concurrently
10
+ * - Mixed success/failure scenarios
11
+ * - All children failing edge case
12
+ * - No orphaned or hanging promises
13
+ * - Error collection correctness
14
+ * - Event emission during failures
15
+ *
16
+ * Related:
17
+ * - S2 Implementation: Promise.allSettled in task.ts (lines 111-120)
18
+ * - Bug: 001_e8e04329daf3 - Concurrent task error collection
19
+ */
20
+
21
+ import { describe, it, expect } from 'vitest';
22
+ import { Workflow, Task, Step } from '../../index.js';
23
+ import type { WorkflowEvent } from '../../types/index.js';
24
+
25
+ describe('@Task decorator concurrent failure scenarios', () => {
26
+ /**
27
+ * Helper to create a child workflow that may fail
28
+ * Pattern from: src/__tests__/adversarial/edge-case.test.ts (lines 146-167)
29
+ */
30
+ function createChildWorkflow(
31
+ parent: Workflow,
32
+ name: string,
33
+ shouldFail: boolean = false
34
+ ): Workflow {
35
+ return new (class extends Workflow {
36
+ constructor(n: string, p: Workflow) {
37
+ super(n, p);
38
+ }
39
+
40
+ @Step()
41
+ async executeStep() {
42
+ if (shouldFail) {
43
+ throw new Error(`${name} failed`);
44
+ }
45
+ return `${name} succeeded`;
46
+ }
47
+
48
+ async run() {
49
+ return this.executeStep();
50
+ }
51
+ })(name, parent);
52
+ }
53
+
54
+ /**
55
+ * Helper to setup event observer for event collection
56
+ * Pattern from: src/__tests__/adversarial/observer-propagation.test.ts (lines 42-49)
57
+ */
58
+ function setupEventObserver(workflow: Workflow): WorkflowEvent[] {
59
+ const events: WorkflowEvent[] = [];
60
+ workflow.addObserver({
61
+ onLog: () => {},
62
+ onEvent: (e) => events.push(e),
63
+ onStateUpdated: () => {},
64
+ onTreeChanged: () => {},
65
+ });
66
+ return events;
67
+ }
68
+
69
+ describe('Single child failure scenarios', () => {
70
+ it('should complete all siblings when one child fails', async () => {
71
+ // ARRANGE: Create parent with 4 children, child[1] will fail
72
+ class ParentWorkflow extends Workflow {
73
+ @Task({ concurrent: true })
74
+ async spawnChildren() {
75
+ return [
76
+ createChildWorkflow(this, 'Child-0', false),
77
+ createChildWorkflow(this, 'Child-1', true), // Will fail
78
+ createChildWorkflow(this, 'Child-2', false),
79
+ createChildWorkflow(this, 'Child-3', false),
80
+ ];
81
+ }
82
+
83
+ async run() {
84
+ try {
85
+ await this.spawnChildren();
86
+ } catch (err) {
87
+ // Expected - first error thrown after all complete
88
+ }
89
+ }
90
+ }
91
+
92
+ const parent = new ParentWorkflow('Parent');
93
+
94
+ // ACT: Run parent (children run concurrently)
95
+ await parent.run();
96
+
97
+ // ASSERT: All 4 children attached (Promise.allSettled completed all)
98
+ expect(parent.children.length).toBe(4);
99
+
100
+ // ASSERT: Verify child names match what we created
101
+ const childNames = parent.children.map((c) => (c as any).node.name);
102
+ expect(childNames).toContain('Child-0');
103
+ expect(childNames).toContain('Child-1');
104
+ expect(childNames).toContain('Child-2');
105
+ expect(childNames).toContain('Child-3');
106
+ });
107
+ });
108
+
109
+ describe('Multiple concurrent failures', () => {
110
+ it('should collect all errors when multiple children fail concurrently', async () => {
111
+ // ARRANGE: Create parent with 6 children, 3 will fail
112
+ class ParentWorkflow extends Workflow {
113
+ @Task({ concurrent: true })
114
+ async spawnChildren() {
115
+ return [
116
+ createChildWorkflow(this, 'Alpha', false),
117
+ createChildWorkflow(this, 'Beta', true), // Will fail
118
+ createChildWorkflow(this, 'Gamma', false),
119
+ createChildWorkflow(this, 'Delta', true), // Will fail
120
+ createChildWorkflow(this, 'Epsilon', false),
121
+ createChildWorkflow(this, 'Zeta', true), // Will fail
122
+ ];
123
+ }
124
+
125
+ async run() {
126
+ try {
127
+ await this.spawnChildren();
128
+ } catch (err) {
129
+ // Expected
130
+ }
131
+ }
132
+ }
133
+
134
+ const parent = new ParentWorkflow('Parent');
135
+
136
+ // ACT
137
+ await parent.run();
138
+
139
+ // ASSERT: All 6 children attached (Promise.allSettled completed all)
140
+ expect(parent.children.length).toBe(6);
141
+
142
+ // ASSERT: Verify expected child names are present
143
+ const childNames = parent.children.map((c) => (c as any).node.name);
144
+ expect(childNames).toContain('Alpha');
145
+ expect(childNames).toContain('Beta');
146
+ expect(childNames).toContain('Gamma');
147
+ expect(childNames).toContain('Delta');
148
+ expect(childNames).toContain('Epsilon');
149
+ expect(childNames).toContain('Zeta');
150
+ });
151
+
152
+ it('should preserve error context for each failure', async () => {
153
+ // ARRANGE: Create parent with multiple failing children
154
+ class ParentWorkflow extends Workflow {
155
+ @Task({ concurrent: true })
156
+ async spawnChildren() {
157
+ return [
158
+ createChildWorkflow(this, 'Alpha', true),
159
+ createChildWorkflow(this, 'Beta', true),
160
+ createChildWorkflow(this, 'Gamma', true),
161
+ ];
162
+ }
163
+
164
+ async run() {
165
+ try {
166
+ await this.spawnChildren();
167
+ } catch (err) {
168
+ // Expected
169
+ }
170
+ }
171
+ }
172
+
173
+ const parent = new ParentWorkflow('Parent');
174
+ const events = setupEventObserver(parent);
175
+
176
+ // ACT
177
+ await parent.run();
178
+
179
+ // ASSERT: Error events emitted for all failures
180
+ const errorEvents = events.filter((e) => e.type === 'error');
181
+ expect(errorEvents.length).toBeGreaterThanOrEqual(3);
182
+
183
+ // ASSERT: Each error event has correct structure
184
+ errorEvents.forEach((event) => {
185
+ expect(event.type).toBe('error');
186
+ if (event.type === 'error') {
187
+ expect(event.error).toBeDefined();
188
+ expect(event.error.workflowId).toBeDefined();
189
+ expect(event.error.message).toBeDefined();
190
+ expect(Array.isArray(event.error.logs)).toBe(true);
191
+ }
192
+ });
193
+
194
+ // ASSERT: All three distinct error messages captured
195
+ const errorMessages = errorEvents
196
+ .filter((e) => e.type === 'error')
197
+ .map((e) => e.error.message);
198
+ expect(errorMessages).toContain('Alpha failed');
199
+ expect(errorMessages).toContain('Beta failed');
200
+ expect(errorMessages).toContain('Gamma failed');
201
+ });
202
+ });
203
+
204
+ describe('Mixed success/failure scenarios', () => {
205
+ it('should complete successful workflows despite failures', async () => {
206
+ // ARRANGE: Create parent with mixed success/failure children
207
+ class ParentWorkflow extends Workflow {
208
+ @Task({ concurrent: true })
209
+ async spawnChildren() {
210
+ return [
211
+ createChildWorkflow(this, 'Success-1', false),
212
+ createChildWorkflow(this, 'Fail-1', true),
213
+ createChildWorkflow(this, 'Success-2', false),
214
+ createChildWorkflow(this, 'Fail-2', true),
215
+ createChildWorkflow(this, 'Success-3', false),
216
+ ];
217
+ }
218
+
219
+ async run() {
220
+ try {
221
+ await this.spawnChildren();
222
+ } catch (err) {
223
+ // Expected
224
+ }
225
+ }
226
+ }
227
+
228
+ const parent = new ParentWorkflow('Parent');
229
+
230
+ // ACT
231
+ await parent.run();
232
+
233
+ // ASSERT: All 5 children attached (Promise.allSettled completed all)
234
+ expect(parent.children.length).toBe(5);
235
+
236
+ // ASSERT: Verify all expected children are present
237
+ const childNames = parent.children.map((c) => (c as any).node.name);
238
+ expect(childNames).toContain('Success-1');
239
+ expect(childNames).toContain('Fail-1');
240
+ expect(childNames).toContain('Success-2');
241
+ expect(childNames).toContain('Fail-2');
242
+ expect(childNames).toContain('Success-3');
243
+ });
244
+
245
+ it('should ensure no orphaned workflows in mixed scenario', async () => {
246
+ // ARRANGE: Track all completions
247
+ const completedWorkflows = new Set<string>();
248
+
249
+ class ParentWorkflow extends Workflow {
250
+ @Task({ concurrent: true })
251
+ async spawnChildren() {
252
+ const children = [
253
+ createChildWorkflow(this, 'Alpha', false),
254
+ createChildWorkflow(this, 'Beta', true),
255
+ createChildWorkflow(this, 'Gamma', false),
256
+ createChildWorkflow(this, 'Delta', false),
257
+ createChildWorkflow(this, 'Epsilon', true),
258
+ ];
259
+
260
+ // Track completion for all children
261
+ children.forEach((child) => {
262
+ child.run().then(
263
+ () => completedWorkflows.add(child.id),
264
+ () => completedWorkflows.add(child.id)
265
+ );
266
+ });
267
+
268
+ return children;
269
+ }
270
+
271
+ async run() {
272
+ try {
273
+ await this.spawnChildren();
274
+ } catch (err) {
275
+ // Expected
276
+ }
277
+ }
278
+ }
279
+
280
+ const parent = new ParentWorkflow('Parent');
281
+
282
+ // ACT
283
+ await parent.run();
284
+
285
+ // ASSERT: All 5 workflows accounted for (no orphans)
286
+ expect(completedWorkflows.size).toBe(5);
287
+ expect(parent.children.length).toBe(5);
288
+ });
289
+ });
290
+
291
+ describe('All children failing', () => {
292
+ it('should handle edge case of all children failing', async () => {
293
+ // ARRANGE: All children will fail
294
+ class ParentWorkflow extends Workflow {
295
+ @Task({ concurrent: true })
296
+ async spawnChildren() {
297
+ return Array.from({ length: 5 }, (_, i) =>
298
+ createChildWorkflow(this, `FailChild-${i}`, true) // All fail
299
+ );
300
+ }
301
+
302
+ async run() {
303
+ try {
304
+ await this.spawnChildren();
305
+ } catch (err) {
306
+ // Expected - first error thrown
307
+ }
308
+ }
309
+ }
310
+
311
+ const parent = new ParentWorkflow('Parent');
312
+ const events = setupEventObserver(parent);
313
+
314
+ // ACT
315
+ await parent.run();
316
+
317
+ // ASSERT: All 5 children attached
318
+ expect(parent.children.length).toBe(5);
319
+
320
+ // ASSERT: Error events emitted for all failures
321
+ const errorEvents = events.filter((e) => e.type === 'error');
322
+ expect(errorEvents.length).toBeGreaterThanOrEqual(5);
323
+
324
+ // ASSERT: Each failure has distinct error message
325
+ const errorMessages = errorEvents
326
+ .filter((e) => e.type === 'error')
327
+ .map((e) => e.error.message);
328
+ for (let i = 0; i < 5; i++) {
329
+ expect(errorMessages).toContain(`FailChild-${i} failed`);
330
+ }
331
+ });
332
+ });
333
+
334
+ describe('No orphaned workflows', () => {
335
+ it('should verify all workflows complete with no hanging promises', async () => {
336
+ // ARRANGE: Track all completions
337
+ const completedWorkflows = new Set<string>();
338
+
339
+ class ParentWorkflow extends Workflow {
340
+ @Task({ concurrent: true })
341
+ async spawnChildren() {
342
+ const children = Array.from({ length: 10 }, (_, i) =>
343
+ createChildWorkflow(
344
+ this,
345
+ `Child-${i}`,
346
+ Math.random() < 0.3 // 30% failure rate
347
+ )
348
+ );
349
+
350
+ // Track completion for all children
351
+ children.forEach((child) => {
352
+ child.run().then(
353
+ () => completedWorkflows.add(child.id),
354
+ () => completedWorkflows.add(child.id)
355
+ );
356
+ });
357
+
358
+ return children;
359
+ }
360
+
361
+ async run() {
362
+ try {
363
+ await this.spawnChildren();
364
+ } catch (err) {
365
+ // Expected
366
+ }
367
+ }
368
+ }
369
+
370
+ const parent = new ParentWorkflow('Parent');
371
+
372
+ // ACT: Run with timeout to detect hanging promises
373
+ const timeoutPromise = new Promise((_, reject) =>
374
+ setTimeout(() => reject(new Error('Timeout: workflows hung')), 5000)
375
+ );
376
+
377
+ const runPromise = parent.run();
378
+
379
+ await Promise.race([runPromise, timeoutPromise]);
380
+
381
+ // ASSERT: All 10 workflows accounted for (no orphans)
382
+ expect(completedWorkflows.size).toBe(10);
383
+ });
384
+ });
385
+
386
+ describe('Event emission verification', () => {
387
+ it('should emit error events for all failing workflows', async () => {
388
+ // ARRANGE: Setup event observer
389
+ class ParentWorkflow extends Workflow {
390
+ @Task({ concurrent: true })
391
+ async spawnChildren() {
392
+ return [
393
+ createChildWorkflow(this, 'Good', false),
394
+ createChildWorkflow(this, 'Bad1', true),
395
+ createChildWorkflow(this, 'Bad2', true),
396
+ ];
397
+ }
398
+
399
+ async run() {
400
+ try {
401
+ await this.spawnChildren();
402
+ } catch (err) {
403
+ // Expected
404
+ }
405
+ }
406
+ }
407
+
408
+ const parent = new ParentWorkflow('Parent');
409
+ const events: WorkflowEvent[] = [];
410
+
411
+ // CRITICAL: Add observer to root workflow
412
+ parent.addObserver({
413
+ onLog: () => {},
414
+ onEvent: (e) => events.push(e),
415
+ onStateUpdated: () => {},
416
+ onTreeChanged: () => {},
417
+ });
418
+
419
+ // ACT
420
+ await parent.run();
421
+
422
+ // ASSERT: Error events emitted for both failures
423
+ const errorEvents = events.filter((e) => e.type === 'error');
424
+ expect(errorEvents.length).toBeGreaterThanOrEqual(2);
425
+
426
+ // ASSERT: Each error event has correct structure
427
+ errorEvents.forEach((event) => {
428
+ expect(event.type).toBe('error');
429
+ if (event.type === 'error') {
430
+ expect(event.error).toBeDefined();
431
+ expect(event.error.workflowId).toBeDefined();
432
+ expect(event.error.message).toBeDefined();
433
+ expect(Array.isArray(event.error.logs)).toBe(true);
434
+ }
435
+ });
436
+
437
+ // ASSERT: Verify expected error messages
438
+ const errorMessages = errorEvents
439
+ .filter((e) => e.type === 'error')
440
+ .map((e) => e.error.message);
441
+ expect(errorMessages).toContain('Bad1 failed');
442
+ expect(errorMessages).toContain('Bad2 failed');
443
+ });
444
+
445
+ it('should capture logs from both successful and failed workflows', async () => {
446
+ // ARRANGE: Create workflows that log before completion/failure
447
+ class ChildWorkflow extends Workflow {
448
+ private shouldFail: boolean;
449
+
450
+ constructor(name: string, parent: Workflow, shouldFail: boolean) {
451
+ super(name, parent);
452
+ this.shouldFail = shouldFail;
453
+ }
454
+
455
+ @Step()
456
+ async executeStep() {
457
+ this.logger.info(`${this.node.name} is running`);
458
+ if (this.shouldFail) {
459
+ this.logger.error(`${this.node.name} is about to fail`);
460
+ throw new Error(`${this.node.name} failed`);
461
+ }
462
+ this.logger.info(`${this.node.name} completed successfully`);
463
+ return `${this.node.name} succeeded`;
464
+ }
465
+
466
+ async run() {
467
+ return this.executeStep();
468
+ }
469
+ }
470
+
471
+ class ParentWorkflow extends Workflow {
472
+ @Task({ concurrent: true })
473
+ async spawnChildren() {
474
+ return [
475
+ new ChildWorkflow('SuccessChild', this, false),
476
+ new ChildWorkflow('FailChild', this, true),
477
+ ];
478
+ }
479
+
480
+ async run() {
481
+ try {
482
+ await this.spawnChildren();
483
+ } catch (err) {
484
+ // Expected
485
+ }
486
+ }
487
+ }
488
+
489
+ const parent = new ParentWorkflow('Parent');
490
+ const allLogs: string[] = [];
491
+
492
+ parent.addObserver({
493
+ onLog: (entry) => allLogs.push(entry.message),
494
+ onEvent: () => {},
495
+ onStateUpdated: () => {},
496
+ onTreeChanged: () => {},
497
+ });
498
+
499
+ // ACT
500
+ await parent.run();
501
+
502
+ // ASSERT: Logs from both children captured
503
+ expect(allLogs.length).toBeGreaterThan(0);
504
+
505
+ // ASSERT: Success child logs present
506
+ expect(
507
+ allLogs.some((msg) => msg.includes('SuccessChild is running'))
508
+ ).toBe(true);
509
+ expect(
510
+ allLogs.some((msg) => msg.includes('SuccessChild completed successfully'))
511
+ ).toBe(true);
512
+
513
+ // ASSERT: Fail child logs present
514
+ expect(allLogs.some((msg) => msg.includes('FailChild is running'))).toBe(
515
+ true
516
+ );
517
+ expect(
518
+ allLogs.some((msg) => msg.includes('FailChild is about to fail'))
519
+ ).toBe(true);
520
+ });
521
+ });
522
+
523
+ describe('Error collection correctness', () => {
524
+ it('should verify error messages are preserved correctly', async () => {
525
+ // ARRANGE: Create children with specific error messages
526
+ class ParentWorkflow extends Workflow {
527
+ @Task({ concurrent: true })
528
+ async spawnChildren() {
529
+ return [
530
+ createChildWorkflow(this, 'Task-Alpha', false),
531
+ createChildWorkflow(this, 'Task-Beta', true), // Will fail with "Task-Beta failed"
532
+ createChildWorkflow(this, 'Task-Gamma', false),
533
+ ];
534
+ }
535
+
536
+ async run() {
537
+ try {
538
+ await this.spawnChildren();
539
+ } catch (err) {
540
+ // Expected - error should be thrown
541
+ return err;
542
+ }
543
+ }
544
+ }
545
+
546
+ const parent = new ParentWorkflow('Parent');
547
+ const events = setupEventObserver(parent);
548
+
549
+ // ACT
550
+ const thrownError = await parent.run();
551
+
552
+ // ASSERT: Error was thrown
553
+ expect(thrownError).toBeDefined();
554
+
555
+ // ASSERT: Error message is preserved (WorkflowError wraps the original)
556
+ expect((thrownError as any).message).toContain('Task-Beta failed');
557
+
558
+ // ASSERT: Error events captured with correct messages
559
+ const errorEvents = events.filter((e) => e.type === 'error');
560
+ expect(errorEvents.length).toBeGreaterThanOrEqual(1);
561
+
562
+ const matchingError = errorEvents.find((e) => {
563
+ if (e.type === 'error') {
564
+ return e.error.message.includes('Task-Beta');
565
+ }
566
+ return false;
567
+ });
568
+ expect(matchingError).toBeDefined();
569
+ });
570
+ });
571
+ });