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,792 @@
1
+ # Product Requirement Prompt (PRP): Implement Public `isDescendantOf` API
2
+
3
+ **Work Item**: P1.M3.T4.S2 - Implement public `isDescendantOf` if approved
4
+ **PRD Reference**: Issue 9 - Steps Not in Tree Structure (Bug Report Note)
5
+ **Implementation Target**: `src/core/workflow.ts:162`
6
+ **S1 Decision**: **APPROVED** - Make public with confidence 9/10
7
+
8
+ ---
9
+
10
+ ## Goal
11
+
12
+ **Feature Goal**: Change the `isDescendantOf()` method visibility from `private` to `public`, add comprehensive JSDoc documentation with security warning, and ensure the method has appropriate parameter validation.
13
+
14
+ **Deliverable**:
15
+ 1. `isDescendantOf()` method changed from `private` to `public` in `src/core/workflow.ts:162`
16
+ 2. Comprehensive JSDoc documentation with `@warning` tag for security implications
17
+ 3. Optional: Parameter validation for the `ancestor` parameter
18
+ 4. Update to security documentation guide
19
+ 5. Tests pass (no changes to test logic needed)
20
+
21
+ **Success Definition**:
22
+ - Method is publicly accessible without casting to `any`
23
+ - JSDoc includes `@warning` about topology information disclosure
24
+ - All existing tests pass without modification
25
+ - New tests (if added) verify public accessibility and parameter validation
26
+
27
+ ## User Persona
28
+
29
+ **Target User**: Developer using the Groundswell workflow engine who needs to check workflow hierarchy relationships programmatically.
30
+
31
+ **Use Case**: A developer building a workflow-based application needs to validate that a workflow belongs to a specific tree branch before executing an operation.
32
+
33
+ **User Journey**:
34
+ 1. User has references to two workflow instances
35
+ 2. User calls `childWorkflow.isDescendantOf(rootWorkflow)`
36
+ 3. Method returns `true` if child is in root's hierarchy, `false` otherwise
37
+ 4. User proceeds with conditional logic based on result
38
+
39
+ **Pain Points Addressed**:
40
+ - Users currently must manually traverse `parent` chain (error-prone, forget cycle detection)
41
+ - Current workaround requires casting to `any` to access private method
42
+ - Inconsistent with other public hierarchy properties (`parent`, `children`)
43
+
44
+ ## Why
45
+
46
+ - **API Ergonomics**: `isDescendantOf()` provides cleaner interface than manual tree traversal
47
+ - **User Needs**: Introspection tools and examples show users want hierarchy navigation
48
+ - **No Security Risk**: Does NOT expose new information beyond existing `parent`/`children` properties
49
+ - **Low Implementation Cost**: Change one keyword, add documentation; already battle-tested (25+ tests)
50
+ - **Competitive Differentiator**: No major workflow engine exposes this API publicly
51
+ - **S1 Approval**: Comprehensive research and recommendation supports this change
52
+
53
+ ## What
54
+
55
+ ### Success Criteria
56
+
57
+ - [ ] `isDescendantOf()` method changed from `private` to `public` at `src/core/workflow.ts:162`
58
+ - [ ] Comprehensive JSDoc documentation added with security `@warning`
59
+ - [ ] All existing tests pass (25+ tests already cover this method indirectly)
60
+ - [ ] No breaking changes to existing functionality
61
+ - [ ] Security documentation updated with `isDescendantOf()` section
62
+
63
+ ---
64
+
65
+ ## All Needed Context
66
+
67
+ ### Context Completeness Check
68
+
69
+ _This PRP passes the "No Prior Knowledge" test - someone unfamiliar with the codebase would have everything needed to implement this successfully._
70
+
71
+ ### Documentation & References
72
+
73
+ ```yaml
74
+ # MUST READ - S1 Research Decision (APPROVED)
75
+ - file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md
76
+ why: Final recommendation to make isDescendantOf public with confidence 9/10
77
+ section: Lines 1-50 (Executive Summary and Decision Matrix)
78
+ critical: Decision is APPROVED with safeguards (JSDoc warning, security docs)
79
+ gotcha: This is a BREAKING API change per Semantic Versioning (requires major version bump)
80
+
81
+ # MUST READ - Current Implementation
82
+ - file: src/core/workflow.ts
83
+ why: The isDescendantOf() implementation at lines 162-180, currently private
84
+ pattern: Private method using iterative traversal with visited Set for cycle detection
85
+ gotcha: No parameter validation currently - relies on TypeScript type system
86
+
87
+ # MUST READ - JSDoc Documentation Patterns
88
+ - file: src/core/workflow.ts
89
+ why: Examples of comprehensive JSDoc patterns for public methods
90
+ pattern: attachChild (lines 224-276), detachChild (lines 318-369)
91
+ gotcha: Codebase uses @throws, @example, detailed descriptions with sections
92
+ critical: No existing @warning tags - this will be first security-warning JSDoc
93
+
94
+ # MUST READ - Security Implications Analysis
95
+ - file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md
96
+ why: Security assessment showing NO new information exposed
97
+ section: Lines 58-68 (Comparison with Existing Public APIs)
98
+ critical: parent and children already public - isDescendantOf is convenience only
99
+ gotcha: Applications must implement their own access control if exposing workflows via API
100
+
101
+ # MUST READ - Security Guide (to update)
102
+ - file: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
103
+ why: Security patterns for introspection and hierarchy exposure
104
+ section: Lines 1-100 (Threat Model and Introspection Attack Vectors)
105
+ critical: Add isDescendantOf() section documenting hierarchy information disclosure
106
+ gotcha: Groundswell has NO built-in authentication/authorization - security is app's responsibility
107
+
108
+ # MUST READ - Parameter Validation Patterns
109
+ - file: src/core/workflow.ts
110
+ why: Patterns for validating parameters in public methods
111
+ pattern: attachChild (lines 277-299) - Array.includes(), reference equality checks
112
+ gotcha: Most validation is implicit via TypeScript types; explicit checks for edge cases
113
+ critical: No instanceof checks - codebase trusts TypeScript types
114
+
115
+ # MUST READ - Testing Patterns
116
+ - file: src/__tests__/adversarial/circular-reference.test.ts
117
+ why: Tests for isDescendantOf behavior (currently cast to 'any' for access)
118
+ pattern: Uses (workflow as any).isDescendantOf() to test private method
119
+ gotcha: After making public, tests can call method directly without casting
120
+ critical: 25+ test cases already cover this method via attachChild circular reference detection
121
+
122
+ # MUST READ - Industry Comparison
123
+ - file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md
124
+ why: Groundswell would be UNIQUE in exposing public isDescendantOf API
125
+ section: Lines 450-470 (API Exposure Matrix)
126
+ critical: NO major workflow engine (Airflow, Temporal, Prefect) exposes this publicly
127
+ gotcha: Not an anti-pattern, just different from industry
128
+
129
+ # MUST READ - External JSDoc Best Practices
130
+ - url: https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html
131
+ why: TypeScript's official JSDoc reference
132
+ section: @throws, @example, @warning tags
133
+
134
+ # MUST READ - Semantic Versioning Implications
135
+ - url: https://semver.org/
136
+ why: Making private method public is a MAJOR breaking change
137
+ critical: Requires version bump from X.Y.Z to (X+1).0.0
138
+ gotcha: Even though implementation doesn't change, API surface area increases
139
+
140
+ # REFERENCE - Current Usage Site
141
+ - file: src/core/workflow.ts
142
+ why: Single call site at line 293 in attachChild() method
143
+ pattern: if (this.isDescendantOf(child)) - circular reference detection
144
+ gotcha: This internal usage continues unchanged after visibility change
145
+ ```
146
+
147
+ ### Current Codebase Tree (relevant to isDescendantOf)
148
+
149
+ ```bash
150
+ src/
151
+ ├── core/
152
+ │ └── workflow.ts # isDescendantOf at line 162 (private → public)
153
+ │ # attachChild usage at line 293
154
+ │ # public parent/children properties at 49-52
155
+ ├── types/
156
+ │ └── workflow.ts # WorkflowNode interface with parent/children
157
+ ├── tools/
158
+ │ └── introspection.ts # Public introspection tools (read_ancestor_chain, etc.)
159
+ └── __tests__/
160
+ ├── adversarial/
161
+ │ ├── circular-reference.test.ts # Tests for isDescendantOf behavior
162
+ │ ├── complex-circular-reference.test.ts
163
+ │ ├── deep-hierarchy-stress.test.ts
164
+ │ └── attachChild-performance.test.ts
165
+ └── unit/
166
+ └── workflow-detachChild.test.ts # Example of public method test patterns
167
+ ```
168
+
169
+ ### Desired Codebase Tree with files to be added and responsibility of file
170
+
171
+ ```bash
172
+ # NO new files needed - only modifications to existing files
173
+
174
+ # CHANGES:
175
+ src/core/workflow.ts # CHANGE: private → public, add JSDoc
176
+ plan/.../introspection-security-guide.md # CHANGE: Add isDescendantOf section
177
+ ```
178
+
179
+ ### Known Gotchas of Our Codebase
180
+
181
+ ```typescript
182
+ // CRITICAL: isDescendantOf is private - changing to public is a BREAKING API change
183
+ // Per Semantic Versioning, this requires a MAJOR version bump (X.0.0 → (X+1).0.0)
184
+
185
+ // CRITICAL: Groundswell has NO built-in authentication or authorization
186
+ // Security is entirely the application's responsibility
187
+
188
+ // CRITICAL: parent and children properties are already PUBLIC
189
+ // isDescendantOf does NOT expose any new information
190
+
191
+ // CRITICAL: No instanceof checks for parameter validation in codebase
192
+ // Codebase relies on TypeScript type system for type safety
193
+
194
+ // CRITICAL: isDescendantOf uses iterative while loop (not recursive)
195
+ // This is intentional for stack safety at extreme depths (1000+ levels)
196
+
197
+ // CRITICAL: Cycle detection uses visited Set pattern
198
+ // Same pattern as getRoot() and getRootObservers()
199
+
200
+ // CRITICAL: @warning JSDoc tag does NOT exist in codebase yet
201
+ // This will be the first usage of @warning for security documentation
202
+
203
+ // CRITICAL: Tests currently use (workflow as any).isDescendantOf()
204
+ // After making public, can call directly - but existing tests still work
205
+
206
+ // CRITICAL: Method returns boolean, NOT throws for non-descendant
207
+ // Only throws Error if circular reference detected during traversal
208
+
209
+ // CRITICAL: JSDoc pattern uses markdown with bold headers
210
+ // See attachChild() for example: **Structural Changes:**, **Invariants Maintained:**
211
+ ```
212
+
213
+ ---
214
+
215
+ ## Implementation Blueprint
216
+
217
+ ### Data Models and Structure
218
+
219
+ No new data models needed. The `Workflow` class already exists with all necessary structure.
220
+
221
+ ### Implementation Tasks (ordered by dependencies)
222
+
223
+ ```yaml
224
+ Task 1: MODIFY src/core/workflow.ts - Change Visibility
225
+ - CHANGE: Line 162 from `private isDescendantOf` to `public isDescendantOf`
226
+ - LOCATION: src/core/workflow.ts:162
227
+ - PRESERVE: All existing implementation logic (lines 163-180)
228
+ - NAMING: Keep method name exactly as is (no rename)
229
+
230
+ Task 2: ADD JSDoc Documentation
231
+ - ADD: Comprehensive JSDoc comment BEFORE line 162
232
+ - FOLLOW: Pattern from attachChild() method (lines 224-276)
233
+ - INCLUDE:
234
+ - One-line summary
235
+ - Detailed description paragraph
236
+ - @warning tag about topology information disclosure
237
+ - @param tag for ancestor parameter
238
+ - @returns tag describing boolean return
239
+ - @throws {Error} tag for cycle detection
240
+ - @example tags showing usage patterns
241
+ - PLACEMENT: Lines 152-161 (replace existing private JSDoc)
242
+
243
+ Task 3: CONSIDER Adding Parameter Validation (OPTIONAL)
244
+ - DECISION POINT: Add instanceof check or rely on TypeScript types?
245
+ - IF ADDING: Insert at line 163 (first line of method body)
246
+ - PATTERN: Follow attachChild() validation style
247
+ - EXAMPLE:
248
+ ```typescript
249
+ if (!(ancestor instanceof Workflow)) {
250
+ throw new TypeError(`Expected Workflow instance, got ${typeof ancestor}`);
251
+ }
252
+ ```
253
+ - NOTE: Codebase typically relies on TypeScript types - this is optional
254
+
255
+ Task 4: MODIFY Security Documentation
256
+ - ADD: New section to plan/.../introspection-security-guide.md
257
+ - LOCATION: After "Threat Model" section, before "Implementation Checklist"
258
+ - TITLE: "### Threat 5: Topology Exposure via isDescendantOf()"
259
+ - INCLUDE: What information is exposed, why risk is LOW, mitigation recommendations
260
+ - PATTERN: Follow existing threat section structure (Threat 1-4)
261
+
262
+ Task 5: VERIFY Tests Pass
263
+ - RUN: Full test suite to ensure no regressions
264
+ - VERIFY: All 25+ existing tests still pass
265
+ - CHECK: circular-reference.test.ts, complex-circular-reference.test.ts, deep-hierarchy-stress.test.ts
266
+ - EXPECTED: All tests pass without modification (private → public is backward compatible)
267
+
268
+ Task 6: CONSIDER Adding Public API Tests (OPTIONAL)
269
+ - CREATE: src/__tests__/unit/workflow-isDescendantOf.test.ts (if desired)
270
+ - IMPLEMENT: Tests that call isDescendantOf() directly without (as any) cast
271
+ - FOLLOW: Pattern from workflow-detachChild.test.ts
272
+ - COVERAGE: Happy path, edge cases (self, null, unrelated workflows)
273
+ - NOTE: Existing tests already cover behavior - new tests would verify public accessibility only
274
+ ```
275
+
276
+ ### Implementation Patterns & Key Details
277
+
278
+ ```typescript
279
+ // CRITICAL: JSDoc Pattern for Security-Sensitive Public API
280
+ /**
281
+ * Check if this workflow is a descendant of the given ancestor workflow.
282
+ *
283
+ * Traverses the parent chain upward looking for the ancestor reference.
284
+ * Uses a visited Set to detect cycles during traversal. This method provides
285
+ * a convenient way to check workflow hierarchy relationships without manually
286
+ * traversing the parent chain.
287
+ *
288
+ * @warning This method reveals workflow hierarchy information. If your
289
+ * application exposes workflows via an API, ensure you implement proper
290
+ * access control to prevent unauthorized topology discovery. Note that
291
+ * the `parent` and `children` properties are already public, so this
292
+ * method does not expose any new information beyond what is currently
293
+ * accessible.
294
+ *
295
+ * **Time Complexity**: O(d) where d is the depth of the hierarchy
296
+ * **Space Complexity**: O(d) for the visited Set in worst case (cycle detection)
297
+ *
298
+ * @example Check if a workflow belongs to a specific hierarchy
299
+ * ```typescript
300
+ * const root = new Workflow('root');
301
+ * const child = new Workflow('child', { parent: root });
302
+ *
303
+ * if (child.isDescendantOf(root)) {
304
+ * console.log('Child is in root hierarchy');
305
+ * }
306
+ * ```
307
+ *
308
+ * @example Validate before attaching to prevent circular references
309
+ * ```typescript
310
+ * if (!newChild.isDescendantOf(parent)) {
311
+ * parent.attachChild(newChild);
312
+ * } else {
313
+ * throw new Error('Would create circular reference');
314
+ * }
315
+ * ```
316
+ *
317
+ * @example Check for ancestor relationship in conditional logic
318
+ * ```typescript
319
+ * const isInProductionBranch = workflow.isDescendantOf(productionRoot);
320
+ * if (isInProductionBranch) {
321
+ * // Apply production-specific logic
322
+ * }
323
+ * ```
324
+ *
325
+ * @param ancestor - The potential ancestor workflow to check
326
+ * @returns true if ancestor is found in parent chain, false otherwise
327
+ * @throws {Error} If a cycle is detected during traversal (indicates corrupted tree structure)
328
+ */
329
+ public isDescendantOf(ancestor: Workflow): boolean {
330
+ // Implementation unchanged (lines 163-180)
331
+ }
332
+
333
+ // CRITICAL: Security Documentation Pattern
334
+ // Add to introspection-security-guide.md after Threat 4:
335
+
336
+ /**
337
+ ### Threat 5: Topology Exposure via isDescendantOf
338
+
339
+ **Attack Scenario:**
340
+ ```
341
+ Attacker → Calls workflow.isDescendantOf(suspectWorkflow)
342
+ → Learns hierarchy relationship between workflows
343
+ → Maps workflow tree structure
344
+ → Extracts business intelligence from topology
345
+ ```
346
+
347
+ **Risk Level:** LOW (same as current exposure)
348
+
349
+ **Rationale:**
350
+ - `parent` and `children` properties are already public
351
+ - `getNode()` exposes full tree structure
352
+ - `isDescendantOf()` only provides convenience, not new information
353
+ - Attacker can already traverse tree manually
354
+
355
+ **Affected Method:** `Workflow.isDescendantOf()` (newly public)
356
+
357
+ **Mitigation:**
358
+ 1. **Application-Level Access Control** - If exposing workflows via API:
359
+ ```typescript
360
+ // Validate user has permission to access workflow
361
+ if (!user.canAccessWorkflow(workflowId)) {
362
+ throw new Error('Unauthorized');
363
+ }
364
+ // Only then allow isDescendantOf calls
365
+ ```
366
+
367
+ 2. **Filter Hierarchy Information** - For unauthenticated users:
368
+ ```typescript
369
+ // Return filtered view without hierarchy
370
+ const filteredWorkflow = {
371
+ id: workflow.id,
372
+ name: workflow.name,
373
+ // Omit parent, children, isDescendantOf
374
+ };
375
+ ```
376
+
377
+ 3. **Audit Topology Access** - Log calls to isDescendantOf:
378
+ ```typescript
379
+ auditLog.log({
380
+ timestamp: Date.now(),
381
+ userId: user.id,
382
+ action: 'isDescendantOf',
383
+ workflowId: workflow.id,
384
+ ancestorId: ancestor.id
385
+ });
386
+ ```
387
+
388
+ **Recommendation:** Document that applications should implement access control
389
+ if exposing workflows via APIs. The library itself provides no built-in security.
390
+ */
391
+ ```
392
+
393
+ ### Integration Points
394
+
395
+ ```yaml
396
+ CODE CHANGES:
397
+ - file: src/core/workflow.ts
398
+ line: 152-161 (JSDoc section)
399
+ change: Replace existing private JSDoc with comprehensive public JSDoc
400
+ - file: src/core/workflow.ts
401
+ line: 162
402
+ change: `private isDescendantOf` → `public isDescendantOf`
403
+
404
+ DOCUMENTATION CHANGES:
405
+ - file: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
406
+ add: New Threat 5 section for isDescendantOf topology exposure
407
+ location: After Threat 4 (Denial of Service), before Implementation Checklist
408
+
409
+ NO BREAKING CHANGES:
410
+ - All existing code using isDescendantOf internally continues unchanged
411
+ - attachChild() usage at line 293 unaffected
412
+ - All existing tests pass without modification
413
+ ```
414
+
415
+ ---
416
+
417
+ ## Validation Loop
418
+
419
+ ### Level 1: Syntax & Style (Immediate Feedback)
420
+
421
+ ```bash
422
+ # Run after making changes to workflow.ts
423
+ # From project root
424
+
425
+ # Check TypeScript compilation
426
+ npm run build
427
+ # Expected: No compilation errors
428
+
429
+ # Type checking
430
+ npx tsc --noEmit
431
+ # Expected: No type errors
432
+
433
+ # If using ESLint/prettier (check package.json for scripts)
434
+ npm run lint
435
+ # Expected: No linting errors
436
+
437
+ # Expected: Zero errors. If errors exist, READ output and fix before proceeding.
438
+ ```
439
+
440
+ ### Level 2: Unit Tests (Component Validation)
441
+
442
+ ```bash
443
+ # Test specific functionality
444
+ npm test -- circular-reference
445
+ npm test -- complex-circular-reference
446
+ npm test -- deep-hierarchy-stress
447
+ npm test -- attachChild-performance
448
+
449
+ # Full test suite
450
+ npm test
451
+
452
+ # Expected: All tests pass. isDescendantOf is already tested indirectly via attachChild tests.
453
+ # No test modifications should be needed.
454
+ ```
455
+
456
+ ### Level 3: Integration Testing (System Validation)
457
+
458
+ ```bash
459
+ # Verify public accessibility without casting
460
+ # Create a simple test file:
461
+ cat > test-public-api.test.ts << 'EOF'
462
+ import { describe, it, expect } from 'vitest';
463
+ import { Workflow } from '../src/core/workflow.js';
464
+
465
+ describe('Workflow.isDescendantOf() - Public API', () => {
466
+ it('should be publicly accessible without casting', () => {
467
+ const root = new Workflow('root');
468
+ const child = new Workflow('child', { parent: root });
469
+
470
+ // This should work without (as any) cast
471
+ const result = child.isDescendantOf(root);
472
+
473
+ expect(result).toBe(true);
474
+ });
475
+
476
+ it('should return false for unrelated workflows', () => {
477
+ const tree1 = new Workflow('tree1');
478
+ const tree2 = new Workflow('tree2');
479
+
480
+ const result = tree1.isDescendantOf(tree2);
481
+
482
+ expect(result).toBe(false);
483
+ });
484
+
485
+ it('should return false when checking root against descendant', () => {
486
+ const root = new Workflow('root');
487
+ const child = new Workflow('child', { parent: root });
488
+
489
+ const result = root.isDescendantOf(child);
490
+
491
+ expect(result).toBe(false);
492
+ });
493
+ });
494
+ EOF
495
+
496
+ # Run the test
497
+ npm test test-public-api.test.ts
498
+
499
+ # Expected: All new tests pass, proving public API accessibility
500
+ ```
501
+
502
+ ### Level 4: Creative & Domain-Specific Validation
503
+
504
+ ```bash
505
+ # Manual validation of JSDoc visibility
506
+
507
+ # 1. Generate TypeScript declaration files
508
+ npx tsc --declaration --emitDeclarationOnly
509
+
510
+ # 2. Check the generated .d.ts file
511
+ cat src/core/workflow.d.ts | grep -A 10 "isDescendantOf"
512
+
513
+ # Expected output should show:
514
+ # isDescendantOf(ancestor: Workflow): boolean;
515
+ # (without private keyword)
516
+
517
+ # 3. Verify IDE documentation
518
+ # Open src/core/workflow.ts in VS Code
519
+ # Hover over a workflow instance and verify isDescendantOf appears in autocomplete
520
+ # Call the method and verify JSDoc tooltip shows documentation
521
+
522
+ # 4. Security documentation validation
523
+ cat plan/.../introspection-security-guide.md | grep -A 20 "Threat 5"
524
+
525
+ # Expected: New Threat 5 section present with isDescendantOf documentation
526
+
527
+ # 5. Verify no information disclosure beyond existing APIs
528
+ # (This is conceptual - no automated test)
529
+ # Review that isDescendantOf only returns boolean (true/false)
530
+ # Compare with existing public APIs:
531
+ # - workflow.parent: Returns full Workflow reference
532
+ # - workflow.children: Returns array of Workflow references
533
+ # - workflow.getNode(): Returns WorkflowNode with full tree, logs, events, state
534
+ #
535
+ # Conclusion: isDescendantOf exposes LESS information than existing APIs
536
+ ```
537
+
538
+ ---
539
+
540
+ ## Final Validation Checklist
541
+
542
+ ### Technical Validation
543
+
544
+ - [ ] `isDescendantOf()` changed from `private` to `public` at line 162
545
+ - [ ] JSDoc documentation added with `@warning` tag
546
+ - [ ] JSDoc includes `@param`, `@returns`, `@throws`, `@example` tags
547
+ - [ ] TypeScript compilation succeeds: `npm run build`
548
+ - [ ] All tests pass: `npm test`
549
+ - [ ] No breaking changes to existing functionality
550
+ - [ ] Security documentation updated with isDescendantOf section
551
+
552
+ ### Feature Validation
553
+
554
+ - [ ] Method is publicly callable without `(as any)` cast
555
+ - [ ] JSDoc `@warning` explains topology information disclosure
556
+ - [ ] JSDoc references that `parent`/`children` are already public
557
+ - [ ] Examples show practical usage patterns
558
+ - [ ] Error handling documented (`@throws` for cycle detection)
559
+ - [ ] Time/space complexity documented (O(d))
560
+
561
+ ### Code Quality Validation
562
+
563
+ - [ ] Follows existing JSDoc patterns from `attachChild()` method
564
+ - [ ] Uses markdown formatting consistent with codebase
565
+ - [ ] Implementation logic unchanged (minizes risk)
566
+ - [ ] No new dependencies added
567
+ - [ ] No performance impact (method already tested and optimized)
568
+
569
+ ### Documentation & Deployment
570
+
571
+ - [ ] Security guide updated (`introspection-security-guide.md`)
572
+ - [ ] Threat 5 section added with mitigation patterns
573
+ - [ ] References to existing public APIs (`parent`, `children`)
574
+ - [ ] Application-level security responsibility documented
575
+ - [ ] Semantic versioning impact noted (MAJOR version bump required)
576
+
577
+ ---
578
+
579
+ ## Anti-Patterns to Avoid
580
+
581
+ - **Don't** change the implementation logic - only visibility and documentation
582
+ - **Don't** add unnecessary parameter validation if codebase doesn't use it elsewhere
583
+ - **Don't** forget to document that `parent`/`children` are already public
584
+ - **Don't** use recursive implementation (current iterative is stack-safe)
585
+ - **Don't** skip the `@warning` tag - this is security-sensitive API
586
+ - **Don't** modify existing tests - they should pass without changes
587
+ - **Don't** forget Semantic Versioning implications (MAJOR bump required)
588
+ - **Don't** make the method async - it's synchronous and should stay that way
589
+ - **Don't** add depth limit parameter - S1 research didn't recommend it
590
+ - **Don't** rename the method - keep `isDescendantOf` for consistency
591
+
592
+ ---
593
+
594
+ ## Appendix: Implementation Reference
595
+
596
+ ### Current Implementation (Before Change)
597
+
598
+ ```typescript
599
+ // File: src/core/workflow.ts, lines 152-180
600
+
601
+ /**
602
+ * Check if this workflow is a descendant of the given ancestor workflow
603
+ * Traverses the parent chain upward looking for the ancestor reference
604
+ * Uses visited Set to detect cycles during traversal
605
+ *
606
+ * @private
607
+ * @param ancestor - The potential ancestor workflow to check
608
+ * @returns true if ancestor is found in parent chain, false otherwise
609
+ * @throws {Error} If a cycle is detected during traversal
610
+ */
611
+ private isDescendantOf(ancestor: Workflow): boolean {
612
+ const visited = new Set<Workflow>();
613
+ let current: Workflow | null = this.parent;
614
+
615
+ while (current !== null) {
616
+ if (visited.has(current)) {
617
+ throw new Error('Circular parent-child relationship detected');
618
+ }
619
+ visited.add(current);
620
+
621
+ if (current === ancestor) {
622
+ return true;
623
+ }
624
+
625
+ current = current.parent;
626
+ }
627
+
628
+ return false;
629
+ }
630
+ ```
631
+
632
+ ### Proposed Implementation (After Change)
633
+
634
+ ```typescript
635
+ // File: src/core/workflow.ts, lines 152-190 (proposed)
636
+
637
+ /**
638
+ * Check if this workflow is a descendant of the given ancestor workflow.
639
+ *
640
+ * Traverses the parent chain upward looking for the ancestor reference.
641
+ * Uses a visited Set to detect cycles during traversal. This method provides
642
+ * a convenient way to check workflow hierarchy relationships without manually
643
+ * traversing the parent chain.
644
+ *
645
+ * @warning This method reveals workflow hierarchy information. If your
646
+ * application exposes workflows via an API, ensure you implement proper
647
+ * access control to prevent unauthorized topology discovery. Note that
648
+ * the `parent` and `children` properties are already public, so this
649
+ * method does not expose any new information beyond what is currently
650
+ * accessible.
651
+ *
652
+ * **Time Complexity**: O(d) where d is the depth of the hierarchy
653
+ * **Space Complexity**: O(d) for the visited Set in worst case (cycle detection)
654
+ *
655
+ * @example Check if a workflow belongs to a specific hierarchy
656
+ * ```typescript
657
+ * const root = new Workflow('root');
658
+ * const child = new Workflow('child', { parent: root });
659
+ *
660
+ * if (child.isDescendantOf(root)) {
661
+ * console.log('Child is in root hierarchy');
662
+ * }
663
+ * ```
664
+ *
665
+ * @example Validate before attaching to prevent circular references
666
+ * ```typescript
667
+ * if (!newChild.isDescendantOf(parent)) {
668
+ * parent.attachChild(newChild);
669
+ * } else {
670
+ * throw new Error('Would create circular reference');
671
+ * }
672
+ * ```
673
+ *
674
+ * @example Check for ancestor relationship in conditional logic
675
+ * ```typescript
676
+ * const isInProductionBranch = workflow.isDescendantOf(productionRoot);
677
+ * if (isInProductionBranch) {
678
+ * // Apply production-specific logic
679
+ * }
680
+ * ```
681
+ *
682
+ * @param ancestor - The potential ancestor workflow to check
683
+ * @returns true if ancestor is found in parent chain, false otherwise
684
+ * @throws {Error} If a cycle is detected during traversal (indicates corrupted tree structure)
685
+ */
686
+ public isDescendantOf(ancestor: Workflow): boolean {
687
+ const visited = new Set<Workflow>();
688
+ let current: Workflow | null = this.parent;
689
+
690
+ while (current !== null) {
691
+ if (visited.has(current)) {
692
+ throw new Error('Circular parent-child relationship detected');
693
+ }
694
+ visited.add(current);
695
+
696
+ if (current === ancestor) {
697
+ return true;
698
+ }
699
+
700
+ current = current.parent;
701
+ }
702
+
703
+ return false;
704
+ }
705
+ ```
706
+
707
+ ### Security Documentation Addition
708
+
709
+ ```markdown
710
+ # Add to: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
711
+ # Location: After Threat 4 (Denial of Service), before Implementation Checklist
712
+
713
+ ### Threat 5: Topology Exposure via isDescendantOf
714
+
715
+ **Attack Scenario:**
716
+ ```
717
+ Attacker → Calls workflow.isDescendantOf(suspectWorkflow)
718
+ → Learns hierarchy relationship between workflows
719
+ → Maps workflow tree structure
720
+ → Extracts business intelligence from topology
721
+ ```
722
+
723
+ **Risk Level:** LOW (same as current exposure)
724
+
725
+ **Rationale:**
726
+ - `parent` and `children` properties are already public
727
+ - `getNode()` exposes full tree structure
728
+ - `isDescendantOf()` only provides convenience, not new information
729
+ - Attacker can already traverse tree manually
730
+
731
+ **Affected Method:** `Workflow.isDescendantOf()` (newly public)
732
+
733
+ **Mitigation:**
734
+ 1. **Application-Level Access Control** - If exposing workflows via API:
735
+ ```typescript
736
+ // Validate user has permission to access workflow
737
+ if (!user.canAccessWorkflow(workflowId)) {
738
+ throw new Error('Unauthorized');
739
+ }
740
+ // Only then allow isDescendantOf calls
741
+ ```
742
+
743
+ 2. **Filter Hierarchy Information** - For unauthenticated users:
744
+ ```typescript
745
+ // Return filtered view without hierarchy
746
+ const filteredWorkflow = {
747
+ id: workflow.id,
748
+ name: workflow.name,
749
+ // Omit parent, children, isDescendantOf
750
+ };
751
+ ```
752
+
753
+ 3. **Audit Topology Access** - Log calls to isDescendantOf:
754
+ ```typescript
755
+ auditLog.log({
756
+ timestamp: Date.now(),
757
+ userId: user.id,
758
+ action: 'isDescendantOf',
759
+ workflowId: workflow.id,
760
+ ancestorId: ancestor.id
761
+ });
762
+ ```
763
+
764
+ **Recommendation:** Document that applications should implement access control
765
+ if exposing workflows via APIs. The library itself provides no built-in security.
766
+ ```
767
+
768
+ ---
769
+
770
+ ## Confidence Score
771
+
772
+ **One-Pass Implementation Success Likelihood**: **9/10**
773
+
774
+ **Rationale**:
775
+ - S1 research and recommendation are comprehensive and clear
776
+ - Implementation is straightforward (one keyword change + documentation)
777
+ - Existing tests already cover the functionality (25+ test cases)
778
+ - No logic changes required, minimizing risk
779
+ - Clear documentation patterns exist in codebase to follow
780
+ - Security implications are well-understood and documented
781
+
782
+ **Risk Mitigation**:
783
+ - Comprehensive JSDoc with security warning prevents misuse
784
+ - Security documentation update addresses information disclosure
785
+ - All changes are backward compatible (private → public only adds capability)
786
+ - Existing test suite provides safety net
787
+
788
+ ---
789
+
790
+ **PRP Version**: 1.0
791
+ **Last Updated**: 2026-01-12
792
+ **Status**: Ready for Implementation