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,415 @@
1
+ # Bug Analysis: attachChild() Tree Integrity Violation
2
+
3
+ ## Bug Summary
4
+
5
+ **Severity**: Critical
6
+ **Location**: `src/core/workflow.ts:187-201` (attachChild method)
7
+ **Discovered By**: Comprehensive end-to-end testing (240 existing tests + adversarial testing)
8
+ **Impact**: Inconsistent tree state, broken observer propagation, data integrity violation
9
+
10
+ ## Bug Description
11
+
12
+ The `attachChild()` method does not validate if a child workflow already has a parent before attaching it to a new parent. This allows a single child to appear in multiple parents' `children` arrays while only linking to one parent via its `parent` property, creating an inconsistent tree state.
13
+
14
+ ## Current Implementation (Buggy)
15
+
16
+ ```typescript
17
+ // File: src/core/workflow.ts, lines 187-201
18
+ public attachChild(child: Workflow): void {
19
+ // Only checks if already attached to THIS workflow
20
+ if (this.children.includes(child)) {
21
+ throw new Error('Child already attached to this workflow');
22
+ }
23
+
24
+ // NO VALIDATION: Does not check if child.parent is already set!
25
+
26
+ this.children.push(child);
27
+ this.node.children.push(child.node);
28
+
29
+ this.emitEvent({
30
+ type: 'childAttached',
31
+ parentId: this.id,
32
+ child: child.node,
33
+ });
34
+ }
35
+ ```
36
+
37
+ ## Steps to Reproduce
38
+
39
+ ```typescript
40
+ import { Workflow } from './src/index.js';
41
+
42
+ const parent1 = new Workflow('Parent1');
43
+ const parent2 = new Workflow('Parent2');
44
+
45
+ // Create child with parent1 - child is automatically attached via constructor
46
+ const child = new Workflow('Child', parent1);
47
+
48
+ // BUG: attachChild doesn't check if child already has a parent
49
+ parent2.attachChild(child);
50
+
51
+ // Result: INCONSISTENT STATE
52
+ console.log(child.parent === parent1); // true (original parent)
53
+ console.log(parent1.children.includes(child)); // true (still in parent1)
54
+ console.log(parent2.children.includes(child)); // true (also in parent2!)
55
+ console.log(child.parent === parent2); // false (not updated)
56
+ ```
57
+
58
+ ## Impact Analysis
59
+
60
+ ### 1. Observer Event Propagation Failure
61
+
62
+ **Problem**: Events from the shared child only propagate to the original parent's observers.
63
+
64
+ ```typescript
65
+ const parent1 = new Workflow('Parent1');
66
+ const parent2 = new Workflow('Parent2');
67
+ const child = new Workflow('Child', parent1);
68
+
69
+ parent2.attachChild(child); // Bug creates inconsistency
70
+
71
+ // Add observers
72
+ parent1.addObserver({ onEvent: (e) => console.log('P1:', e.type), ... });
73
+ parent2.addObserver({ onEvent: (e) => console.log('P2:', e.type), ... });
74
+
75
+ // Emit event from child
76
+ child.emitEvent({ type: 'stepStart', ... });
77
+
78
+ // Output:
79
+ // P1: stepStart ✅ (original parent receives it)
80
+ // ❌ (parent2 never receives it, even though child is in parent2.children!)
81
+ ```
82
+
83
+ **Root Cause**: The `getRootObservers()` method follows the `child.parent` chain:
84
+ ```typescript
85
+ protected getRootObservers(): WorkflowObserver[] {
86
+ // Only follows child.parent, which is parent1
87
+ let root = this;
88
+ while (root.parent) root = root.parent;
89
+ return root.observers;
90
+ }
91
+ ```
92
+
93
+ ### 2. Tree Debugger Inconsistency
94
+
95
+ **Problem**: Tree debugger shows child in both trees, but navigation is broken.
96
+
97
+ ```typescript
98
+ import { WorkflowTreeDebugger } from './src/index.js';
99
+
100
+ const debugger1 = new WorkflowTreeDebugger(parent1);
101
+ const debugger2 = new WorkflowTreeDebugger(parent2);
102
+
103
+ console.log(debugger1.toTreeString());
104
+ // Parent1
105
+ // └─ Child ✅ (visible)
106
+
107
+ console.log(debugger2.toTreeString());
108
+ // Parent2
109
+ // └─ Child ✅ (visible)
110
+
111
+ // But navigation via parent/child links:
112
+ console.log(child.parent.node.name); // "Parent1" (not Parent2!)
113
+ console.log(parent2.children[0].parent === parent2); // false!
114
+ ```
115
+
116
+ ### 3. getRoot() Returns Wrong Root
117
+
118
+ **Problem**: The `getRoot()` method only follows the `child.parent` chain.
119
+
120
+ ```typescript
121
+ const parent1 = new Workflow('Parent1');
122
+ const parent2 = new Workflow('Parent2');
123
+ const child = new Workflow('Child', parent1);
124
+
125
+ parent2.attachChild(child);
126
+
127
+ // getRoot() only follows child.parent
128
+ console.log(child.getRoot()); // Returns parent1, NOT parent2
129
+ // Even though child appears in parent2's tree!
130
+ ```
131
+
132
+ ### 4. Data Integrity Violation
133
+
134
+ **Problem**: Violates PRD's "1:1 tree mirror" requirement.
135
+
136
+ **PRD Section 12.2 Requirement**:
137
+ > "A child workflow should have exactly one parent.
138
+ > The `child.parent` property should always match the parent that contains it.
139
+ > A child should only appear in one parent's `children` array."
140
+
141
+ **Current Behavior**: All three requirements violated.
142
+
143
+ ## Why Existing Tests Didn't Catch This
144
+
145
+ The existing 241 tests don't cover this scenario because:
146
+
147
+ 1. **Normal Usage**: Most tests create children with a parent and don't re-attach them
148
+ 2. **Constructor Pattern**: Using `new Workflow(name, parent)` automatically attaches, so explicit `attachChild()` calls are rare
149
+ 3. **Missing Adversarial Tests**: No tests explicitly try to attach a child that already has a different parent
150
+ 4. **Observer Tests**: Observer tests don't verify that events DON'T propagate to wrong parents
151
+
152
+ ## Root Cause
153
+
154
+ The `attachChild()` method was designed with these assumptions:
155
+
156
+ 1. **Assumption 1**: Children are created without parents and attached later
157
+ - **Reality**: Constructor auto-attaches if parent is provided
158
+ - **Gap**: No validation for pre-existing parent
159
+
160
+ 2. **Assumption 2**: Developers will read the docs and not misuse the API
161
+ - **Reality**: API allows accidental misuse (no validation)
162
+ - **Gap**: No defensive programming for edge cases
163
+
164
+ 3. **Assumption 3**: The check `this.children.includes(child)` is sufficient
165
+ - **Reality**: Only prevents duplicates in THIS parent, not other parents
166
+ - **Gap**: No validation of child's current parent state
167
+
168
+ ## Solution Design
169
+
170
+ ### Primary Fix: Add Parent Validation
171
+
172
+ ```typescript
173
+ public attachChild(child: Workflow): void {
174
+ // Validation 1: Prevent duplicate attachment to this workflow
175
+ if (this.children.includes(child)) {
176
+ throw new Error(
177
+ `Child '${child.node.name}' is already attached to workflow '${this.node.name}'`
178
+ );
179
+ }
180
+
181
+ // VALIDATION 2: Check if child already has a different parent (THE FIX)
182
+ if (child.parent !== null && child.parent !== this) {
183
+ throw new Error(
184
+ `Child '${child.node.name}' already has parent '${child.parent.node.name}'. ` +
185
+ `A workflow can only have one parent. ` +
186
+ `Use detachChild() on the current parent first if you need to reparent.`
187
+ );
188
+ }
189
+
190
+ // Update child's parent if it's currently null
191
+ if (child.parent === null) {
192
+ child.parent = this;
193
+ }
194
+
195
+ // Add to both trees
196
+ this.children.push(child);
197
+ this.node.children.push(child.node);
198
+
199
+ // Emit event
200
+ this.emitEvent({
201
+ type: 'childAttached',
202
+ parentId: this.id,
203
+ child: child.node,
204
+ });
205
+ }
206
+ ```
207
+
208
+ ### Secondary Fix: Add Circular Reference Detection
209
+
210
+ Prevent attaching an ancestor as a child (would create a cycle):
211
+
212
+ ```typescript
213
+ public attachChild(child: Workflow): void {
214
+ // ... existing validations ...
215
+
216
+ // VALIDATION 3: Prevent circular references
217
+ if (this.isDescendantOf(child)) {
218
+ throw new Error(
219
+ `Cannot attach child '${child.node.name}' - it is an ancestor of '${this.node.name}'. ` +
220
+ `This would create a circular reference.`
221
+ );
222
+ }
223
+
224
+ // ... rest of method ...
225
+ }
226
+
227
+ /**
228
+ * Check if this workflow is a descendant of another workflow
229
+ */
230
+ private isDescendantOf(ancestor: Workflow): boolean {
231
+ let current: Workflow | null = this;
232
+ const visited = new Set<Workflow>();
233
+
234
+ while (current !== null) {
235
+ if (visited.has(current)) {
236
+ throw new Error('Circular reference detected in tree structure');
237
+ }
238
+ visited.add(current);
239
+
240
+ if (current === ancestor) {
241
+ return true;
242
+ }
243
+ current = current.parent;
244
+ }
245
+
246
+ return false;
247
+ }
248
+ ```
249
+
250
+ ### Tertiary Fix: Add detachChild() Method
251
+
252
+ Enable proper reparenting workflow:
253
+
254
+ ```typescript
255
+ /**
256
+ * Detach a child workflow from this parent
257
+ * @throws {Error} If child is not attached to this workflow
258
+ */
259
+ public detachChild(child: Workflow): void {
260
+ const index = this.children.indexOf(child);
261
+ if (index === -1) {
262
+ throw new Error(
263
+ `Child '${child.node.name}' is not attached to workflow '${this.node.name}'`
264
+ );
265
+ }
266
+
267
+ // Remove from workflow children array
268
+ this.children.splice(index, 1);
269
+
270
+ // Remove from node children array
271
+ const nodeIndex = this.node.children.indexOf(child.node);
272
+ if (nodeIndex !== -1) {
273
+ this.node.children.splice(nodeIndex, 1);
274
+ }
275
+
276
+ // Clear child's parent reference
277
+ child.parent = null;
278
+
279
+ // Emit detached event for observers
280
+ this.emitEvent({
281
+ type: 'childDetached',
282
+ parentId: this.id,
283
+ childId: child.id,
284
+ });
285
+ }
286
+ ```
287
+
288
+ ### Quaternary Fix: Update Event Types
289
+
290
+ Add `childDetached` to the event type union:
291
+
292
+ ```typescript
293
+ // File: src/types/events.ts
294
+ export type WorkflowEvent =
295
+ | { type: 'stepStart'; node: WorkflowNode; step: string }
296
+ | { type: 'stepFinish'; node: WorkflowNode; step: string; result: unknown }
297
+ | { type: 'stateUpdated'; node: WorkflowNode; state: Record<string, unknown> }
298
+ | { type: 'childAttached'; parentId: string; child: WorkflowNode }
299
+ | { type: 'childDetached'; parentId: string; childId: string } // NEW
300
+ | { type: 'treeUpdated'; node: WorkflowNode }
301
+ | { type: 'error'; node: WorkflowNode; error: WorkflowError };
302
+ ```
303
+
304
+ ## Test Coverage Requirements
305
+
306
+ ### Required New Tests
307
+
308
+ 1. **Prevent attaching child with existing parent**:
309
+ ```typescript
310
+ it('should throw when attaching child that already has a different parent')
311
+ ```
312
+
313
+ 2. **Allow attaching child with null parent**:
314
+ ```typescript
315
+ it('should attach child when child.parent is null')
316
+ ```
317
+
318
+ 3. **Prevent circular references**:
319
+ ```typescript
320
+ it('should throw when attaching ancestor as child (circular reference)')
321
+ ```
322
+
323
+ 4. **Prevent duplicate children**:
324
+ ```typescript
325
+ it('should throw when attaching same child twice to same parent')
326
+ ```
327
+
328
+ 5. **detachChild() removes child properly**:
329
+ ```typescript
330
+ it('should detach child and clear parent reference')
331
+ ```
332
+
333
+ 6. **Observer propagation after reparenting**:
334
+ ```typescript
335
+ it('should propagate events to new parent observers after reparenting')
336
+ ```
337
+
338
+ 7. **Bidirectional tree consistency**:
339
+ ```typescript
340
+ it('should maintain consistency between workflow tree and node tree')
341
+ ```
342
+
343
+ 8. **Adversarial: manual parent mutation**:
344
+ ```typescript
345
+ it('should handle manual parent mutation gracefully')
346
+ ```
347
+
348
+ 9. **Deep hierarchy without stack overflow**:
349
+ ```typescript
350
+ it('should handle 1000+ level deep hierarchies')
351
+ ```
352
+
353
+ 10. **Complex circular reference detection**:
354
+ ```typescript
355
+ it('should detect circular references in deep trees')
356
+ ```
357
+
358
+ ## Backward Compatibility
359
+
360
+ ### Breaking Changes
361
+
362
+ **None**. This fix only prevents buggy behavior that was already incorrect.
363
+
364
+ ### Behavior Changes
365
+
366
+ - **Before**: `attachChild()` would silently create inconsistent state
367
+ - **After**: `attachChild()` throws clear error with guidance
368
+
369
+ ### Migration Path
370
+
371
+ Users who were accidentally relying on the buggy behavior (e.g., attaching a child to multiple parents) will need to:
372
+
373
+ 1. **Option A**: Use only one parent (recommended)
374
+ 2. **Option B**: Implement reparenting with `detachChild()`:
375
+ ```typescript
376
+ // Before (buggy):
377
+ parent2.attachChild(child); // Silent failure if child has parent
378
+
379
+ // After (correct):
380
+ if (child.parent) {
381
+ child.parent.detachChild(child);
382
+ }
383
+ parent2.attachChild(child);
384
+ ```
385
+
386
+ ## Validation Checklist
387
+
388
+ - [ ] Implementation matches PRD Section 12.2 requirements
389
+ - [ ] All 241 existing tests still pass
390
+ - [ ] All new tests pass (10+ tests)
391
+ - [ ] Observer events propagate correctly after fix
392
+ - [ ] Tree debugger shows consistent trees
393
+ - [ ] getRoot() returns correct root after fix
394
+ - [ ] Error messages are clear and actionable
395
+ - [ ] Circular reference detection works
396
+ - [ ] Reparenting workflow works with detachChild()
397
+ - [ ] Code follows existing patterns and style
398
+ - [ ] Types are all correct (TypeScript compilation)
399
+ - [ ] No performance regression
400
+
401
+ ## Success Metrics
402
+
403
+ 1. **Bug Fixed**: Cannot create inconsistent tree state
404
+ 2. **Tests Pass**: All 241+ tests pass
405
+ 3. **Observer Works**: Events propagate to correct observers
406
+ 4. **PRD Compliance**: Fully compliant with Section 12.2
407
+ 5. **Clear Errors**: Error messages guide users to solution
408
+ 6. **No Regression**: All existing functionality works as before
409
+
410
+ ## References
411
+
412
+ - PRD Section 12.2: Workflow Base Class
413
+ - File: `src/core/workflow.ts`, lines 187-201
414
+ - Test File: `src/__tests__/adversarial/edge-case.test.ts`
415
+ - Event Types: `src/types/events.ts`