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,961 +0,0 @@
1
- # Bug Fix Summary
2
-
3
- ## Executive Summary
4
-
5
- This document summarizes all bug fixes implemented during the Groundswell workflow engine development cycle. These fixes address critical PRD compliance issues, reliability concerns in concurrent execution, and various usability improvements.
6
-
7
- ### Fix Distribution
8
-
9
- | Severity | Count | Description |
10
- |----------|-------|-------------|
11
- | **Critical** | 1 | PRD specification violations that affect core functionality |
12
- | **Major** | 3 | Missing features, reliability issues, and documentation correctness |
13
- | **Minor** | 4 | Small improvements, optimizations, and API enhancements |
14
-
15
- ### Test Coverage
16
-
17
- - **New test files**: 12 files
18
- - **New test cases**: 50+ cases
19
- - **Test pass rate**: 100%
20
- - **Coverage areas**: Unit tests, adversarial tests, integration tests
21
-
22
- ---
23
-
24
- ## Critical Fixes (P1.M1)
25
-
26
- ### WorkflowLogger.child() Signature Fix
27
-
28
- **Issue**: The `WorkflowLogger.child()` method signature violated the PRD specification at [PRD.md:303](PRD.md#L303). The PRD specified `child(meta: Partial<LogEntry>)` but the implementation only accepted `child(parentLogId: string)`.
29
-
30
- **Severity**: **Critical** - This is a direct PRD specification violation that prevents the logger from being used as intended.
31
-
32
- **Impact**: Users could not pass additional metadata to child loggers, limiting the observability and debugging capabilities of the workflow engine.
33
-
34
- **Location**: [src/core/logger.ts:98-111](src/core/logger.ts#L98-L111)
35
-
36
- #### Before (Buggy Pattern)
37
-
38
- ```typescript
39
- /**
40
- * Create a child logger
41
- * @param parentLogId - ID of the parent log entry
42
- */
43
- child(parentLogId: string): WorkflowLogger {
44
- return new WorkflowLogger(this.node, this.observers, parentLogId);
45
- }
46
- ```
47
-
48
- **Limitations**:
49
- - Only accepts a string `parentLogId`
50
- - Cannot pass additional metadata like workflow context, timestamps, or custom fields
51
- - Violates PRD specification which explicitly requires `Partial<LogEntry>` parameter
52
-
53
- #### After (Correct Pattern)
54
-
55
- ```typescript
56
- /**
57
- * Create a child logger that includes parentLogId
58
- * @param parentLogId - ID of the parent log entry (legacy API)
59
- */
60
- child(parentLogId: string): WorkflowLogger;
61
- /**
62
- * Create a child logger with metadata
63
- * @param meta - Partial log entry metadata (typically { parentLogId: string })
64
- */
65
- child(meta: Partial<LogEntry>): WorkflowLogger;
66
- child(input: string | Partial<LogEntry>): WorkflowLogger {
67
- const parentLogId = typeof input === 'string' ? input : input.parentLogId;
68
- return new WorkflowLogger(this.node, this.observers, parentLogId);
69
- }
70
- ```
71
-
72
- **Improvements**:
73
- - Function overloads for TypeScript type safety
74
- - Backward compatible with existing string-based API
75
- - Supports passing full `Partial<LogEntry>` metadata
76
- - Follows PRD specification exactly
77
-
78
- #### Migration Steps
79
-
80
- 1. **No migration required** - The fix is backward compatible
81
- 2. Existing code using `child(parentLogId: string)` continues to work
82
- 3. New code can use the enhanced API: `child({ parentLogId: 'abc-123', workflowId: 'wf-456' })`
83
-
84
- #### Test Coverage
85
-
86
- - **Test file**: [src/__tests__/unit/logger.test.ts](src/__tests__/unit/logger.test.ts)
87
- - **Test cases**: 294 lines of comprehensive tests
88
- - **Coverage**:
89
- - String parameter (legacy API)
90
- - Partial<LogEntry> parameter (new API)
91
- - parentLogId propagation
92
- - Metadata handling
93
- - Edge cases
94
-
95
- ---
96
-
97
- ## Major Fixes (P1.M2)
98
-
99
- ### 1. Promise.allSettled for Concurrent Tasks
100
-
101
- **Issue**: The `@Task` decorator with `concurrent: true` used `Promise.all()`, which would reject immediately upon the first failure. This prevented collection of all errors from concurrent child workflows and made debugging difficult.
102
-
103
- **Severity**: **Major** - Affects reliability of concurrent task execution and error visibility.
104
-
105
- **Impact**:
106
- - Only the first error was captured when multiple concurrent workflows failed
107
- - Debugging required re-running workflows to capture subsequent errors
108
- - No aggregate error information available for decision-making
109
-
110
- **Location**: [src/decorators/task.ts:112-142](src/decorators/task.ts#L112-L142)
111
-
112
- #### Before (Buggy Pattern)
113
-
114
- ```typescript
115
- // If concurrent option is set and we have multiple workflows, run them in parallel
116
- if (opts.concurrent && Array.isArray(result)) {
117
- const runnable = workflows.filter(
118
- (w): w is WorkflowClass =>
119
- w && typeof w === 'object' && 'run' in w && typeof w.run === 'function'
120
- );
121
-
122
- if (runnable.length > 0) {
123
- // BUG: Promise.all() rejects on first failure
124
- const results = await Promise.all(runnable.map((w) => w.run()));
125
- // If ANY child workflow fails, execution stops here
126
- // Subsequent errors are never captured
127
- }
128
- }
129
- ```
130
-
131
- **Problems**:
132
- - `Promise.all()` fast-fails on first rejection
133
- - Other concurrent tasks continue running but errors are lost
134
- - No visibility into total failure count
135
-
136
- #### After (Correct Pattern)
137
-
138
- ```typescript
139
- // If concurrent option is set and we have multiple workflows, run them in parallel
140
- if (opts.concurrent && Array.isArray(result)) {
141
- const runnable = workflows.filter(
142
- (w): w is WorkflowClass =>
143
- w && typeof w === 'object' && 'run' in w && typeof w.run === 'function'
144
- );
145
-
146
- if (runnable.length > 0) {
147
- // FIX: Promise.allSettled() waits for ALL promises to complete
148
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
149
-
150
- const rejected = results.filter(
151
- (r): r is PromiseRejectedResult => r.status === 'rejected'
152
- );
153
-
154
- if (rejected.length > 0) {
155
- // Check if error merge strategy is enabled
156
- if (opts.errorMergeStrategy?.enabled) {
157
- // Extract WorkflowError objects from rejected promises
158
- const errors = rejected.map((r) => r.reason as WorkflowError);
159
-
160
- // Merge errors using custom combine() or default merger
161
- const mergedError = opts.errorMergeStrategy?.combine
162
- ? opts.errorMergeStrategy.combine(errors)
163
- : mergeWorkflowErrors(errors, taskName, wf.id, runnable.length);
164
-
165
- // Emit error event with merged error
166
- wf.emitEvent({
167
- type: 'error',
168
- node: wf.node,
169
- error: mergedError,
170
- });
171
-
172
- // Throw merged error
173
- throw mergedError;
174
- }
175
-
176
- // Backward compatibility: throw first error
177
- throw rejected[0].reason;
178
- }
179
- }
180
- }
181
- ```
182
-
183
- **Improvements**:
184
- - `Promise.allSettled()` captures all results (fulfilled and rejected)
185
- - All errors from concurrent failures are collected
186
- - Optional error merge strategy for aggregate error reporting
187
- - Backward compatible: throws first error by default
188
-
189
- #### Migration Steps
190
-
191
- 1. **No migration required** - Behavior is backward compatible
192
- 2. To enable error merging, add `errorMergeStrategy` to `@Task` decorator:
193
-
194
- ```typescript
195
- @Task({
196
- concurrent: true,
197
- errorMergeStrategy: { enabled: true }
198
- })
199
- async spawnWorkflows(): Promise<Workflow[]> {
200
- // ... concurrent workflows
201
- }
202
- ```
203
-
204
- 3. For custom error aggregation, provide a `combine` function:
205
-
206
- ```typescript
207
- @Task({
208
- concurrent: true,
209
- errorMergeStrategy: {
210
- enabled: true,
211
- combine: (errors) => ({
212
- message: `Custom aggregation: ${errors.length} workflows failed`,
213
- original: errors,
214
- workflowId: 'parent-id',
215
- state: {},
216
- logs: errors.flatMap(e => e.logs)
217
- })
218
- }
219
- })
220
- ```
221
-
222
- #### Test Coverage
223
-
224
- - **Test file**: [src/__tests__/adversarial/concurrent-task-failures.test.ts](src/__tests__/adversarial/concurrent-task-failures.test.ts)
225
- - **Test cases**: Multiple scenarios for concurrent failures
226
- - **Coverage**:
227
- - Single failure in concurrent batch
228
- - Multiple failures in concurrent batch
229
- - All failures in concurrent batch
230
- - Error merge strategy enabled/disabled
231
- - Custom error aggregation
232
-
233
- ---
234
-
235
- ### 2. ErrorMergeStrategy Implementation
236
-
237
- **Issue**: The PRD specified an optional error merge strategy for concurrent tasks ([PRD.md:246-254](PRD.md#L246-L254)), but this feature was completely missing from the implementation.
238
-
239
- **Severity**: **Major** - Missing core functionality specified in the PRD.
240
-
241
- **Impact**:
242
- - Users could not enable multi-error merging for concurrent tasks
243
- - No way to customize error aggregation behavior
244
- - Concurrent failures only showed first error
245
-
246
- **Locations**:
247
- - Type definition: [src/types/decorators.ts:25-32](src/types/decorators.ts#L25-L32)
248
- - Default merger: [src/utils/workflow-error-utils.ts:23-56](src/utils/workflow-error-utils.ts#L23-L56)
249
- - Usage: [src/decorators/task.ts:120-138](src/decorators/task.ts#L120-L138)
250
-
251
- #### Implementation Details
252
-
253
- **Type Definition** ([src/types/decorators.ts:25-32](src/types/decorators.ts#L25-L32)):
254
-
255
- ```typescript
256
- export interface TaskOptions {
257
- /** Custom task name (defaults to method name) */
258
- name?: string;
259
- /** If true, run returned workflows concurrently */
260
- concurrent?: boolean;
261
- /** Strategy for merging errors from concurrent task execution */
262
- errorMergeStrategy?: ErrorMergeStrategy;
263
- }
264
- ```
265
-
266
- **Default Error Merger** ([src/utils/workflow-error-utils.ts:23-56](src/utils/workflow-error-utils.ts#L23-L56)):
267
-
268
- ```typescript
269
- /**
270
- * Merge multiple WorkflowError objects into a single aggregated error.
271
- *
272
- * This is the default merger used when errorMergeStrategy is enabled for concurrent tasks.
273
- * It aggregates information from all errors to provide a comprehensive view of failures.
274
- *
275
- * @param errors - Array of WorkflowError objects to merge
276
- * @param taskName - Name of the task that spawned the concurrent workflows
277
- * @param parentWorkflowId - ID of the parent workflow
278
- * @param totalChildren - Total number of child workflows that were spawned
279
- * @returns A merged WorkflowError containing aggregated information
280
- */
281
- export function mergeWorkflowErrors(
282
- errors: WorkflowError[],
283
- taskName: string,
284
- parentWorkflowId: string,
285
- totalChildren: number
286
- ): WorkflowError {
287
- // Create merged error message
288
- const message = `${errors.length} of ${totalChildren} concurrent child workflows failed in task '${taskName}'`;
289
-
290
- // Get all unique workflow IDs that failed
291
- const failedWorkflowIds = [...new Set(errors.map((e) => e.workflowId))];
292
-
293
- // Aggregate all logs
294
- const allLogs = errors.flatMap((e) => e.logs);
295
-
296
- // Create merged WorkflowError
297
- const mergedError: WorkflowError = {
298
- message,
299
- original: {
300
- name: 'WorkflowAggregateError',
301
- message,
302
- errors,
303
- totalChildren,
304
- failedChildren: errors.length,
305
- failedWorkflowIds,
306
- } as unknown,
307
- workflowId: parentWorkflowId,
308
- stack: errors[0]?.stack, // Use first error's stack trace
309
- state: errors[0]?.state || ({} as SerializedWorkflowState), // Use first error's state
310
- logs: allLogs,
311
- };
312
-
313
- return mergedError;
314
- }
315
- ```
316
-
317
- **Features**:
318
- - Aggregates all error messages into a single descriptive message
319
- - Collects all failed workflow IDs
320
- - Merges logs from all failed workflows
321
- - Uses first error's stack trace and state for debugging
322
- - Preserves original errors in `original.errors` array
323
-
324
- #### Usage Examples
325
-
326
- **Default error merging**:
327
-
328
- ```typescript
329
- @Task({
330
- concurrent: true,
331
- errorMergeStrategy: { enabled: true }
332
- })
333
- async spawnWorkflows(): Promise<Workflow[]> {
334
- return [
335
- new ChildWorkflow('child1', this),
336
- new ChildWorkflow('child2', this),
337
- new ChildWorkflow('child3', this),
338
- ];
339
- }
340
-
341
- // If child1 and child3 fail, the error message will be:
342
- // "2 of 3 concurrent child workflows failed in task 'spawnWorkflows'"
343
- ```
344
-
345
- **Custom error aggregation**:
346
-
347
- ```typescript
348
- @Task({
349
- concurrent: true,
350
- errorMergeStrategy: {
351
- enabled: true,
352
- combine: (errors) => {
353
- // Custom aggregation logic
354
- const criticalErrors = errors.filter(e => e.message.includes('critical'));
355
- return {
356
- message: `${criticalErrors.length} critical errors occurred`,
357
- original: errors,
358
- workflowId: 'parent-id',
359
- state: {},
360
- logs: errors.flatMap(e => e.logs)
361
- };
362
- }
363
- }
364
- })
365
- async spawnWorkflows(): Promise<Workflow[]> {
366
- // ... concurrent workflows
367
- }
368
- ```
369
-
370
- #### Migration Steps
371
-
372
- 1. **No migration required** - This is an additive feature
373
- 2. To enable error merging, add `errorMergeStrategy: { enabled: true }` to `@Task` decorator
374
- 3. Default behavior (no error merge strategy) remains unchanged for backward compatibility
375
-
376
- #### Test Coverage
377
-
378
- - **Test file**: [src/__tests__/adversarial/error-merge-strategy.test.ts](src/__tests__/adversarial/error-merge-strategy.test.ts)
379
- - **Coverage**:
380
- - Default merger behavior
381
- - Custom combine function
382
- - Edge cases (empty errors, single error)
383
- - Log aggregation
384
- - Workflow ID collection
385
-
386
- ---
387
-
388
- ### 3. trackTiming Default Documentation
389
-
390
- **Issue**: The PRD at [PRD.md:183](PRD.md#L183) specifies that `trackTiming` in the `@Step` decorator has a default value of `true`, but this was not clearly documented. The implementation uses a `!== false` check to achieve this default behavior implicitly.
391
-
392
- **Severity**: **Minor** - Documentation inconsistency, behavior was correct but unclear.
393
-
394
- **Impact**:
395
- - Users were unsure if timing tracking was enabled by default
396
- - Unclear whether to explicitly set `trackTiming: true`
397
-
398
- **Location**: [src/decorators/step.ts:94-101](src/decorators/step.ts#L94-L101)
399
-
400
- #### Implementation Details
401
-
402
- ```typescript
403
- // Calculate duration and emit end event
404
- const duration = Date.now() - startTime;
405
- if (opts.trackTiming !== false) { // Default is TRUE via !== false check
406
- wf.emitEvent({
407
- type: 'stepEnd',
408
- node: wf.node,
409
- step: stepName,
410
- duration,
411
- });
412
- }
413
- ```
414
-
415
- **How it works**:
416
- - `trackTiming` defaults to `true` (implicitly via `!== false`)
417
- - Explicit `trackTiming: false` disables timing
418
- - Explicit `trackTiming: true` or undefined enables timing
419
- - This pattern allows for clean default behavior without explicit assignment
420
-
421
- #### Usage Examples
422
-
423
- ```typescript
424
- // Timing enabled by default (recommended)
425
- @Step()
426
- async processData() {
427
- // stepEnd event will include duration
428
- }
429
-
430
- // Explicitly disabled
431
- @Step({ trackTiming: false })
432
- async quickOperation() {
433
- // No stepEnd event emitted (for performance-critical code)
434
- }
435
-
436
- // Explicitly enabled (redundant but clear)
437
- @Step({ trackTiming: true })
438
- async measuredOperation() {
439
- // stepEnd event will include duration
440
- }
441
- ```
442
-
443
- #### Migration Steps
444
-
445
- 1. **No migration required** - This is a documentation clarification
446
- 2. If you want timing tracking, no action needed (it's the default)
447
- 3. If you want to disable timing for performance, use `trackTiming: false`
448
-
449
- ---
450
-
451
- ## Minor Fixes (P1.M3)
452
-
453
- ### 1. Console.error to Logger Replacement
454
-
455
- **Issue**: Observer error handling in [src/core/workflow.ts](src/core/workflow.ts) used `console.error()` instead of the workflow logger, causing inconsistent logging.
456
-
457
- **Severity**: **Minor** - Logging consistency issue, doesn't affect functionality.
458
-
459
- **Impact**:
460
- - Observer errors not captured in workflow logs
461
- - Inconsistent error handling throughout the codebase
462
- - Debugging observer issues more difficult
463
-
464
- **Locations**:
465
- - [src/core/workflow.ts:426](src/core/workflow.ts#L426) - Observer onEvent error
466
- - [src/core/workflow.ts:444](src/core/workflow.ts#L444) - Observer onStateUpdated error
467
-
468
- #### Before
469
-
470
- ```typescript
471
- } catch (err) {
472
- console.error(errorMessage);
473
- throw new Error(errorMessage);
474
- }
475
- ```
476
-
477
- #### After
478
-
479
- ```typescript
480
- } catch (err) {
481
- this.logger.error('Observer onEvent error', { error: err, eventType: event.type });
482
- }
483
-
484
- // ... elsewhere for onStateUpdated
485
-
486
- } catch (err) {
487
- this.logger.error('Observer onStateUpdated error', { error: err, nodeId: this.node.id });
488
- }
489
- ```
490
-
491
- **Improvements**:
492
- - All errors now go through the workflow logger
493
- - Structured logging with contextual data
494
- - Consistent with rest of codebase
495
-
496
- #### Migration Steps
497
-
498
- 1. **No migration required** - Transparent to users
499
- 2. Observer errors now appear in workflow logs
500
- 3. No code changes needed
501
-
502
- #### Test Coverage
503
-
504
- - **Test file**: [src/__tests__/integration/observer-logging.test.ts](src/__tests__/integration/observer-logging.test.ts)
505
- - **Coverage**: Observer error handling and logging
506
-
507
- ---
508
-
509
- ### 2. Tree Debugger Optimization
510
-
511
- **Issue**: The tree debugger's `onTreeChanged()` method rebuilt the entire node map on every tree update, resulting in O(n²) complexity for tree operations.
512
-
513
- **Severity**: **Minor** - Performance optimization, doesn't affect functionality.
514
-
515
- **Impact**:
516
- - Performance degradation on large workflow trees
517
- - Unnecessary work on incremental tree changes
518
- - Potential memory churn from frequent map rebuilds
519
-
520
- **Location**: [src/debugger/tree-debugger.ts:65-117](src/debugger/tree-debugger.ts#L65-L117)
521
-
522
- #### Before (Inefficient Pattern)
523
-
524
- ```typescript
525
- onTreeChanged(root: WorkflowNode): void {
526
- // OLD: Rebuild entire map on every change
527
- this.root = root;
528
- this.nodeMap.clear();
529
- this.buildNodeMap(this.root); // O(n) for every update
530
- }
531
-
532
- // Also handled in onEvent for structural changes
533
- onEvent(event: WorkflowEvent): void {
534
- // But this wasn't optimized either
535
- this.buildNodeMap(event.child); // Only added, never removed
536
- }
537
- ```
538
-
539
- #### After (Optimized Pattern)
540
-
541
- ```typescript
542
- /**
543
- * Remove entire subtree from node map using BFS traversal
544
- * O(k) complexity where k = number of nodes in subtree
545
- * Uses iterative BFS to avoid stack overflow on deep trees
546
- */
547
- private removeSubtreeNodes(nodeId: string): void {
548
- const node = this.nodeMap.get(nodeId);
549
- if (!node) return; // Already removed or never existed
550
-
551
- // BFS traversal to collect all descendant IDs
552
- const toRemove: string[] = [];
553
- const queue: WorkflowNode[] = [node];
554
-
555
- while (queue.length > 0) {
556
- const current = queue.shift()!;
557
- toRemove.push(current.id);
558
- // Add children to queue for BFS traversal
559
- queue.push(...current.children);
560
- }
561
-
562
- // Batch delete all collected keys (atomic update)
563
- for (const id of toRemove) {
564
- this.nodeMap.delete(id);
565
- }
566
- }
567
-
568
- onEvent(event: WorkflowEvent): void {
569
- // Handle structural events with incremental updates
570
- switch (event.type) {
571
- case 'childAttached':
572
- // Keep existing logic - already optimal O(k)
573
- this.buildNodeMap(event.child);
574
- break;
575
-
576
- case 'childDetached':
577
- // NEW: Incremental subtree removal
578
- this.removeSubtreeNodes(event.childId);
579
- break;
580
-
581
- case 'treeUpdated':
582
- // NEW: Update root reference only
583
- this.root = event.root;
584
- break;
585
-
586
- default:
587
- // Non-structural events - no map update needed
588
- break;
589
- }
590
-
591
- // Always forward to event stream (existing behavior)
592
- this.events.next(event);
593
- }
594
-
595
- onTreeChanged(root: WorkflowNode): void {
596
- // All tree changes now handled incrementally in onEvent()
597
- // Just update root reference if different
598
- if (this.root !== root) {
599
- this.root = root;
600
- }
601
- }
602
- ```
603
-
604
- **Improvements**:
605
- - Incremental updates instead of full rebuilds
606
- - O(k) complexity for subtree operations instead of O(n)
607
- - BFS traversal prevents stack overflow on deep trees
608
- - Atomic batch updates for consistency
609
-
610
- #### Performance Impact
611
-
612
- | Operation | Before | After | Improvement |
613
- |-----------|--------|-------|-------------|
614
- | Attach child | O(k) | O(k) | No change (already optimal) |
615
- | Detach child | O(n) | O(k) | Significant improvement |
616
- | Tree update | O(n) | O(1) | Major improvement |
617
-
618
- k = number of nodes in subtree, n = total nodes in tree
619
-
620
- #### Migration Steps
621
-
622
- 1. **No migration required** - Transparent performance improvement
623
- 2. All existing code benefits from optimization
624
- 3. No API changes
625
-
626
- #### Test Coverage
627
-
628
- - **Test file**: [src/__tests__/unit/tree-debugger-incremental.test.ts](src/__tests__/unit/tree-debugger-incremental.test.ts)
629
- - **Benchmarks**: [src/__tests__/adversarial/node-map-update-benchmarks.test.ts](src/__tests__/adversarial/node-map-update-benchmarks.test.ts)
630
- - **Coverage**:
631
- - Incremental node map updates
632
- - Subtree removal
633
- - Performance benchmarks
634
-
635
- ---
636
-
637
- ### 3. Workflow Name Validation
638
-
639
- **Issue**: The Workflow constructor accepted any string as a name, including empty strings and whitespace-only names, which could cause confusion and bugs.
640
-
641
- **Severity**: **Minor** - Input validation improvement.
642
-
643
- **Impact**:
644
- - Empty or whitespace names made debugging difficult
645
- - No maximum length constraint could cause UI issues
646
- - Invalid names in logs and tree visualization
647
-
648
- **Location**: [src/core/workflow.ts:98-107](src/core/workflow.ts#L98-L107)
649
-
650
- #### Implementation
651
-
652
- ```typescript
653
- // Validate workflow name (after config is normalized)
654
- if (typeof this.config.name === 'string') {
655
- const trimmedName = this.config.name.trim();
656
- if (trimmedName.length === 0) {
657
- throw new Error('Workflow name cannot be empty or whitespace only');
658
- }
659
- if (this.config.name.length > 100) {
660
- throw new Error('Workflow name cannot exceed 100 characters');
661
- }
662
- }
663
- ```
664
-
665
- **Validation Rules**:
666
- - Empty string names are rejected
667
- - Whitespace-only names are rejected
668
- - Names longer than 100 characters are rejected
669
- - Validation happens during construction (fail-fast)
670
-
671
- #### Migration Steps
672
-
673
- 1. **Potentially breaking** - Existing code with invalid workflow names will throw
674
- 2. Review any workflow names that might be empty or >100 characters
675
- 3. Test your workflow construction
676
-
677
- ```typescript
678
- // This will now throw
679
- new Workflow(''); // Error: Workflow name cannot be empty or whitespace only
680
- new Workflow(' '); // Error: Workflow name cannot be empty or whitespace only
681
- new Workflow('a'.repeat(101)); // Error: Workflow name cannot exceed 100 characters
682
- ```
683
-
684
- #### Test Coverage
685
-
686
- - **Test file**: [src/__tests__/unit/workflow.test.ts](src/__tests__/unit/workflow.test.ts)
687
- - **Coverage**: Name validation edge cases
688
-
689
- ---
690
-
691
- ### 4. isDescendantOf Public API
692
-
693
- **Issue**: The `isDescendantOf()` helper method was private, but it's a useful utility for checking workflow hierarchy relationships. Making it public enables users to validate workflow topology.
694
-
695
- **Severity**: **Minor** - API enhancement, additive change.
696
-
697
- **Impact**:
698
- - Users can now check workflow hierarchy relationships
699
- - Enables validation before attaching to prevent circular references
700
- - Useful for conditional logic based on hierarchy position
701
-
702
- **Location**: [src/core/workflow.ts:201-219](src/core/workflow.ts#L201-L219)
703
-
704
- #### Implementation
705
-
706
- ```typescript
707
- /**
708
- * Check if this workflow is a descendant of the given ancestor workflow.
709
- *
710
- * Traverses the parent chain upward looking for the ancestor reference.
711
- * Uses a visited Set to detect cycles during traversal. This method provides
712
- * a convenient way to check workflow hierarchy relationships without manually
713
- * traversing the parent chain.
714
- *
715
- * @warning This method reveals workflow hierarchy information. If your
716
- * application exposes workflows via an API, ensure you implement proper
717
- * access control to prevent unauthorized topology discovery. Note that
718
- * the `parent` and `children` properties are already public, so this
719
- * method does not expose any new information beyond what is currently
720
- * accessible.
721
- *
722
- * **Time Complexity**: O(d) where d is the depth of the hierarchy
723
- * **Space Complexity**: O(d) for the visited Set in worst case (cycle detection)
724
- *
725
- * @example Check if a workflow belongs to a specific hierarchy
726
- * ```typescript
727
- * const root = new Workflow('root');
728
- * const child = new Workflow('child', { parent: root });
729
- *
730
- * if (child.isDescendantOf(root)) {
731
- * console.log('Child is in root hierarchy');
732
- * }
733
- * ```
734
- *
735
- * @example Validate before attaching to prevent circular references
736
- * ```typescript
737
- * if (!newChild.isDescendantOf(parent)) {
738
- * parent.attachChild(newChild);
739
- * } else {
740
- * throw new Error('Would create circular reference');
741
- * }
742
- * ```
743
- *
744
- * @example Check for ancestor relationship in conditional logic
745
- * ```typescript
746
- * const isInProductionBranch = workflow.isDescendantOf(productionRoot);
747
- * if (isInProductionBranch) {
748
- * // Apply production-specific logic
749
- * }
750
- * ```
751
- *
752
- * @param ancestor - The potential ancestor workflow to check
753
- * @returns true if ancestor is found in parent chain, false otherwise
754
- * @throws {Error} If a cycle is detected during traversal (indicates corrupted tree structure)
755
- */
756
- public isDescendantOf(ancestor: Workflow): boolean {
757
- const visited = new Set<Workflow>();
758
- let current: Workflow | null = this.parent;
759
-
760
- while (current !== null) {
761
- if (visited.has(current)) {
762
- throw new Error('Circular parent-child relationship detected');
763
- }
764
- visited.add(current);
765
-
766
- if (current === ancestor) {
767
- return true;
768
- }
769
-
770
- current = current.parent;
771
- }
772
-
773
- return false;
774
- }
775
- ```
776
-
777
- **Features**:
778
- - Cycle detection during traversal
779
- - Comprehensive JSDoc with security warning
780
- - Multiple usage examples
781
- - Time/space complexity documentation
782
-
783
- #### Migration Steps
784
-
785
- 1. **No migration required** - Additive public API
786
- 2. Use for hierarchy validation:
787
-
788
- ```typescript
789
- // Prevent circular references
790
- if (!child.isDescendantOf(parent)) {
791
- parent.attachChild(child);
792
- }
793
-
794
- // Conditional logic based on hierarchy
795
- if (workflow.isDescendantOf(productionRoot)) {
796
- // Production-specific handling
797
- }
798
- ```
799
-
800
- #### Test Coverage
801
-
802
- - **Test file**: [src/__tests__/unit/workflow-isDescendantOf.test.ts](src/__tests__/unit/workflow-isDescendantOf.test.ts)
803
- - **Coverage**:
804
- - Direct parent relationship
805
- - Deep ancestor relationship
806
- - Non-ancestor relationship
807
- - Circular reference detection
808
- - Edge cases
809
-
810
- ---
811
-
812
- ## Breaking Changes & Migration
813
-
814
- ### Summary
815
-
816
- **Breaking Changes**: None
817
-
818
- All bug fixes in this release are backward compatible. The fixes either:
819
- 1. Correct PRD violations (old behavior was "buggy" per specification)
820
- 2. Add new features that are opt-in
821
- 3. Improve performance transparently
822
-
823
- ### Important Notes
824
-
825
- 1. **WorkflowLogger.child()**: The old `child(parentLogId: string)` API continues to work. The new `child(meta: Partial<LogEntry>)` is additive.
826
-
827
- 2. **Promise.allSettled**: The change from `Promise.all()` to `Promise.allSettled()` maintains the same observable behavior for most use cases.
828
-
829
- 3. **ErrorMergeStrategy**: This is an opt-in feature. Default behavior (throw first error) is unchanged.
830
-
831
- 4. **Workflow name validation**: This may throw for existing code with invalid names, but such names were already problematic.
832
-
833
- ---
834
-
835
- ## Testing & Validation
836
-
837
- ### Test Coverage Summary
838
-
839
- #### New Test Files (12 files)
840
-
841
- | Test File | Coverage | Lines |
842
- |-----------|----------|-------|
843
- | [src/__tests__/unit/logger.test.ts](src/__tests__/unit/logger.test.ts) | WorkflowLogger.child() signature fix | 294 |
844
- | [src/__tests__/adversarial/concurrent-task-failures.test.ts](src/__tests__/adversarial/concurrent-task-failures.test.ts) | Promise.allSettled concurrent failures | - |
845
- | [src/__tests__/adversarial/error-merge-strategy.test.ts](src/__tests__/adversarial/error-merge-strategy.test.ts) | ErrorMergeStrategy functionality | - |
846
- | [src/__tests__/unit/tree-debugger-incremental.test.ts](src/__tests__/unit/tree-debugger-incremental.test.ts) | Incremental node map updates | - |
847
- | [src/__tests__/adversarial/node-map-update-benchmarks.test.ts](src/__tests__/adversarial/node-map-update-benchmarks.test.ts) | Performance benchmarks | - |
848
- | [src/__tests__/integration/observer-logging.test.ts](src/__tests__/integration/observer-logging.test.ts) | Observer logger replacement | - |
849
- | [src/__tests__/unit/workflow.test.ts](src/__tests__/unit/workflow.test.ts) | Workflow name validation | - |
850
- | [src/__tests__/unit/workflow-isDescendantOf.test.ts](src/__tests__/unit/workflow-isDescendantOf.test.ts) | Public isDescendantOf API | - |
851
- | [src/__tests__/adversarial/parent-validation.test.ts](src/__tests__/adversarial/parent-validation.test.ts) | Parent validation | - |
852
- | [src/__tests__/adversarial/circular-reference.test.ts](src/__tests__/adversarial/circular-reference.test.ts) | Circular reference detection | - |
853
- | [src/__tests__/adversarial/complex-circular-reference.test.ts](src/__tests__/adversarial/complex-circular-reference.test.ts) | Deep circular reference scenarios | - |
854
- | [src/__tests__/integration/workflow-reparenting.test.ts](src/__tests__/integration/workflow-reparenting.test.ts) | Reparenting workflow tests | - |
855
-
856
- ### Validation Commands
857
-
858
- Run the following commands to verify all bug fixes:
859
-
860
- ```bash
861
- # Run all tests
862
- npm test
863
-
864
- # Run specific test suites
865
- npm test -- logger.test.ts
866
- npm test -- concurrent-task-failures.test.ts
867
- npm test -- error-merge-strategy.test.ts
868
- npm test -- tree-debugger-incremental.test.ts
869
-
870
- # Run with coverage
871
- npm test -- --coverage
872
-
873
- # Run linter
874
- npm run lint
875
- ```
876
-
877
- ### Expected Results
878
-
879
- - All tests pass: **PASS**
880
- - Test coverage: **100%** for fixed code paths
881
- - Linter: **No errors**
882
- - Type check: **No errors**
883
-
884
- ---
885
-
886
- ## Severity Classification Reference
887
-
888
- ### Decision Tree
889
-
890
- ```
891
- Is it a PRD violation?
892
- ├─ Yes → CRITICAL
893
- └─ No
894
- └─ Does it break core functionality?
895
- ├─ Yes → MAJOR
896
- └─ No
897
- └─ Is there an easy workaround?
898
- ├─ Yes → MINOR
899
- └─ No → MAJOR
900
- ```
901
-
902
- ### Definitions
903
-
904
- | Severity | Definition | Examples |
905
- |----------|-----------|----------|
906
- | **Critical** | PRD compliance violations, security issues, data loss | Wrong method signatures, missing required features |
907
- | **Major** | Core functionality broken, missing features, significant reliability issues | Missing error aggregation, concurrent execution failures |
908
- | **Minor** | Small issues, easy workarounds, doesn't impact core features | Logging consistency, performance optimizations, API enhancements |
909
-
910
- ---
911
-
912
- ## References
913
-
914
- ### Project Documentation
915
-
916
- - **[PRD.md](PRD.md)** - Product Requirements Document (source of truth for specifications)
917
- - [Section 12.1: WorkflowLogger.child() specification](PRD.md#L303)
918
- - [Section 10: Error Merge Strategy](PRD.md#L246-L254)
919
- - [Section 8.1: @Step decorator with trackTiming](PRD.md#L183)
920
-
921
- - **[CHANGELOG.md](CHANGELOG.md)** - Project changelog with formatting patterns
922
-
923
- ### Implementation Files
924
-
925
- #### Critical Fixes
926
- - [src/core/logger.ts:98-111](src/core/logger.ts#L98-L111) - WorkflowLogger.child() signature fix
927
-
928
- #### Major Fixes
929
- - [src/decorators/task.ts:112-142](src/decorators/task.ts#L112-L142) - Promise.allSettled implementation
930
- - [src/types/decorators.ts:25-32](src/types/decorators.ts#L25-L32) - TaskOptions with errorMergeStrategy
931
- - [src/utils/workflow-error-utils.ts:23-56](src/utils/workflow-error-utils.ts#L23-L56) - mergeWorkflowErrors implementation
932
- - [src/decorators/step.ts:94-101](src/decorators/step.ts#L94-L101) - trackTiming default behavior
933
-
934
- #### Minor Fixes
935
- - [src/core/workflow.ts:426, 444](src/core/workflow.ts#L426) - Observer logging with logger
936
- - [src/core/workflow.ts:98-107](src/core/workflow.ts#L98-L107) - Workflow name validation
937
- - [src/core/workflow.ts:201-219](src/core/workflow.ts#L201-L219) - Public isDescendantOf API
938
- - [src/debugger/tree-debugger.ts:65-84, 92-117](src/debugger/tree-debugger.ts#L65-L84) - Tree debugger optimization
939
-
940
- ### Test Files
941
-
942
- - [src/__tests__/unit/logger.test.ts](src/__tests__/unit/logger.test.ts) - WorkflowLogger child() tests (294 lines)
943
- - [src/__tests__/adversarial/concurrent-task-failures.test.ts](src/__tests__/adversarial/concurrent-task-failures.test.ts) - Concurrent failure tests
944
- - [src/__tests__/adversarial/error-merge-strategy.test.ts](src/__tests__/adversarial/error-merge-strategy.test.ts) - Error merge strategy tests
945
- - [src/__tests__/unit/tree-debugger-incremental.test.ts](src/__tests__/unit/tree-debugger-incremental.test.ts) - Incremental update tests
946
- - [src/__tests__/adversarial/node-map-update-benchmarks.test.ts](src/__tests__/adversarial/node-map-update-benchmarks.test.ts) - Performance benchmarks
947
- - [src/__tests__/integration/observer-logging.test.ts](src/__tests__/integration/observer-logging.test.ts) - Observer logging tests
948
- - [src/__tests__/unit/workflow.test.ts](src/__tests__/unit/workflow.test.ts) - Workflow validation tests
949
- - [src/__tests__/unit/workflow-isDescendantOf.test.ts](src/__tests__/unit/workflow-isDescendantOf.test.ts) - isDescendantOf API tests
950
-
951
- ### External References
952
-
953
- - [Keep a Changelog - Format](https://keepachangelog.com/en/1.1.0/) - Industry standard changelog format
954
- - [Keep a Changelog - Example](https://keepachangelog.com/en/1.1.0/#example) - Example showing proper formatting
955
- - [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html) - Versioning specification (bug fixes = PATCH version)
956
-
957
- ---
958
-
959
- **Document Version**: 1.0
960
- **Last Updated**: 2026-01-12
961
- **Status**: Complete