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,216 @@
1
+ /**
2
+ * Performance Test: attachChild() with isDescendantOf() validation
3
+ *
4
+ * Validates that the isDescendantOf() method (added in P1.M1.T2.S2)
5
+ * does not cause significant performance degradation in attachChild()
6
+ * operations across various tree sizes and configurations.
7
+ *
8
+ * Performance Thresholds (from deep-hierarchy-stress.test.ts):
9
+ * - Single operation: < 100ms
10
+ * - Bulk operations (100 iterations): < 1000ms
11
+ * - isDescendantOf() complexity: O(d) where d = tree depth
12
+ *
13
+ * Related: plan/bugfix/P1M4T2S2/PRP.md
14
+ */
15
+
16
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
17
+ import { Workflow } from '../../index.js';
18
+ import { validateTreeConsistency, verifyBidirectionalLink } from '../helpers/tree-verification.js';
19
+
20
+ /**
21
+ * SimpleWorkflow class for performance testing
22
+ * Pattern from: src/__tests__/adversarial/deep-hierarchy-stress.test.ts:20-26
23
+ */
24
+ class SimpleWorkflow extends Workflow {
25
+ async run(): Promise<string> {
26
+ this.setStatus('running');
27
+ this.setStatus('completed');
28
+ return 'done';
29
+ }
30
+ }
31
+
32
+ describe('attachChild Performance Regression Tests', () => {
33
+ /**
34
+ * Setup: Mock console methods to capture error messages
35
+ * Pattern from: src/__tests__/adversarial/deep-hierarchy-stress.test.ts:33-37
36
+ */
37
+ beforeEach(() => {
38
+ vi.spyOn(console, 'log').mockImplementation(() => {});
39
+ vi.spyOn(console, 'error').mockImplementation(() => {});
40
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
41
+ });
42
+
43
+ /**
44
+ * Teardown: Restore all mocks to prevent test pollution
45
+ * CRITICAL: Always use vi.restoreAllMocks() in afterEach
46
+ */
47
+ afterEach(() => {
48
+ vi.restoreAllMocks();
49
+ });
50
+
51
+ /**
52
+ * Test 1: Shallow tree performance (depth 10)
53
+ *
54
+ * Validates that attachChild() performs very fast on shallow trees
55
+ * where isDescendantOf() only needs to traverse a short parent chain.
56
+ *
57
+ * Threshold: < 10ms (should be very fast for shallow trees)
58
+ */
59
+ it('should attach child in shallow tree within acceptable time', () => {
60
+ // ARRANGE: Create shallow tree (depth 10)
61
+ const DEPTH = 10;
62
+ const root = new SimpleWorkflow('Root');
63
+ let current: any = root;
64
+
65
+ for (let i = 0; i < DEPTH; i++) {
66
+ current = new SimpleWorkflow(`Level-${i}`, current);
67
+ }
68
+
69
+ // ACT: Measure attachChild() time for new child at depth 10
70
+ const startTime = performance.now();
71
+ const newChild = new SimpleWorkflow('NewChild', current);
72
+ const attachDuration = performance.now() - startTime;
73
+
74
+ // ASSERT: Verify functional correctness
75
+ expect(newChild.parent).toBe(current);
76
+ expect(current.children).toContain(newChild);
77
+ verifyBidirectionalLink(current, newChild);
78
+
79
+ // ASSERT: Verify performance threshold (< 10ms for shallow tree)
80
+ expect(attachDuration).toBeLessThan(10);
81
+ });
82
+
83
+ /**
84
+ * Test 2: Deep tree performance (depth 100)
85
+ *
86
+ * Validates that attachChild() scales linearly with tree depth.
87
+ * isDescendantOf() must traverse 100 parent references, which should
88
+ * complete in < 50ms given the O(d) iterative implementation.
89
+ *
90
+ * Threshold: < 50ms (linear scaling with depth)
91
+ */
92
+ it('should attach child in deep tree (depth 100) within acceptable time', () => {
93
+ // ARRANGE: Create deep tree
94
+ const DEPTH = 100;
95
+ const root = new SimpleWorkflow('Root');
96
+ let current: any = root;
97
+
98
+ for (let i = 0; i < DEPTH; i++) {
99
+ current = new SimpleWorkflow(`Child-${i}`, current);
100
+ }
101
+
102
+ // ACT: Measure attachChild() at deepest level
103
+ const startTime = performance.now();
104
+ const newChild = new SimpleWorkflow('NewChild', current);
105
+ const attachDuration = performance.now() - startTime;
106
+
107
+ // ASSERT: Functional correctness
108
+ verifyBidirectionalLink(current, newChild);
109
+
110
+ // ASSERT: Performance threshold (< 50ms for depth 100)
111
+ expect(attachDuration).toBeLessThan(50);
112
+
113
+ // ASSERT: Validate overall tree consistency
114
+ const errors = validateTreeConsistency(root);
115
+ expect(errors).toHaveLength(0);
116
+ });
117
+
118
+ /**
119
+ * Test 3: Extreme deep tree (depth 1000)
120
+ *
121
+ * Validates that attachChild() handles extreme depth without stack overflow
122
+ * and completes within acceptable time. This tests the O(d) complexity
123
+ * at the upper bound of typical workflow tree depths.
124
+ *
125
+ * Threshold: < 100ms (from deep-hierarchy-stress.test.ts:169)
126
+ */
127
+ it('should attach child in extreme deep tree (depth 1000) without stack overflow', () => {
128
+ const DEPTH = 1000;
129
+ const root = new SimpleWorkflow('Root');
130
+ let current: any = root;
131
+
132
+ for (let i = 0; i < DEPTH; i++) {
133
+ current = new SimpleWorkflow(`Child-${i}`, current);
134
+ }
135
+
136
+ // ACT: Measure attachChild() at depth 1000
137
+ const startTime = performance.now();
138
+ const newChild = new SimpleWorkflow('NewChild', current);
139
+ const attachDuration = performance.now() - startTime;
140
+
141
+ // ASSERT: Functional correctness
142
+ verifyBidirectionalLink(current, newChild);
143
+
144
+ // ASSERT: Performance threshold (< 100ms from deep-hierarchy-stress.test.ts:169)
145
+ expect(attachDuration).toBeLessThan(100);
146
+
147
+ // ASSERT: Validate tree consistency at extreme depth
148
+ const errors = validateTreeConsistency(root);
149
+ expect(errors).toHaveLength(0);
150
+ });
151
+
152
+ /**
153
+ * Test 4: Wide tree performance (100 children)
154
+ *
155
+ * Validates that attachChild() performs efficiently when attaching
156
+ * multiple children to a single parent. Each attachment only requires
157
+ * checking immediate parent chain, so performance should be excellent.
158
+ *
159
+ * Threshold: < 100ms total, < 1ms average per attachment
160
+ */
161
+ it('should attach 100 children to single parent efficiently', () => {
162
+ // ARRANGE: Create parent
163
+ const parent = new SimpleWorkflow('Parent');
164
+ const NUM_CHILDREN = 100;
165
+
166
+ // ACT: Measure time to attach all children
167
+ const startTime = performance.now();
168
+ for (let i = 0; i < NUM_CHILDREN; i++) {
169
+ const child = new SimpleWorkflow(`Child-${i}`, parent);
170
+ }
171
+ const totalDuration = performance.now() - startTime;
172
+
173
+ // ASSERT: Verify all children attached
174
+ expect(parent.children).toHaveLength(NUM_CHILDREN);
175
+ parent.children.forEach(child => {
176
+ verifyBidirectionalLink(parent, child);
177
+ });
178
+
179
+ // ASSERT: Performance (< 100ms total, < 1ms average)
180
+ expect(totalDuration).toBeLessThan(100);
181
+ const avgTime = totalDuration / NUM_CHILDREN;
182
+ expect(avgTime).toBeLessThan(1); // < 1ms per attachment
183
+ });
184
+
185
+ /**
186
+ * Test 5: Bulk attachment performance (100 operations)
187
+ *
188
+ * Validates that sequential attachChild() operations complete within
189
+ * acceptable time. This measures cumulative overhead of isDescendantOf()
190
+ * validation across multiple operations.
191
+ *
192
+ * Threshold: < 1000ms (from deep-hierarchy-stress.test.ts:186)
193
+ */
194
+ it('should complete 100 sequential attachChild operations within acceptable time', () => {
195
+ // ARRANGE: Create root workflow
196
+ const root = new SimpleWorkflow('Root');
197
+ const ITERATIONS = 100;
198
+
199
+ // ACT: Measure cumulative time for 100 attachments
200
+ const totalStartTime = performance.now();
201
+ for (let i = 0; i < ITERATIONS; i++) {
202
+ const child = new SimpleWorkflow(`Child-${i}`, root);
203
+ }
204
+ const totalDuration = performance.now() - totalStartTime;
205
+
206
+ // ASSERT: Verify functional correctness
207
+ expect(root.children).toHaveLength(ITERATIONS);
208
+
209
+ // ASSERT: Performance threshold (< 1000ms from deep-hierarchy-stress.test.ts:186)
210
+ expect(totalDuration).toBeLessThan(1000);
211
+
212
+ // ASSERT: Average time per operation
213
+ const avgTime = totalDuration / ITERATIONS;
214
+ expect(avgTime).toBeLessThan(10); // < 10ms average
215
+ });
216
+ });
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Circular Reference Tests (TDD Red Phase)
3
+ *
4
+ * These tests validate the attachChild() method properly prevents
5
+ * attaching an ancestor workflow as a child (which would create a circular reference).
6
+ *
7
+ * This is the RED phase of TDD - tests are written to FAIL initially,
8
+ * documenting the expected behavior before implementation.
9
+ *
10
+ * Related: plan/docs/bugfix-architecture/bug_analysis.md
11
+ */
12
+
13
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
14
+ import { Workflow } from '../../index.js';
15
+
16
+ /**
17
+ * SimpleWorkflow class for testing
18
+ * Pattern from: src/__tests__/unit/workflow.test.ts:4-11
19
+ */
20
+ class SimpleWorkflow extends Workflow {
21
+ async run(): Promise<string> {
22
+ this.setStatus('running');
23
+ this.setStatus('completed');
24
+ return 'done';
25
+ }
26
+ }
27
+
28
+ describe('Adversarial: Circular Reference Detection', () => {
29
+ /**
30
+ * Setup: Mock console methods to capture error messages
31
+ * Pattern from: research/console-mocking.md "Basic Spying Patterns"
32
+ */
33
+ beforeEach(() => {
34
+ vi.spyOn(console, 'log').mockImplementation(() => {});
35
+ vi.spyOn(console, 'error').mockImplementation(() => {});
36
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
37
+ });
38
+
39
+ /**
40
+ * Teardown: Restore all mocks to prevent test pollution
41
+ * CRITICAL: Always use vi.restoreAllMocks() in afterEach
42
+ */
43
+ afterEach(() => {
44
+ vi.restoreAllMocks();
45
+ });
46
+
47
+ /**
48
+ * Test 1: Immediate Circular Reference
49
+ *
50
+ * Bug: attachChild() does NOT check if the child being attached is actually
51
+ * an ancestor of this workflow (would create a circular reference)
52
+ *
53
+ * Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
54
+ * Actual: No error thrown, circular reference created
55
+ *
56
+ * Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md "Pattern 2"
57
+ */
58
+ it('should throw when attaching immediate parent as child', () => {
59
+ // ARRANGE: Create parent and child workflows
60
+ const parent = new SimpleWorkflow('Parent');
61
+ const child = new SimpleWorkflow('Child', parent);
62
+
63
+ // Verify initial state
64
+ // CRITICAL: Constructor auto-attaches child to parent at workflow.ts:113-116
65
+ expect(child.parent).toBe(parent);
66
+ expect(parent.children).toContain(child);
67
+
68
+ // ACT & ASSERT: Attempting to attach parent as child should throw
69
+ // This test FAILS because attachChild() doesn't call this.isDescendantOf(child)
70
+ expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/i);
71
+ });
72
+
73
+ /**
74
+ * Test 2: Ancestor Circular Reference (Multi-level)
75
+ *
76
+ * Bug: attachChild() does NOT check if the child being attached is an ancestor
77
+ * anywhere up the parent chain (would create a circular reference)
78
+ *
79
+ * Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
80
+ * Actual: No error thrown, circular reference created
81
+ *
82
+ * Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md "Pattern 2"
83
+ */
84
+ it('should throw when attaching ancestor as child', () => {
85
+ // ARRANGE: Create 3-level hierarchy
86
+ const root = new SimpleWorkflow('Root');
87
+ const child1 = new SimpleWorkflow('Child1', root);
88
+ const child2 = new SimpleWorkflow('Child2', child1);
89
+
90
+ // Verify initial state
91
+ // CRITICAL: Constructor auto-attaches at workflow.ts:113-116
92
+ expect(child2.parent).toBe(child1);
93
+ expect(child1.parent).toBe(root);
94
+ expect(root.children).toContain(child1);
95
+ expect(child1.children).toContain(child2);
96
+
97
+ // ACT & ASSERT: Attempting to attach root as child of child2 should throw
98
+ // This test FAILS because attachChild() doesn't call this.isDescendantOf(child)
99
+ expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
100
+ });
101
+ });
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Complex Circular Reference Tests
3
+ *
4
+ * These tests validate that isDescendantOf() correctly detects circular
5
+ * references at various depths in the workflow tree.
6
+ *
7
+ * Test Cases:
8
+ * 1. Immediate circular reference (depth 1): child.attachChild(parent)
9
+ * 2. Two-level circular reference (depth 2): grandchild.attachChild(root)
10
+ * 3. Three-level circular reference (depth 3): great-grandchild.attachChild(root)
11
+ *
12
+ * Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md Pattern 8
13
+ * Related: plan/bugfix/P1M3T1S3/PRP.md
14
+ */
15
+
16
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
17
+ import { Workflow } from '../../index.js';
18
+
19
+ /**
20
+ * SimpleWorkflow class for testing
21
+ * Pattern from: src/__tests__/adversarial/circular-reference.test.ts:20-26
22
+ */
23
+ class SimpleWorkflow extends Workflow {
24
+ async run(): Promise<string> {
25
+ this.setStatus('running');
26
+ this.setStatus('completed');
27
+ return 'done';
28
+ }
29
+ }
30
+
31
+ describe('Adversarial: Complex Circular Reference Detection', () => {
32
+ /**
33
+ * Setup: Mock console methods to capture error messages
34
+ * Pattern from: src/__tests__/adversarial/circular-reference.test.ts:33-37
35
+ */
36
+ beforeEach(() => {
37
+ vi.spyOn(console, 'log').mockImplementation(() => {});
38
+ vi.spyOn(console, 'error').mockImplementation(() => {});
39
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
40
+ });
41
+
42
+ /**
43
+ * Teardown: Restore all mocks to prevent test pollution
44
+ * CRITICAL: Always use vi.restoreAllMocks() in afterEach
45
+ */
46
+ afterEach(() => {
47
+ vi.restoreAllMocks();
48
+ });
49
+
50
+ /**
51
+ * Test 1: Immediate Circular Reference (depth 1)
52
+ *
53
+ * Validates that attachChild() prevents creating a cycle when a child
54
+ * attempts to attach its immediate parent as its child.
55
+ *
56
+ * Hierarchy: root -> child1
57
+ * Cycle attempt: child1.attachChild(root)
58
+ *
59
+ * Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
60
+ */
61
+ it('should throw when attaching immediate parent as child (depth 1)', () => {
62
+ // ARRANGE: Create 2-level hierarchy (root, child1)
63
+ const root = new SimpleWorkflow('Root');
64
+ const child1 = new SimpleWorkflow('Child1', root);
65
+
66
+ // Verify initial state
67
+ // CRITICAL: Constructor auto-attaches child to parent at workflow.ts:113-116
68
+ expect(child1.parent).toBe(root);
69
+ expect(root.children).toContain(child1);
70
+
71
+ // ACT & ASSERT: Attempting to attach parent as child should throw
72
+ // This validates isDescendantOf() detects the immediate ancestor
73
+ expect(() => child1.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
74
+ });
75
+
76
+ /**
77
+ * Test 2: Two-Level Circular Reference (depth 2)
78
+ *
79
+ * Validates that attachChild() prevents creating a cycle when a grandchild
80
+ * attempts to attach its grandparent (root) as its child.
81
+ *
82
+ * Hierarchy: root -> child1 -> child2
83
+ * Cycle attempt: child2.attachChild(root)
84
+ *
85
+ * Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
86
+ */
87
+ it('should throw when attaching grandparent as child (depth 2)', () => {
88
+ // ARRANGE: Create 3-level hierarchy (root, child1, child2)
89
+ const root = new SimpleWorkflow('Root');
90
+ const child1 = new SimpleWorkflow('Child1', root);
91
+ const child2 = new SimpleWorkflow('Child2', child1);
92
+
93
+ // Verify initial state
94
+ // CRITICAL: Constructor auto-attaches at workflow.ts:113-116
95
+ expect(child2.parent).toBe(child1);
96
+ expect(child1.parent).toBe(root);
97
+ expect(root.children).toContain(child1);
98
+ expect(child1.children).toContain(child2);
99
+
100
+ // ACT & ASSERT: Attempting to attach root as child of child2 should throw
101
+ // This validates isDescendantOf() traverses the full ancestor chain
102
+ expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
103
+ });
104
+
105
+ /**
106
+ * Test 3: Three-Level Circular Reference (depth 3)
107
+ *
108
+ * Validates that attachChild() prevents creating a cycle when a great-grandchild
109
+ * attempts to attach its great-grandparent (root) as its child.
110
+ *
111
+ * Hierarchy: root -> child1 -> child2 -> child3
112
+ * Cycle attempt: child3.attachChild(root)
113
+ *
114
+ * Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
115
+ *
116
+ * This test provides NEW coverage not present in circular-reference.test.ts
117
+ * which only tests depth 1 (immediate parent) and depth 2 (ancestor).
118
+ */
119
+ it('should throw when attaching great-grandparent as child (depth 3)', () => {
120
+ // ARRANGE: Create 4-level hierarchy (root, child1, child2, child3)
121
+ const root = new SimpleWorkflow('Root');
122
+ const child1 = new SimpleWorkflow('Child1', root); // root -> child1
123
+ const child2 = new SimpleWorkflow('Child2', child1); // root -> child1 -> child2
124
+ const child3 = new SimpleWorkflow('Child3', child2); // root -> child1 -> child2 -> child3
125
+
126
+ // Verify initial state
127
+ // CRITICAL: Constructor auto-attaches at workflow.ts:113-116
128
+ expect(child3.parent).toBe(child2);
129
+ expect(child2.parent).toBe(child1);
130
+ expect(child1.parent).toBe(root);
131
+ expect(root.children).toContain(child1);
132
+ expect(child1.children).toContain(child2);
133
+ expect(child2.children).toContain(child3);
134
+
135
+ // ACT & ASSERT: Attempting to attach root as child of child3 should throw
136
+ // This validates isDescendantOf() detects deep ancestors (3+ levels)
137
+ expect(() => child3.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
138
+ });
139
+ });