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,319 @@
1
+ # Cycle Detection Research - Quick Reference for PRP Documents
2
+
3
+ **Last Updated:** 2025-01-11
4
+ **Source:** `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
5
+
6
+ ---
7
+
8
+ ## Key Findings Summary
9
+
10
+ ### 1. Recommended Approach: WeakSet-based Detection
11
+
12
+ ```typescript
13
+ function detectCycle<T extends object>(
14
+ node: T,
15
+ visited: WeakSet<T> = new WeakSet()
16
+ ): void {
17
+ if (visited.has(node)) {
18
+ throw new Error(`Cycle detected at ${getNodeId(node)}`);
19
+ }
20
+ visited.add(node);
21
+
22
+ // Process children...
23
+ if ('children' in node && Array.isArray((node as any).children)) {
24
+ for (const child of (node as any).children) {
25
+ detectCycle(child, visited);
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ **Why WeakSet?**
32
+ - Memory efficient (automatic garbage collection)
33
+ - O(1) lookup/insertion
34
+ - No manual cleanup needed
35
+ - <5% performance overhead
36
+
37
+ ---
38
+
39
+ ### 2. Security: DoS Prevention Layers
40
+
41
+ ```typescript
42
+ interface TraversalOptions {
43
+ maxDepth?: number; // Prevent stack overflow (default: 1000)
44
+ maxNodes?: number; // Prevent memory exhaustion (default: 10000)
45
+ timeoutMs?: number; // Prevent CPU exhaustion (default: 5000ms)
46
+ }
47
+
48
+ function secureTraverse<T>(root: T, options: TraversalOptions): void {
49
+ const { maxDepth = 1000, maxNodes = 10000, timeoutMs = 5000 } = options;
50
+ const startTime = Date.now();
51
+ const visited = new WeakSet<object>();
52
+ let nodeCount = 0;
53
+
54
+ function traverse(node: any, depth: number): void {
55
+ // Check 1: Timeout
56
+ if (Date.now() - startTime > timeoutMs) {
57
+ throw new Error(`Traversal timeout (${timeoutMs}ms) exceeded`);
58
+ }
59
+
60
+ // Check 2: Depth limit
61
+ if (depth > maxDepth) {
62
+ throw new Error(`Maximum depth (${maxDepth}) exceeded`);
63
+ }
64
+
65
+ // Check 3: Node count limit
66
+ if (nodeCount++ > maxNodes) {
67
+ throw new Error(`Maximum node count (${maxNodes}) exceeded`);
68
+ }
69
+
70
+ // Check 4: Cycle detection
71
+ if (visited.has(node)) {
72
+ throw new Error(`Circular reference detected`);
73
+ }
74
+
75
+ visited.add(node);
76
+
77
+ // Process children
78
+ if (node.children) {
79
+ for (const child of node.children) {
80
+ traverse(child, depth + 1);
81
+ }
82
+ }
83
+ }
84
+
85
+ traverse(root, 0);
86
+ }
87
+ ```
88
+
89
+ ---
90
+
91
+ ### 3. Error Message Best Practices
92
+
93
+ ```typescript
94
+ class CycleDetectionError extends Error {
95
+ constructor(
96
+ nodeName: string,
97
+ cyclePath: string[],
98
+ nodeType: string,
99
+ depth: number
100
+ ) {
101
+ super(
102
+ `Cycle detected in ${nodeType}:\n` +
103
+ ` Problem node: "${nodeName}"\n` +
104
+ ` Cycle path: ${cyclePath.join(' → ')}\n` +
105
+ ` Depth: ${depth}\n` +
106
+ `\n` +
107
+ `Common causes:\n` +
108
+ ` 1. A node was attached as its own parent/ancestor\n` +
109
+ ` 2. Multiple nodes form a circular reference chain\n` +
110
+ ` 3. Shared children between different parents\n` +
111
+ `\n` +
112
+ `Suggested fixes:\n` +
113
+ ` - Verify parent-child relationships during attachment\n` +
114
+ ` - Use unique IDs for all nodes\n` +
115
+ ` - Add cycle detection in your attachChild() method`
116
+ );
117
+
118
+ this.name = 'CycleDetectionError';
119
+ }
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ### 4. Real-World Examples from Popular Libraries
126
+
127
+ #### estree-walker (AST Traversal)
128
+ - **URL:** https://github.com/Rich-Harris/estree-walker
129
+ - **Pattern:** No explicit cycle detection (ASTs are guaranteed acyclic)
130
+ - **Lesson:** If you can guarantee no cycles at creation time, skip runtime checks
131
+
132
+ #### Vue.js Reactivity System
133
+ - **URL:** https://github.com/vuejs/core
134
+ - **Pattern:** Uses WeakMap for tracking reactive effects
135
+ - **Lesson:** WeakMap for automatic garbage collection
136
+
137
+ #### TypeScript Compiler
138
+ - **URL:** https://github.com/microsoft/TypeScript
139
+ - **Pattern:** Type system prevents circular references
140
+ - **Lesson:** Use type system guarantees when possible
141
+
142
+ #### JSON.stringify (V8)
143
+ - **Pattern:** Detects circular references automatically
144
+ - **Lesson:** Provide custom replacer for graceful handling
145
+
146
+ ---
147
+
148
+ ### 5. Performance Benchmarks (1000 nodes)
149
+
150
+ | Method | Time | Memory | Recommendation |
151
+ |--------|------|--------|----------------|
152
+ | No detection | 1.5ms | N/A | Vulnerable |
153
+ | **WeakSet** | 2.0ms | +5% | **Recommended** |
154
+ | Set (IDs) | 2.8ms | +10% | Good alternative |
155
+ | Map (paths) | 4.5ms | +25% | Debug mode only |
156
+
157
+ **Conclusion:** Proper cycle detection adds <50% overhead
158
+
159
+ ---
160
+
161
+ ### 6. Integration Pattern for Workflow Classes
162
+
163
+ ```typescript
164
+ export class Workflow {
165
+ private cycleDetector = new ProductionCycleDetector<Workflow>();
166
+
167
+ public attachChild(child: Workflow): void {
168
+ try {
169
+ // Check for cycles BEFORE attaching
170
+ this.cycleDetector.check(child);
171
+
172
+ // Safe to attach
173
+ this.children.push(child);
174
+ child.parent = this;
175
+
176
+ // Notify observers
177
+ this.emitEvent({
178
+ type: 'childAttached',
179
+ parentId: this.id,
180
+ child: child.node,
181
+ });
182
+ } catch (error) {
183
+ this.cycleDetector.reset();
184
+ throw new Error(`Failed to attach child: ${error.message}`);
185
+ }
186
+ }
187
+
188
+ public getRoot(): Workflow {
189
+ const detector = new ProductionCycleDetector<Workflow>();
190
+
191
+ function findRoot(wf: Workflow): Workflow {
192
+ detector.check(wf);
193
+ return wf.parent ? findRoot(wf.parent) : wf;
194
+ }
195
+
196
+ try {
197
+ return findRoot(this);
198
+ } catch (error) {
199
+ throw new Error(`Cycle detected: ${error.message}`);
200
+ }
201
+ }
202
+ }
203
+ ```
204
+
205
+ ---
206
+
207
+ ### 7. Key Gotchas to Avoid
208
+
209
+ 1. **Shared Children:** Same child referenced by multiple parents (use true cycle detection, not just visited check)
210
+ 2. **WeakSet Can't Iterate:** Can't reconstruct full path from WeakSet alone (use parallel array tracking)
211
+ 3. **Backtracking in Non-Cyclic Graphs:** Must delete from Set when backtracking (WeakSet auto-GCs)
212
+ 4. **Primitives Can't Use WeakSet:** Use Set for string/number IDs
213
+ 5. **Async Race Conditions:** Multiple traversals can interfere (use local visited sets)
214
+ 6. **Mutation During Traversal:** Copy children arrays before iteration
215
+
216
+ ---
217
+
218
+ ### 8. Recommended Implementation Checklist
219
+
220
+ - [ ] Use WeakSet for object tracking (memory efficient)
221
+ - [ ] Add depth limiting (prevent stack overflow)
222
+ - [ ] Add timeout protection (prevent CPU exhaustion)
223
+ - [ ] Add node count limiting (prevent memory exhaustion)
224
+ - [ ] Provide detailed error messages with path information
225
+ - [ ] Reset detector state appropriately
226
+ - [ ] Add unit tests for cycle scenarios
227
+ - [ ] Add monitoring/metrics for production
228
+ - [ ] Document security implications in code comments
229
+
230
+ ---
231
+
232
+ ### 9. URLs for PRP References
233
+
234
+ #### Documentation
235
+ - MDN WeakSet: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
236
+ - MDN WeakMap: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
237
+ - Floyd's Algorithm: https://en.wikipedia.org/wiki/Cycle_detection
238
+
239
+ #### Libraries
240
+ - estree-walker: https://github.com/Rich-Harris/estree-walker
241
+ - TypeScript: https://github.com/microsoft/TypeScript
242
+ - Vue.js: https://github.com/vuejs/core
243
+ - React: https://github.com/facebook/react
244
+
245
+ #### Security
246
+ - OWASP DoS: https://owasp.org/www-community/attacks/Denial_of_Service
247
+ - CWE-835: https://cwe.mitre.org/data/definitions/835.html
248
+
249
+ #### Tools
250
+ - flatted: https://github.com/WebReflection/flatted
251
+ - json-stringify-safe: https://github.com/moll/json-stringify-safe
252
+
253
+ ---
254
+
255
+ ### 10. Copy-Paste Ready Implementation
256
+
257
+ ```typescript
258
+ /**
259
+ * Production cycle detector
260
+ * Usage: new ProductionCycleDetector().check(node)
261
+ */
262
+ export class ProductionCycleDetector<T extends object> {
263
+ private visited = new WeakSet<T>();
264
+ private path: T[] = [];
265
+ private readonly maxDepth: number;
266
+ private readonly timeout: number;
267
+ private startTime: number;
268
+
269
+ constructor(options: { maxDepth?: number; timeoutMs?: number } = {}) {
270
+ this.maxDepth = options.maxDepth ?? 1000;
271
+ this.timeout = options.timeoutMs ?? 5000;
272
+ this.startTime = Date.now();
273
+ }
274
+
275
+ check(node: T): void {
276
+ // Timeout check
277
+ if (Date.now() - this.startTime > this.timeout) {
278
+ throw new Error(`Traversal timeout (${this.timeout}ms) exceeded`);
279
+ }
280
+
281
+ // Depth check
282
+ if (this.path.length > this.maxDepth) {
283
+ throw new Error(`Maximum depth (${this.maxDepth}) exceeded`);
284
+ }
285
+
286
+ // Cycle check
287
+ if (this.visited.has(node)) {
288
+ const pathInfo = this.path.map(n =>
289
+ (n as any).id || (n as any).name || 'unknown'
290
+ ).join(' -> ');
291
+
292
+ throw new Error(
293
+ `Cycle detected.\n` +
294
+ `Node type: ${(node as any).constructor.name}\n` +
295
+ `Path: ${pathInfo}\n` +
296
+ `Depth: ${this.path.length}`
297
+ );
298
+ }
299
+
300
+ this.visited.add(node);
301
+ this.path.push(node);
302
+ }
303
+
304
+ leave(node: T): void {
305
+ const index = this.path.lastIndexOf(node);
306
+ if (index !== -1) this.path.splice(index, 1);
307
+ }
308
+
309
+ reset(): void {
310
+ this.visited = new WeakSet();
311
+ this.path = [];
312
+ this.startTime = Date.now();
313
+ }
314
+ }
315
+ ```
316
+
317
+ ---
318
+
319
+ **For Full Details:** See `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
@@ -0,0 +1,115 @@
1
+ # Codebase Context Research: P1.M1.T2.S1
2
+
3
+ ## Project Structure
4
+
5
+ ```
6
+ /home/dustin/projects/groundswell/
7
+ ├── src/
8
+ │ ├── core/
9
+ │ │ └── workflow.ts # Main Workflow class (349 lines)
10
+ │ ├── types/
11
+ │ │ ├── workflow.ts # Workflow type definitions
12
+ │ │ ├── events.ts # Event type definitions
13
+ │ │ └── observer.ts # Observer interface
14
+ │ └── __tests__/
15
+ │ ├── adversarial/
16
+ │ │ └── parent-validation.test.ts # Reference test pattern
17
+ │ ├── unit/
18
+ │ │ └── workflow.test.ts
19
+ │ └── integration/
20
+ ├── plan/
21
+ │ └── bugfix/
22
+ │ ├── P1M1T1S1/ # Completed parent validation
23
+ │ │ ├── research/ # Research docs from S1
24
+ │ │ └── PRP.md
25
+ │ └── P1M1T2S1/ # Current work item
26
+ │ └── research/
27
+ ├── package.json
28
+ ├── tsconfig.json
29
+ └── vitest.config.ts
30
+ ```
31
+
32
+ ## Test Framework
33
+
34
+ - **Framework**: Vitest
35
+ - **Config**: `vitest.config.ts`
36
+ - **Test command**: `npm test` (runs `vitest run`)
37
+ - **Watch mode**: `npm run test:watch`
38
+ - **Current status**: 242 tests passing
39
+
40
+ ## TypeScript Configuration
41
+
42
+ ```json
43
+ {
44
+ "compilerOptions": {
45
+ "target": "ES2022",
46
+ "module": "ES2022",
47
+ "strict": true,
48
+ "outDir": "./dist",
49
+ "rootDir": "./src"
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## Build/Test Commands
55
+
56
+ ```bash
57
+ # Run tests
58
+ npm test
59
+
60
+ # Watch mode
61
+ npm run test:watch
62
+
63
+ # Type check
64
+ npm run lint # Runs tsc --noEmit
65
+
66
+ # Build
67
+ npm run build
68
+ ```
69
+
70
+ ## Task Status (from bug_fix_tasks.json)
71
+
72
+ **P1.M1.T1 - Parent Validation - COMPLETED**
73
+ - Parent validation implemented in attachChild()
74
+ - Tests passing
75
+
76
+ **P1.M1.T2 - Circular Reference Detection - IN PROGRESS**
77
+ - S1: Write failing test (CURRENT TASK)
78
+ - S2: Implement isDescendantOf() helper method
79
+ - S3: Integrate circular reference check into attachChild()
80
+ - S4: Verify no regressions
81
+
82
+ ## Related Documentation
83
+
84
+ - **Implementation Patterns**: `/plan/docs/bugfix-architecture/implementation_patterns.md`
85
+ - **Bug Analysis**: `/plan/docs/bugfix-architecture/bug_analysis.md`
86
+ - **Cycle Detection Research**: `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
87
+
88
+ ## Dependencies
89
+
90
+ ```json
91
+ {
92
+ "dependencies": {
93
+ "@anthropic-ai/sdk": "^0.71.1",
94
+ "lru-cache": "^10.4.3",
95
+ "zod": "^3.23.0"
96
+ },
97
+ "devDependencies": {
98
+ "typescript": "^5.2.0",
99
+ "tsx": "^4.21.0",
100
+ "vitest": "^1.0.0"
101
+ }
102
+ }
103
+ ```
104
+
105
+ ## Import Patterns
106
+
107
+ ```typescript
108
+ // For tests
109
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
110
+ import { Workflow } from '../../index.js';
111
+
112
+ // For implementation
113
+ import { Workflow } from './workflow.js';
114
+ import type { WorkflowEvent, WorkflowNode } from '../types/index.js';
115
+ ```
@@ -0,0 +1,134 @@
1
+ # Cycle Detection Research: P1.M1.T2.S1
2
+
3
+ ## isDescendantOf() Pattern
4
+
5
+ The key method needed for circular reference detection is `isDescendantOf()`. This checks if a given workflow is an ancestor of the current workflow by traversing the parent chain.
6
+
7
+ ### Recommended Implementation Pattern
8
+
9
+ ```typescript
10
+ /**
11
+ * Check if this workflow is a descendant of another workflow
12
+ * Used to prevent circular references in attachChild()
13
+ */
14
+ private isDescendantOf(ancestor: Workflow): boolean {
15
+ const visited = new Set<Workflow>();
16
+ let current: Workflow | null = this.parent;
17
+
18
+ while (current !== null) {
19
+ // Cycle detection during traversal itself (defensive)
20
+ if (visited.has(current)) {
21
+ throw new Error('Circular reference detected in tree structure');
22
+ }
23
+ visited.add(current);
24
+
25
+ if (current === ancestor) {
26
+ return true;
27
+ }
28
+ current = current.parent;
29
+ }
30
+
31
+ return false;
32
+ }
33
+ ```
34
+
35
+ ## Usage in attachChild()
36
+
37
+ ```typescript
38
+ public attachChild(child: Workflow): void {
39
+ // ... existing validations ...
40
+
41
+ // Validation: Prevent circular references
42
+ if (this.isDescendantOf(child)) {
43
+ throw new Error(
44
+ `Cannot attach '${child.node.name}' to '${this.node.name}': ` +
45
+ `would create circular reference`
46
+ );
47
+ }
48
+
49
+ // ... rest of method ...
50
+ }
51
+ ```
52
+
53
+ ## Test Scenarios to Cover
54
+
55
+ ### Scenario 1: Immediate Circular Reference
56
+ ```typescript
57
+ const parent = new Workflow('Parent');
58
+ const child = new Workflow('Child', parent);
59
+
60
+ // This should throw - child is trying to attach its parent
61
+ expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/);
62
+ ```
63
+
64
+ ### Scenario 2: Ancestor Circular Reference (Multi-level)
65
+ ```typescript
66
+ const root = new Workflow('Root');
67
+ const child1 = new Workflow('Child1', root);
68
+ const child2 = new Workflow('Child2', child1);
69
+
70
+ // This should throw - root is an ancestor of child2
71
+ expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/);
72
+ ```
73
+
74
+ ## Error Message Convention
75
+
76
+ From implementation_patterns.md:
77
+ - Error should contain 'circular' OR 'cycle' OR 'ancestor'
78
+ - Pattern from research: `toThrow(/circular|cycle|ancestor/)`
79
+
80
+ ## Performance Considerations
81
+
82
+ - **Time Complexity**: O(h) where h is the height of the tree
83
+ - **Space Complexity**: O(h) for the visited Set
84
+ - **DoS Protection**: Consider max depth limit (currently not implemented)
85
+
86
+ ## Related Code Patterns
87
+
88
+ ### Existing getRoot() Pattern (similar traversal)
89
+ ```typescript
90
+ // From workflow.ts - shows similar parent chain traversal pattern
91
+ private getRoot(): Workflow {
92
+ const visited = new Set<Workflow>();
93
+ let current: Workflow | null = this;
94
+
95
+ while (current) {
96
+ if (visited.has(current)) {
97
+ throw new Error('Circular parent-child relationship detected');
98
+ }
99
+ visited.add(current);
100
+ current = current.parent;
101
+ }
102
+
103
+ return Array.from(visited).pop()!;
104
+ }
105
+ ```
106
+
107
+ ### Event Tree Ancestor Pattern
108
+ ```typescript
109
+ // From src/core/event-tree.ts - similar ancestor tracking
110
+ public getAncestors(id: string): EventNode[] {
111
+ const ancestors: EventNode[] = [];
112
+ const node = this.nodeIndex.get(id);
113
+
114
+ if (!node || !node.parentId) {
115
+ return ancestors;
116
+ }
117
+
118
+ let currentId = node.parentId;
119
+ while (currentId) {
120
+ const parent = this.nodeIndex.get(currentId);
121
+ if (!parent) break;
122
+ ancestors.push(parent);
123
+ currentId = parent.parentId ?? '';
124
+ }
125
+
126
+ return ancestors;
127
+ }
128
+ ```
129
+
130
+ ## Key Sources
131
+
132
+ - **Research Document**: `/home/dustin/projects/groundswell/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
133
+ - **Quick Reference**: `/home/dustin/projects/groundswell/plan/docs/research/CYCLE_DETECTION_QUICK_REF.md`
134
+ - **Implementation Patterns**: `/home/dustin/projects/groundswell/plan/docs/bugfix-architecture/implementation_patterns.md`