groundswell 0.0.2 → 1.0.0

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 (554) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -9
  3. package/dist/cache/cache-key.d.ts +86 -0
  4. package/dist/cache/cache-key.d.ts.map +1 -0
  5. package/dist/cache/cache-key.js +204 -0
  6. package/dist/cache/cache-key.js.map +1 -0
  7. package/dist/cache/cache.d.ts +104 -0
  8. package/dist/cache/cache.d.ts.map +1 -0
  9. package/dist/cache/cache.js +179 -0
  10. package/dist/cache/cache.js.map +1 -0
  11. package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +6 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/core/agent.d.ts +203 -0
  16. package/dist/core/agent.d.ts.map +1 -0
  17. package/dist/core/agent.js +833 -0
  18. package/dist/core/agent.js.map +1 -0
  19. package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
  20. package/dist/core/context.d.ts.map +1 -0
  21. package/dist/core/context.js +80 -0
  22. package/dist/core/context.js.map +1 -0
  23. package/dist/core/event-tree.d.ts +72 -0
  24. package/dist/core/event-tree.d.ts.map +1 -0
  25. package/dist/core/event-tree.js +211 -0
  26. package/dist/core/event-tree.js.map +1 -0
  27. package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
  28. package/dist/core/factory.d.ts.map +1 -0
  29. package/dist/core/factory.js +110 -0
  30. package/dist/core/factory.js.map +1 -0
  31. package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +9 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/logger.d.ts +50 -0
  36. package/dist/core/logger.d.ts.map +1 -0
  37. package/dist/core/logger.js +91 -0
  38. package/dist/core/logger.js.map +1 -0
  39. package/dist/core/mcp-handler.d.ts +127 -0
  40. package/dist/core/mcp-handler.d.ts.map +1 -0
  41. package/dist/core/mcp-handler.js +323 -0
  42. package/dist/core/mcp-handler.js.map +1 -0
  43. package/dist/core/prompt.d.ts +80 -0
  44. package/dist/core/prompt.d.ts.map +1 -0
  45. package/dist/core/prompt.js +120 -0
  46. package/dist/core/prompt.js.map +1 -0
  47. package/dist/core/workflow-context.d.ts +61 -0
  48. package/dist/core/workflow-context.d.ts.map +1 -0
  49. package/dist/core/workflow-context.js +358 -0
  50. package/dist/core/workflow-context.js.map +1 -0
  51. package/dist/core/workflow.d.ts +543 -0
  52. package/dist/core/workflow.d.ts.map +1 -0
  53. package/dist/core/workflow.js +986 -0
  54. package/dist/core/workflow.js.map +1 -0
  55. package/dist/debugger/event-replayer.d.ts +422 -0
  56. package/dist/debugger/event-replayer.d.ts.map +1 -0
  57. package/dist/debugger/event-replayer.js +639 -0
  58. package/dist/debugger/event-replayer.js.map +1 -0
  59. package/dist/debugger/index.d.ts +2 -0
  60. package/dist/debugger/index.d.ts.map +1 -0
  61. package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
  62. package/dist/debugger/index.js.map +1 -0
  63. package/dist/debugger/tree-debugger.d.ts +240 -0
  64. package/dist/debugger/tree-debugger.d.ts.map +1 -0
  65. package/dist/debugger/tree-debugger.js +620 -0
  66. package/dist/debugger/tree-debugger.js.map +1 -0
  67. package/dist/decorators/index.d.ts +4 -0
  68. package/dist/decorators/index.d.ts.map +1 -0
  69. package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
  70. package/dist/decorators/index.js.map +1 -0
  71. package/dist/decorators/observed-state.d.ts +32 -0
  72. package/dist/decorators/observed-state.d.ts.map +1 -0
  73. package/dist/decorators/observed-state.js +79 -0
  74. package/dist/decorators/observed-state.js.map +1 -0
  75. package/dist/decorators/step.d.ts +15 -0
  76. package/dist/decorators/step.d.ts.map +1 -0
  77. package/dist/decorators/step.js +192 -0
  78. package/dist/decorators/step.js.map +1 -0
  79. package/dist/decorators/task.d.ts +50 -0
  80. package/dist/decorators/task.d.ts.map +1 -0
  81. package/dist/decorators/task.js +118 -0
  82. package/dist/decorators/task.js.map +1 -0
  83. package/dist/examples/index.d.ts +3 -0
  84. package/dist/examples/index.d.ts.map +1 -0
  85. package/{src/examples/index.ts → dist/examples/index.js} +1 -0
  86. package/dist/examples/index.js.map +1 -0
  87. package/dist/examples/tdd-orchestrator.d.ts +15 -0
  88. package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
  89. package/dist/examples/tdd-orchestrator.js +121 -0
  90. package/dist/examples/tdd-orchestrator.js.map +1 -0
  91. package/dist/examples/test-cycle-workflow.d.ts +14 -0
  92. package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
  93. package/dist/examples/test-cycle-workflow.js +116 -0
  94. package/dist/examples/test-cycle-workflow.js.map +1 -0
  95. package/dist/harnesses/claude-code-harness.d.ts +391 -0
  96. package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
  97. package/dist/harnesses/claude-code-harness.js +1076 -0
  98. package/dist/harnesses/claude-code-harness.js.map +1 -0
  99. package/dist/harnesses/harness-registry.d.ts +440 -0
  100. package/dist/harnesses/harness-registry.d.ts.map +1 -0
  101. package/dist/harnesses/harness-registry.js +543 -0
  102. package/dist/harnesses/harness-registry.js.map +1 -0
  103. package/dist/harnesses/index.d.ts +12 -0
  104. package/dist/harnesses/index.d.ts.map +1 -0
  105. package/dist/harnesses/index.js +11 -0
  106. package/dist/harnesses/index.js.map +1 -0
  107. package/dist/harnesses/pi-harness.d.ts +219 -0
  108. package/dist/harnesses/pi-harness.d.ts.map +1 -0
  109. package/dist/harnesses/pi-harness.js +676 -0
  110. package/dist/harnesses/pi-harness.js.map +1 -0
  111. package/dist/harnesses/pi-schema-converter.d.ts +24 -0
  112. package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
  113. package/dist/harnesses/pi-schema-converter.js +81 -0
  114. package/dist/harnesses/pi-schema-converter.js.map +1 -0
  115. package/dist/harnesses/register-defaults.d.ts +24 -0
  116. package/dist/harnesses/register-defaults.d.ts.map +1 -0
  117. package/dist/harnesses/register-defaults.js +40 -0
  118. package/dist/harnesses/register-defaults.js.map +1 -0
  119. package/dist/harnesses/session-store.d.ts +201 -0
  120. package/dist/harnesses/session-store.d.ts.map +1 -0
  121. package/dist/harnesses/session-store.js +254 -0
  122. package/dist/harnesses/session-store.js.map +1 -0
  123. package/dist/index.d.ts +37 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +57 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/reflection/index.d.ts +5 -0
  128. package/dist/reflection/index.d.ts.map +1 -0
  129. package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
  130. package/dist/reflection/index.js.map +1 -0
  131. package/dist/reflection/reflection.d.ts +84 -0
  132. package/dist/reflection/reflection.d.ts.map +1 -0
  133. package/dist/reflection/reflection.js +344 -0
  134. package/dist/reflection/reflection.js.map +1 -0
  135. package/dist/tools/index.d.ts +6 -0
  136. package/dist/tools/index.d.ts.map +1 -0
  137. package/dist/tools/index.js +11 -0
  138. package/dist/tools/index.js.map +1 -0
  139. package/dist/tools/introspection.d.ts +165 -0
  140. package/dist/tools/introspection.d.ts.map +1 -0
  141. package/dist/tools/introspection.js +324 -0
  142. package/dist/tools/introspection.js.map +1 -0
  143. package/dist/types/agent.d.ts +1317 -0
  144. package/dist/types/agent.d.ts.map +1 -0
  145. package/dist/types/agent.js +423 -0
  146. package/dist/types/agent.js.map +1 -0
  147. package/dist/types/decorators.d.ts +40 -0
  148. package/dist/types/decorators.d.ts.map +1 -0
  149. package/dist/types/decorators.js +2 -0
  150. package/dist/types/decorators.js.map +1 -0
  151. package/dist/types/error-strategy.d.ts +13 -0
  152. package/dist/types/error-strategy.d.ts.map +1 -0
  153. package/dist/types/error-strategy.js +2 -0
  154. package/dist/types/error-strategy.js.map +1 -0
  155. package/dist/types/error.d.ts +20 -0
  156. package/dist/types/error.d.ts.map +1 -0
  157. package/dist/types/error.js +2 -0
  158. package/dist/types/error.js.map +1 -0
  159. package/dist/types/events.d.ts +113 -0
  160. package/dist/types/events.d.ts.map +1 -0
  161. package/dist/types/events.js +2 -0
  162. package/dist/types/events.js.map +1 -0
  163. package/dist/types/harnesses.d.ts +474 -0
  164. package/dist/types/harnesses.d.ts.map +1 -0
  165. package/dist/types/harnesses.js +2 -0
  166. package/dist/types/harnesses.js.map +1 -0
  167. package/dist/types/index.d.ts +23 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +8 -0
  170. package/dist/types/index.js.map +1 -0
  171. package/dist/types/logging.d.ts +24 -0
  172. package/dist/types/logging.d.ts.map +1 -0
  173. package/dist/types/logging.js +2 -0
  174. package/dist/types/logging.js.map +1 -0
  175. package/dist/types/observer.d.ts +18 -0
  176. package/dist/types/observer.d.ts.map +1 -0
  177. package/dist/types/observer.js +2 -0
  178. package/dist/types/observer.js.map +1 -0
  179. package/dist/types/prompt.d.ts +31 -0
  180. package/dist/types/prompt.d.ts.map +1 -0
  181. package/dist/types/prompt.js +6 -0
  182. package/dist/types/prompt.js.map +1 -0
  183. package/dist/types/providers.d.ts +691 -0
  184. package/dist/types/providers.d.ts.map +1 -0
  185. package/dist/types/providers.js +14 -0
  186. package/dist/types/providers.js.map +1 -0
  187. package/dist/types/reflection.d.ts +96 -0
  188. package/dist/types/reflection.d.ts.map +1 -0
  189. package/dist/types/reflection.js +24 -0
  190. package/dist/types/reflection.js.map +1 -0
  191. package/dist/types/restart.d.ts +132 -0
  192. package/dist/types/restart.d.ts.map +1 -0
  193. package/dist/types/restart.js +2 -0
  194. package/dist/types/restart.js.map +1 -0
  195. package/dist/types/sdk-primitives.d.ts +118 -0
  196. package/dist/types/sdk-primitives.d.ts.map +1 -0
  197. package/dist/types/sdk-primitives.js +6 -0
  198. package/dist/types/sdk-primitives.js.map +1 -0
  199. package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
  200. package/dist/types/snapshot.d.ts.map +1 -0
  201. package/dist/types/snapshot.js +2 -0
  202. package/dist/types/snapshot.js.map +1 -0
  203. package/dist/types/streaming.d.ts +194 -0
  204. package/dist/types/streaming.d.ts.map +1 -0
  205. package/dist/types/streaming.js +67 -0
  206. package/dist/types/streaming.js.map +1 -0
  207. package/dist/types/workflow-context.d.ts +275 -0
  208. package/dist/types/workflow-context.d.ts.map +1 -0
  209. package/dist/types/workflow-context.js +8 -0
  210. package/dist/types/workflow-context.js.map +1 -0
  211. package/dist/types/workflow.d.ts +30 -0
  212. package/dist/types/workflow.d.ts.map +1 -0
  213. package/dist/types/workflow.js +2 -0
  214. package/dist/types/workflow.js.map +1 -0
  215. package/dist/utils/agent-validation.d.ts +88 -0
  216. package/dist/utils/agent-validation.d.ts.map +1 -0
  217. package/dist/utils/agent-validation.js +87 -0
  218. package/dist/utils/agent-validation.js.map +1 -0
  219. package/dist/utils/delay.d.ts +7 -0
  220. package/dist/utils/delay.d.ts.map +1 -0
  221. package/dist/utils/delay.js +9 -0
  222. package/dist/utils/delay.js.map +1 -0
  223. package/dist/utils/harness-config.d.ts +180 -0
  224. package/dist/utils/harness-config.d.ts.map +1 -0
  225. package/dist/utils/harness-config.js +311 -0
  226. package/dist/utils/harness-config.js.map +1 -0
  227. package/dist/utils/id.d.ts +6 -0
  228. package/dist/utils/id.d.ts.map +1 -0
  229. package/dist/utils/id.js +12 -0
  230. package/dist/utils/id.js.map +1 -0
  231. package/dist/utils/index.d.ts +13 -0
  232. package/dist/utils/index.d.ts.map +1 -0
  233. package/dist/utils/index.js +11 -0
  234. package/dist/utils/index.js.map +1 -0
  235. package/dist/utils/model-spec.d.ts +110 -0
  236. package/dist/utils/model-spec.d.ts.map +1 -0
  237. package/dist/utils/model-spec.js +149 -0
  238. package/dist/utils/model-spec.js.map +1 -0
  239. package/dist/utils/observable.d.ts +54 -0
  240. package/dist/utils/observable.d.ts.map +1 -0
  241. package/dist/utils/observable.js +82 -0
  242. package/dist/utils/observable.js.map +1 -0
  243. package/dist/utils/provider-config.d.ts +10 -0
  244. package/dist/utils/provider-config.d.ts.map +1 -0
  245. package/dist/utils/provider-config.js +10 -0
  246. package/dist/utils/provider-config.js.map +1 -0
  247. package/dist/utils/restart-analysis.d.ts +202 -0
  248. package/dist/utils/restart-analysis.d.ts.map +1 -0
  249. package/dist/utils/restart-analysis.js +426 -0
  250. package/dist/utils/restart-analysis.js.map +1 -0
  251. package/dist/utils/session-serialization.d.ts +118 -0
  252. package/dist/utils/session-serialization.d.ts.map +1 -0
  253. package/dist/utils/session-serialization.js +217 -0
  254. package/dist/utils/session-serialization.js.map +1 -0
  255. package/dist/utils/workflow-error-utils.d.ts +22 -0
  256. package/dist/utils/workflow-error-utils.d.ts.map +1 -0
  257. package/dist/utils/workflow-error-utils.js +45 -0
  258. package/dist/utils/workflow-error-utils.js.map +1 -0
  259. package/package.json +34 -5
  260. package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
  261. package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
  262. package/.claude/commands/task-breakdown.md +0 -94
  263. package/.claude/settings.local.json +0 -9
  264. package/.claude/system_prompts/task-breakdown.md +0 -101
  265. package/CHANGELOG.md +0 -188
  266. package/PRD.md +0 -543
  267. package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
  268. package/PRPs/PRDs/002-agent-prompt.md +0 -390
  269. package/PRPs/PRDs/003-agent-prompt.md +0 -943
  270. package/PRPs/PRDs/004-agent-prompt.md +0 -1136
  271. package/PRPs/PRDs/tasks-001.json +0 -492
  272. package/PRPs/README.md +0 -83
  273. package/PRPs/templates/prp_base.md +0 -222
  274. package/docs/agent.md +0 -422
  275. package/docs/prompt.md +0 -419
  276. package/docs/workflow.md +0 -600
  277. package/examples/README.md +0 -258
  278. package/examples/examples/01-basic-workflow.ts +0 -100
  279. package/examples/examples/02-decorator-options.ts +0 -217
  280. package/examples/examples/03-parent-child.ts +0 -241
  281. package/examples/examples/04-observers-debugger.ts +0 -340
  282. package/examples/examples/05-error-handling.ts +0 -387
  283. package/examples/examples/06-concurrent-tasks.ts +0 -352
  284. package/examples/examples/07-agent-loops.ts +0 -432
  285. package/examples/examples/08-sdk-features.ts +0 -667
  286. package/examples/examples/09-reflection.ts +0 -573
  287. package/examples/examples/10-introspection.ts +0 -550
  288. package/examples/examples/11-reparenting-workflows.ts +0 -269
  289. package/examples/index.ts +0 -147
  290. package/examples/utils/helpers.ts +0 -57
  291. package/package-lock.json +0 -2398
  292. package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
  293. package/plan/001_d3bb02af4886/backlog.json +0 -867
  294. package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
  295. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
  296. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
  297. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
  298. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
  299. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
  300. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
  301. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
  302. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
  303. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
  304. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
  305. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
  306. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
  307. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
  308. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
  309. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
  310. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
  311. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
  312. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
  313. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
  314. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
  315. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
  316. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
  317. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
  318. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
  319. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
  320. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
  321. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
  322. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
  323. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
  324. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
  325. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
  326. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
  327. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
  328. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
  329. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
  330. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
  331. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
  332. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
  333. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
  334. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
  335. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
  336. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
  337. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
  338. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
  339. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
  340. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
  341. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
  342. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
  343. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
  344. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
  345. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
  346. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
  347. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
  348. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
  349. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
  350. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
  351. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
  352. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
  353. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
  354. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
  355. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
  356. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
  357. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
  358. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
  359. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
  360. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
  361. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
  362. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
  363. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
  364. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
  365. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
  366. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
  367. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
  368. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
  369. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
  370. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
  371. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
  372. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
  373. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
  374. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
  375. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
  376. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
  377. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
  378. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
  379. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
  380. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
  381. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
  382. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
  383. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
  384. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
  385. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
  386. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
  387. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
  388. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
  389. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
  390. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
  391. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
  392. package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
  393. package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
  394. package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
  395. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
  396. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
  397. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
  398. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
  399. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
  400. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
  401. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
  402. package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
  403. package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
  404. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
  405. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
  406. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
  407. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
  408. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
  409. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
  410. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
  411. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
  412. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
  413. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
  414. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
  415. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
  416. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
  417. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
  418. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
  419. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
  420. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
  421. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
  422. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
  423. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
  424. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
  425. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
  426. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
  427. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
  428. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
  429. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
  430. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
  431. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
  432. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
  433. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
  434. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
  435. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
  436. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
  437. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
  438. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
  439. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
  440. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
  441. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
  442. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
  443. package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
  444. package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
  445. package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
  446. package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
  447. package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
  448. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
  449. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
  450. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
  451. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
  452. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
  453. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
  454. package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
  455. package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
  456. package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
  457. package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
  458. package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
  459. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
  460. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
  461. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
  462. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
  463. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
  464. package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
  465. package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
  466. package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
  467. package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
  468. package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
  469. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
  470. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
  471. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
  472. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
  473. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
  474. package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
  475. package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
  476. package/scripts/generate-llms-full.ts +0 -206
  477. package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
  478. package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
  479. package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
  480. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
  481. package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
  482. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
  483. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
  484. package/src/__tests__/adversarial/edge-case.test.ts +0 -703
  485. package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
  486. package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
  487. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
  488. package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
  489. package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
  490. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
  491. package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
  492. package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
  493. package/src/__tests__/helpers/index.ts +0 -18
  494. package/src/__tests__/helpers/tree-verification.ts +0 -257
  495. package/src/__tests__/integration/agent-workflow.test.ts +0 -256
  496. package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
  497. package/src/__tests__/integration/observer-logging.test.ts +0 -643
  498. package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
  499. package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
  500. package/src/__tests__/unit/agent.test.ts +0 -169
  501. package/src/__tests__/unit/cache-key.test.ts +0 -182
  502. package/src/__tests__/unit/cache.test.ts +0 -172
  503. package/src/__tests__/unit/context.test.ts +0 -217
  504. package/src/__tests__/unit/decorators.test.ts +0 -100
  505. package/src/__tests__/unit/introspection-tools.test.ts +0 -277
  506. package/src/__tests__/unit/logger.test.ts +0 -293
  507. package/src/__tests__/unit/observable.test.ts +0 -321
  508. package/src/__tests__/unit/prompt.test.ts +0 -135
  509. package/src/__tests__/unit/reflection.test.ts +0 -210
  510. package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
  511. package/src/__tests__/unit/tree-debugger.test.ts +0 -85
  512. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
  513. package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
  514. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
  515. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
  516. package/src/__tests__/unit/workflow.test.ts +0 -357
  517. package/src/cache/cache-key.ts +0 -244
  518. package/src/cache/cache.ts +0 -236
  519. package/src/core/agent.ts +0 -593
  520. package/src/core/event-tree.ts +0 -260
  521. package/src/core/logger.ts +0 -112
  522. package/src/core/mcp-handler.ts +0 -184
  523. package/src/core/prompt.ts +0 -150
  524. package/src/core/workflow-context.ts +0 -351
  525. package/src/core/workflow.ts +0 -540
  526. package/src/debugger/tree-debugger.ts +0 -255
  527. package/src/decorators/observed-state.ts +0 -95
  528. package/src/decorators/step.ts +0 -139
  529. package/src/decorators/task.ts +0 -159
  530. package/src/examples/tdd-orchestrator.ts +0 -65
  531. package/src/examples/test-cycle-workflow.ts +0 -64
  532. package/src/index.ts +0 -142
  533. package/src/reflection/reflection.ts +0 -407
  534. package/src/tools/index.ts +0 -36
  535. package/src/tools/introspection.ts +0 -464
  536. package/src/types/agent.ts +0 -90
  537. package/src/types/decorators.ts +0 -32
  538. package/src/types/error-strategy.ts +0 -13
  539. package/src/types/error.ts +0 -20
  540. package/src/types/events.ts +0 -75
  541. package/src/types/index.ts +0 -55
  542. package/src/types/logging.ts +0 -24
  543. package/src/types/observer.ts +0 -18
  544. package/src/types/prompt.ts +0 -40
  545. package/src/types/reflection.ts +0 -117
  546. package/src/types/sdk-primitives.ts +0 -128
  547. package/src/types/workflow-context.ts +0 -163
  548. package/src/types/workflow.ts +0 -37
  549. package/src/utils/id.ts +0 -11
  550. package/src/utils/index.ts +0 -4
  551. package/src/utils/observable.ts +0 -106
  552. package/src/utils/workflow-error-utils.ts +0 -56
  553. package/tsconfig.json +0 -22
  554. package/vitest.config.ts +0 -16
@@ -1,792 +0,0 @@
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