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,499 @@
1
+ # PRP: Write Complex Circular Reference Tests
2
+
3
+ ---
4
+
5
+ ## Goal
6
+
7
+ **Feature Goal**: Create a comprehensive test file for circular reference detection at various depths (immediate child, grandchild, great-grandchild) to validate that `isDescendantOf()` correctly prevents cycles through the entire ancestor chain.
8
+
9
+ **Deliverable**: New test file `src/__tests__/adversarial/complex-circular-reference.test.ts` with three test cases covering different cycle depths.
10
+
11
+ **Success Definition**:
12
+ - All three test cases pass when run with `npm run test`
13
+ - Each test validates that `attachChild()` throws an error containing 'circular', 'cycle', or 'ancestor' (case-insensitive)
14
+ - Tests follow the existing adversarial test patterns (AAA structure, console mocking, TDD documentation)
15
+ - Tests are properly documented with inline comments explaining the cycle detection mechanism
16
+
17
+ ## User Persona (if applicable)
18
+
19
+ **Target User**: Developer implementing the Workflow class tree integrity validation.
20
+
21
+ **Use Case**: Validating that circular reference detection works correctly across various ancestor depths in the workflow tree.
22
+
23
+ **User Journey**:
24
+ 1. Developer writes code to attach a workflow as a child
25
+ 2. If the child is an ancestor (at any depth), `attachChild()` must throw an error
26
+ 3. These tests verify the error is thrown for immediate parent (depth 1), grandparent (depth 2), and great-grandparent (depth 3)
27
+
28
+ **Pain Points Addressed**:
29
+ - Detects subtle bugs where cycle detection only works for immediate parent but not deeper ancestors
30
+ - Prevents infinite loops in tree traversal methods like `getRoot()` and `getRootObservers()`
31
+ - Validates defensive programming against manual parent mutation
32
+
33
+ ## Why
34
+
35
+ - **Security**: Circular references cause infinite loops in tree traversal, leading to DoS vulnerabilities
36
+ - **Data Integrity**: Cycles break the tree invariant, causing incorrect behavior in observer propagation and state management
37
+ - **Bug Prevention**: Existing tests in `circular-reference.test.ts` only test depth 1 (immediate parent) and depth 2 (ancestor). This adds depth 3 coverage
38
+ - **Pattern Compliance**: Fulfills Pattern 8 from `plan/bugfix/architecture/implementation_patterns.md` which requires testing cycles at various depths
39
+
40
+ ## What
41
+
42
+ Create a new test file `src/__tests__/adversarial/complex-circular-reference.test.ts` with three test cases:
43
+
44
+ 1. **Immediate Circular Reference**: `child.attachChild(parent)` - depth 1 cycle
45
+ 2. **Two-Level Circular Reference**: `child2.attachChild(root)` where root → child1 → child2 - depth 2 cycle
46
+ 3. **Three-Level Circular Reference**: `child3.attachChild(root)` where root → child1 → child2 → child3 - depth 3 cycle
47
+
48
+ Each test must:
49
+ - Create a 4-level hierarchy (root, child1, child2, child3)
50
+ - Attempt to create a circular reference by attaching an ancestor as a child
51
+ - Assert that an error is thrown with message matching `/circular|cycle|ancestor/i`
52
+
53
+ ### Success Criteria
54
+
55
+ - [ ] Test file created at `src/__tests__/adversarial/complex-circular-reference.test.ts`
56
+ - [ ] All three test cases for different cycle depths are implemented
57
+ - [ ] All tests pass with `npm run test`
58
+ - [ ] Tests follow existing patterns from `circular-reference.test.ts` and `deep-hierarchy-stress.test.ts`
59
+ - [ ] Proper documentation comments explain each test scenario
60
+
61
+ ## All Needed Context
62
+
63
+ ### Context Completeness Check
64
+
65
+ _Before writing this PRP, validate: "If someone knew nothing about this codebase, would they have everything needed to implement this successfully?"_
66
+
67
+ **YES** - This PRP provides:
68
+ - Exact file paths and code patterns to follow
69
+ - Complete `isDescendantOf()` implementation for reference
70
+ - Existing test file examples with identical patterns
71
+ - Vitest configuration and test commands
72
+ - Console mocking pattern from existing tests
73
+
74
+ ### Documentation & References
75
+
76
+ ```yaml
77
+ # MUST READ - Critical implementation files
78
+
79
+ - file: /home/dustin/projects/groundswell/src/core/workflow.ts
80
+ why: Contains isDescendantOf() implementation and attachChild() circular reference check
81
+ pattern: Lines 150-168 (isDescendantOf method), lines 232-238 (circular reference check in attachChild)
82
+ gotcha: isDescendantOf() starts from this.parent, not this - prevents self-reference false positive
83
+
84
+ - file: /home/dustin/projects/groundswell/src/__tests__/adversarial/circular-reference.test.ts
85
+ why: Pattern template for circular reference tests - same AAA structure, console mocking, error assertions
86
+ pattern: Lines 20-26 (SimpleWorkflow class), 33-45 (console mocking pattern), 58-71 (immediate cycle test), 84-100 (ancestor cycle test)
87
+ gotcha: Must use `vi.restoreAllMocks()` in afterEach to prevent test pollution
88
+
89
+ - file: /home/dustin/projects/groundswell/src/__tests__/adversarial/deep-hierarchy-stress.test.ts
90
+ why: Pattern for building multi-level hierarchies and testing protected/private methods
91
+ pattern: Lines 20-26 (SimpleWorkflow class), 94-109 (building deep hierarchy with loop), 104 (casting to any for protected method access)
92
+ gotcha: getRoot() and isDescendantOf() are not public - cast to `any` for testing
93
+
94
+ - file: /home/dustin/projects/groundswell/plan/docs/bugfix-architecture/implementation_patterns.md
95
+ why: Pattern 8 defines the requirement for testing cycles at various depths
96
+ section: Pattern 8 - Adversarial Testing (see complex circular reference test example)
97
+ gotcha: Tests should cover immediate child, grandchild, and great-grandchild scenarios
98
+
99
+ - file: /home/dustin/projects/groundswell/vitest.config.ts
100
+ why: Confirms test file location pattern and vitest configuration
101
+ pattern: Line 5 - test glob pattern is `src/__tests__/**/*.test.ts`
102
+ gotcha: All test files must end in `.test.ts` to be discovered by vitest
103
+
104
+ - url: https://vitest.dev/api/expect.html#tothrow
105
+ why: Official vitest documentation for toThrow() assertion patterns
106
+ critical: Supports regex patterns like `/circular|cycle|ancestor/i` for flexible error matching
107
+ ```
108
+
109
+ ### Current Codebase tree (relevant sections)
110
+
111
+ ```bash
112
+ src/
113
+ ├── core/
114
+ │ └── workflow.ts # Workflow class with isDescendantOf() and attachChild()
115
+ └── __tests__/
116
+ └── adversarial/
117
+ ├── circular-reference.test.ts # Existing basic cycle tests (depth 1, 2)
118
+ ├── deep-hierarchy-stress.test.ts # Deep hierarchy tests (1000+ levels)
119
+ └── complex-circular-reference.test.ts # TO BE CREATED - multi-depth cycle tests
120
+ ```
121
+
122
+ ### Desired Codebase tree with files to be added
123
+
124
+ ```bash
125
+ src/
126
+ ├── core/
127
+ │ └── workflow.ts # NO CHANGE - isDescendantOf() already implemented
128
+ └── __tests__/
129
+ └── adversarial/
130
+ ├── circular-reference.test.ts # EXISTING - basic cycle tests
131
+ ├── deep-hierarchy-stress.test.ts # EXISTING - deep hierarchy tests
132
+ └── complex-circular-reference.test.ts # NEW FILE - depth 1, 2, 3 cycle tests
133
+ # Responsibility: Validate isDescendantOf() detects cycles at various ancestor depths
134
+ ```
135
+
136
+ ### Known Gotchas of our codebase & Library Quirks
137
+
138
+ ```typescript
139
+ // CRITICAL: Constructor auto-attaches child when parent is provided
140
+ // Pattern: workflow.ts:113-116
141
+ const child = new Workflow('Child', parent);
142
+ // This internally calls parent.attachChild(child) automatically
143
+
144
+ // CRITICAL: isDescendantOf() starts from this.parent, not this
145
+ // Implementation: workflow.ts:152
146
+ let current: Workflow | null = this.parent; // NOT this!
147
+ // This prevents self-reference false positive: root.isDescendantOf(root) === false
148
+
149
+ // CRITICAL: isDescendantOf() and getRoot() are private/protected
150
+ // Must cast to `any` in tests to access them:
151
+ (root as any).isDescendantOf(child);
152
+ (deepest as any).getRoot();
153
+
154
+ // CRITICAL: Always use vi.restoreAllMocks() in afterEach
155
+ // Pattern: circular-reference.test.ts:43-45
156
+ afterEach(() => {
157
+ vi.restoreAllMocks(); // Prevents test pollution
158
+ });
159
+
160
+ // CRITICAL: Error message regex must be case-insensitive
161
+ // attachChild throws: "it is an ancestor of" (lowercase 'ancestor')
162
+ // Use: /circular|cycle|ancestor/i (note the 'i' flag for case-insensitive)
163
+
164
+ // CRITICAL: Workflow constructor auto-attaches - DON'T manually call attachChild
165
+ // WRONG: const child = new Workflow('Child'); parent.attachChild(child);
166
+ // RIGHT: const child = new Workflow('Child', parent); // Auto-attaches
167
+
168
+ // CRITICAL: When building hierarchies, track the last child
169
+ // Pattern: deep-hierarchy-stress.test.ts:94-101
170
+ let current: any = root;
171
+ for (let i = 0; i < DEPTH; i++) {
172
+ current = new SimpleWorkflow(`Child-${i}`, current);
173
+ }
174
+ // After loop, `current` is the deepest child
175
+ ```
176
+
177
+ ## Implementation Blueprint
178
+
179
+ ### Data models and structure
180
+
181
+ No data models needed - tests only use existing Workflow class.
182
+
183
+ ```typescript
184
+ // Test helper class (same pattern used in all adversarial tests)
185
+ class SimpleWorkflow extends Workflow {
186
+ async run(): Promise<string> {
187
+ this.setStatus('running');
188
+ this.setStatus('completed');
189
+ return 'done';
190
+ }
191
+ }
192
+ ```
193
+
194
+ ### Implementation Tasks (ordered by dependencies)
195
+
196
+ ```yaml
197
+ Task 1: CREATE src/__tests__/adversarial/complex-circular-reference.test.ts
198
+ - IMPLEMENT: Three test cases for cycle detection at depths 1, 2, 3
199
+ - FOLLOW pattern: src/__tests__/adversarial/circular-reference.test.ts (AAA structure, console mocking)
200
+ - NAMING: describe() = "Adversarial: Complex Circular Reference Detection"
201
+ - PLACEMENT: src/__tests__/adversarial/ directory
202
+
203
+ Task 2: IMPLEMENT Test 1 - Immediate Circular Reference (depth 1)
204
+ - CREATE: 2-level hierarchy (root, child1)
205
+ - ATTEMPT: child1.attachChild(root)
206
+ - ASSERT: Error thrown with /circular|cycle|ancestor/i
207
+ - FOLLOW pattern: circular-reference.test.ts:58-71
208
+ - DOCUMENT: "immediate cycle" in test description
209
+
210
+ Task 3: IMPLEMENT Test 2 - Two-Level Circular Reference (depth 2)
211
+ - CREATE: 3-level hierarchy (root, child1, child2)
212
+ - ATTEMPT: child2.attachChild(root)
213
+ - ASSERT: Error thrown with /circular|cycle|ancestor/i
214
+ - FOLLOW pattern: circular-reference.test.ts:84-100 (ancestor test)
215
+ - DOCUMENT: "2-level cycle" in test description
216
+
217
+ Task 4: IMPLEMENT Test 3 - Three-Level Circular Reference (depth 3)
218
+ - CREATE: 4-level hierarchy (root, child1, child2, child3)
219
+ - ATTEMPT: child3.attachChild(root)
220
+ - ASSERT: Error thrown with /circular|cycle|ancestor/i
221
+ - FOLLOW pattern: deep-hierarchy-stress.test.ts:94-109 (hierarchy building)
222
+ - DOCUMENT: "3-level cycle" in test description - NEW coverage not in existing tests
223
+
224
+ Task 5: VERIFY all tests pass
225
+ - RUN: npm run test -- complex-circular-reference
226
+ - EXPECT: All 3 tests pass
227
+ - VALIDATE: Error messages are informative
228
+ ```
229
+
230
+ ### Implementation Patterns & Key Details
231
+
232
+ ```typescript
233
+ // ============================================
234
+ // PATTERN 1: File Header Documentation
235
+ // ============================================
236
+ /**
237
+ * Complex Circular Reference Tests
238
+ *
239
+ * These tests validate that isDescendantOf() correctly detects circular
240
+ * references at various depths in the workflow tree.
241
+ *
242
+ * Test Cases:
243
+ * 1. Immediate circular reference (depth 1): child.attachChild(parent)
244
+ * 2. Two-level circular reference (depth 2): grandchild.attachChild(root)
245
+ * 3. Three-level circular reference (depth 3): great-grandchild.attachChild(root)
246
+ *
247
+ * Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md Pattern 8
248
+ * Related: plan/bugfix/P1M3T1S3/PRP.md
249
+ */
250
+
251
+ // ============================================
252
+ // PATTERN 2: Test Helper Class
253
+ // ============================================
254
+ class SimpleWorkflow extends Workflow {
255
+ async run(): Promise<string> {
256
+ this.setStatus('running');
257
+ this.setStatus('completed');
258
+ return 'done';
259
+ }
260
+ }
261
+ // FOLLOW: circular-reference.test.ts:20-26
262
+
263
+ // ============================================
264
+ // PATTERN 3: Console Mocking Setup
265
+ // ============================================
266
+ describe('Adversarial: Complex Circular Reference Detection', () => {
267
+ beforeEach(() => {
268
+ vi.spyOn(console, 'log').mockImplementation(() => {});
269
+ vi.spyOn(console, 'error').mockImplementation(() => {});
270
+ vi.spyOn(console, 'warn').mockImplementation(() => {});
271
+ });
272
+
273
+ afterEach(() => {
274
+ vi.restoreAllMocks(); // CRITICAL: Always restore mocks
275
+ });
276
+ // FOLLOW: circular-reference.test.ts:33-45
277
+ });
278
+
279
+ // ============================================
280
+ // PATTERN 4: Test Case Structure (AAA)
281
+ // ============================================
282
+ it('should throw when attaching immediate parent as child (depth 1)', () => {
283
+ // ========== ARRANGE ==========
284
+ const parent = new SimpleWorkflow('Parent');
285
+ const child = new SimpleWorkflow('Child', parent);
286
+
287
+ // Verify initial state
288
+ expect(child.parent).toBe(parent);
289
+ expect(parent.children).toContain(child);
290
+
291
+ // ========== ACT & ASSERT ==========
292
+ expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/i);
293
+ });
294
+
295
+ // ============================================
296
+ // PATTERN 5: Multi-Level Hierarchy Building
297
+ // ============================================
298
+ // For depth 3 test (4 levels: root, child1, child2, child3)
299
+ const root = new SimpleWorkflow('Root');
300
+ const child1 = new SimpleWorkflow('Child1', root); // root -> child1
301
+ const child2 = new SimpleWorkflow('Child2', child1); // root -> child1 -> child2
302
+ const child3 = new SimpleWorkflow('Child3', child2); // root -> child1 -> child2 -> child3
303
+
304
+ // Verify hierarchy
305
+ expect(child3.parent).toBe(child2);
306
+ expect(child2.parent).toBe(child1);
307
+ expect(child1.parent).toBe(root);
308
+
309
+ // Attempt cycle: child3.attachChild(root)
310
+ expect(() => child3.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
311
+
312
+ // FOLLOW: deep-hierarchy-stress.test.ts:94-109
313
+
314
+ // ============================================
315
+ // PATTERN 6: Error Message Validation
316
+ // ============================================
317
+ // The attachChild() method throws specific error messages:
318
+ // workflow.ts:234-235: "it is an ancestor of '...'. This would create a circular reference."
319
+ //
320
+ // Use regex pattern matching for flexibility:
321
+ expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/i);
322
+ // The 'i' flag makes it case-insensitive
323
+
324
+ // GOTCHA: Error message uses "ancestor" (lowercase), not "Ancestor"
325
+ // Gotcha source: workflow.ts:234
326
+
327
+ // ============================================
328
+ // PATTERN 7: Constructor Auto-Attachment
329
+ // ============================================
330
+ // CRITICAL: When parent is passed to constructor, attachChild() is called automatically
331
+ // Implementation: workflow.ts:114-116
332
+ if (this.parent) {
333
+ this.parent.attachChild(this);
334
+ }
335
+
336
+ // CORRECT USAGE:
337
+ const child = new SimpleWorkflow('Child', parent); // Auto-attaches
338
+
339
+ // WRONG USAGE (don't do this):
340
+ const child = new SimpleWorkflow('Child');
341
+ parent.attachChild(child); // Redundant, constructor already did it
342
+ ```
343
+
344
+ ### Integration Points
345
+
346
+ ```yaml
347
+ TEST_FRAMEWORK:
348
+ - runner: vitest (configured in vitest.config.ts)
349
+ - glob: src/__tests__/**/*.test.ts
350
+ - command: npm run test -- [filename]
351
+
352
+ IMPORTS:
353
+ - from: 'vitest'
354
+ imports: describe, it, expect, beforeEach, afterEach, vi
355
+ - from: '../../index.js'
356
+ import: Workflow class
357
+
358
+ NO_CHANGES_NEEDED:
359
+ - workflow.ts: isDescendantOf() already implemented at lines 150-168
360
+ - workflow.ts: attachChild() circular reference check already at lines 232-238
361
+ ```
362
+
363
+ ## Validation Loop
364
+
365
+ ### Level 1: Syntax & Style (Immediate Feedback)
366
+
367
+ ```bash
368
+ # Run after file creation - fix before proceeding
369
+ npm run test -- complex-circular-reference # Run just the new test file
370
+
371
+ # Expected: Tests should PASS (isDescendantOf is already implemented)
372
+ # If tests FAIL, read output and fix test implementation
373
+
374
+ # Full test suite validation (ensure no regressions)
375
+ npm run test
376
+
377
+ # Expected: All tests pass
378
+ ```
379
+
380
+ ### Level 2: Unit Tests (Component Validation)
381
+
382
+ ```bash
383
+ # Run specific test file
384
+ npm run test -- complex-circular-reference
385
+
386
+ # Expected output:
387
+ # ✓ src/__tests__/adversarial/complex-circular-reference.test.ts (3)
388
+ # ✓ Adversarial: Complex Circular Reference Detection (3)
389
+ # ✓ should throw when attaching immediate parent as child (depth 1)
390
+ # ✓ should throw when attaching grandparent as child (depth 2)
391
+ # ✓ should throw when attaching great-grandparent as child (depth 3)
392
+
393
+ # Full adversarial test suite
394
+ npm run test -- adversarial
395
+
396
+ # Expected: All adversarial tests pass
397
+ ```
398
+
399
+ ### Level 3: Integration Testing (System Validation)
400
+
401
+ ```bash
402
+ # Verify test file is discovered by vitest glob pattern
403
+ npm run test -- --reporter=verbose 2>&1 | grep complex-circular-reference
404
+
405
+ # Expected: Test file is found and executed
406
+
407
+ # Verify no regressions in existing circular reference tests
408
+ npm run test -- circular-reference
409
+
410
+ # Expected: Existing tests still pass
411
+ ```
412
+
413
+ ### Level 4: Creative & Domain-Specific Validation
414
+
415
+ ```bash
416
+ # Vitest coverage (if coverage is configured)
417
+ npm run test -- --coverage
418
+
419
+ # Expected: New lines covered in isDescendantOf() method
420
+
421
+ # Performance test - ensure tests run quickly
422
+ time npm run test -- complex-circular-reference
423
+
424
+ # Expected: Tests complete in < 1 second (simple operations)
425
+
426
+ # Validate error messages are informative
427
+ npm run test -- complex-circular-reference 2>&1 | grep -i "ancestor\|circular"
428
+
429
+ # Expected: Error messages contain clear descriptions
430
+ ```
431
+
432
+ ## Final Validation Checklist
433
+
434
+ ### Technical Validation
435
+
436
+ - [ ] Test file created at `src/__tests__/adversarial/complex-circular-reference.test.ts`
437
+ - [ ] All three test cases pass: `npm run test -- complex-circular-reference`
438
+ - [ ] No regressions: `npm run test` passes completely
439
+ - [ ] Console properly mocked (check for no console output in test results)
440
+ - [ ] Error assertions use correct regex pattern: `/circular|cycle|ancestor/i`
441
+
442
+ ### Feature Validation
443
+
444
+ - [ ] Test 1 validates depth 1 cycle (immediate parent)
445
+ - [ ] Test 2 validates depth 2 cycle (grandparent)
446
+ - [ ] Test 3 validates depth 3 cycle (great-grandparent)
447
+ - [ ] All tests properly verify initial hierarchy state before attempting cycle
448
+ - [ ] Tests follow AAA pattern (Arrange, Act, Assert)
449
+
450
+ ### Code Quality Validation
451
+
452
+ - [ ] File header documentation includes Pattern 8 reference
453
+ - [ ] Test descriptions clearly indicate cycle depth
454
+ - [ ] Inline comments explain the cycle being tested
455
+ - [ ] Console mocking follows existing pattern with vi.restoreAllMocks()
456
+ - [ ] SimpleWorkflow class included (no external dependencies)
457
+
458
+ ### Documentation & Deployment
459
+
460
+ - [ ] PRP path saved at plan/bugfix/P1M3T1S3/PRP.md
461
+ - [ ] Test file follows naming convention: `*-circular-reference.test.ts`
462
+ - [ ] Test file located in correct directory: `src/__tests__/adversarial/`
463
+ - [ ] Related test files referenced in documentation
464
+
465
+ ---
466
+
467
+ ## Anti-Patterns to Avoid
468
+
469
+ - **Don't** manually call `attachChild()` when constructor already does it - just pass parent to constructor
470
+ - **Don't** forget `vi.restoreAllMocks()` in afterEach - causes test pollution
471
+ - **Don't** use exact string match for error assertions - use regex `/circular|cycle|ancestor/i`
472
+ - **Don't** forget to verify initial state before testing the cycle
473
+ - **Don't** create tests that are too similar to existing `circular-reference.test.ts` - this file adds depth 3 coverage
474
+ - **Don't** skip the `i` flag on regex - error messages use specific casing
475
+ - **Don't** use recursion to build hierarchies in tests - use iteration (avoids test-side stack overflow)
476
+ - **Don't** test `isDescendantOf()` directly without casting to `any` - it's private
477
+
478
+ ## Test Specification Summary
479
+
480
+ | Test Name | Hierarchy Depth | Cycle Attempt | Expected Error |
481
+ |-----------|----------------|---------------|----------------|
482
+ | Immediate Circular Reference (depth 1) | 2 (root, child1) | child1.attachChild(root) | /circular\|cycle\|ancestor/i |
483
+ | Two-Level Circular Reference (depth 2) | 3 (root, child1, child2) | child2.attachChild(root) | /circular\|cycle\|ancestor/i |
484
+ | Three-Level Circular Reference (depth 3) | 4 (root, child1, child2, child3) | child3.attachChild(root) | /circular\|cycle\|ancestor/i |
485
+
486
+ ## Success Metrics
487
+
488
+ **Confidence Score**: 10/10 for one-pass implementation success
489
+
490
+ **Validation**: The PRP provides complete context including:
491
+ - Exact file paths and line numbers for all references
492
+ - Complete code examples for all patterns
493
+ - Existing test files with identical patterns to follow
494
+ - isDescendantOf() implementation for reference
495
+ - Vitest configuration and test commands
496
+ - Console mocking pattern with gotchas documented
497
+ - Constructor auto-attachment behavior explained
498
+
499
+ An AI agent unfamiliar with this codebase can implement this successfully using only the PRP content and codebase access.