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,741 +0,0 @@
1
- # Promise.all Implementation Analysis for @Task Decorator
2
-
3
- **Document Version:** 1.0
4
- **Analysis Date:** 2026-01-12
5
- **Target Implementation Task:** P1.M2.T1.S2 (Promise.allSettled Migration)
6
- **Primary File:** `src/decorators/task.ts` (lines 104-114)
7
-
8
- ---
9
-
10
- ## 1. Current Implementation Overview
11
-
12
- ### 1.1 Promise.all Execution Code
13
-
14
- **Location:** `src/decorators/task.ts:104-114`
15
-
16
- ```typescript
17
- // If concurrent option is set and we have multiple workflows, run them in parallel
18
- if (opts.concurrent && Array.isArray(result)) {
19
- const runnable = workflows.filter(
20
- (w): w is WorkflowClass =>
21
- w && typeof w === 'object' && 'run' in w && typeof w.run === 'function'
22
- );
23
-
24
- if (runnable.length > 0) {
25
- await Promise.all(runnable.map((w) => w.run())); // ← CRITICAL: Line 112
26
- }
27
- }
28
- ```
29
-
30
- ### 1.2 Context: Full @Task Decorator Structure
31
-
32
- **Location:** `src/decorators/task.ts:1-129`
33
-
34
- The @Task decorator performs three main operations:
35
-
36
- 1. **Child Attachment** (lines 91-102): Attaches returned workflows as children
37
- 2. **Concurrent Execution** (lines 104-114): Runs workflows in parallel when `concurrent: true`
38
- 3. **Event Emission** (lines 79-83, 117-121): Emits taskStart/taskEnd events
39
-
40
- **CRITICAL:** Child attachment happens BEFORE concurrent execution, establishing parent-child relationships regardless of execution success.
41
-
42
- ### 1.3 Local Type Definitions
43
-
44
- **Location:** `src/decorators/task.ts:4-16`
45
-
46
- ```typescript
47
- // Type for workflow-like objects
48
- interface WorkflowLike {
49
- id: string;
50
- node: WorkflowNode;
51
- emitEvent(event: WorkflowEvent): void;
52
- attachChild(child: WorkflowLike): void;
53
- }
54
-
55
- // Minimal Workflow type for checking if something is a workflow
56
- interface WorkflowClass {
57
- id: string;
58
- parent: WorkflowLike | null;
59
- run(...args: unknown[]): Promise<unknown>;
60
- }
61
- ```
62
-
63
- **NOTE:** These are local to the task.ts file - not exported from the types module.
64
-
65
- ---
66
-
67
- ## 2. Runnable Workflow Filtering Logic
68
-
69
- ### 2.1 Type Guard Implementation
70
-
71
- **Location:** `src/decorators/task.ts:106-109`
72
-
73
- ```typescript
74
- const runnable = workflows.filter(
75
- (w): w is WorkflowClass =>
76
- w && typeof w === 'object' && 'run' in w && typeof w.run === 'function'
77
- );
78
- ```
79
-
80
- ### 2.2 Type Predicate Explanation
81
-
82
- The `(w): w is WorkflowClass` syntax is a **TypeScript Type Predicate** (Type Guard):
83
-
84
- | Check | Purpose |
85
- |-------|---------|
86
- | `w` | Truthiness check - filters out null/undefined |
87
- | `typeof w === 'object'` | Ensures w is an object (not string, number, etc.) |
88
- | `'run' in w` | Checks if 'run' property exists on object |
89
- | `typeof w.run === 'function'` | Verifies run is callable |
90
-
91
- ### 2.3 What Gets Included/Excluded
92
-
93
- **Included in runnable:**
94
- - Workflow instances (with `run()` method)
95
- - Plain objects with a `run()` method (duck typing)
96
- - Workflow-like objects satisfying the type guard
97
-
98
- **Excluded from runnable:**
99
- - `null` and `undefined`
100
- - Primitive values (strings, numbers, booleans)
101
- - Objects without a `run()` method
102
- - Objects with `run` property that isn't a function
103
-
104
- ### 2.4 Critical Gotchas
105
-
106
- **Gotcha #1: No duplicate prevention**
107
- - The filter does NOT check if a workflow is already running
108
- - Same workflow instance could theoretically be executed twice
109
- - Relies on user code to not return duplicates
110
-
111
- **Gotcha #2: No running state check**
112
- - Does NOT verify workflow's current execution status
113
- - Would attempt to run an already-running workflow if present
114
- - No safeguard against race conditions in user code
115
-
116
- **Gotcha #3: Non-workflow return values silently skipped**
117
- - Worksflows are filtered out without warning
118
- - Original return value is preserved (line 123)
119
- - Lenient validation allows flexible signatures
120
-
121
- ---
122
-
123
- ## 3. Error Propagation Flow (Step-by-Step)
124
-
125
- ### 3.1 Complete Error Flow Diagram
126
-
127
- ```
128
- ┌─────────────────────────────────────────────────────────────────────────────┐
129
- │ ERROR PROPAGATION FLOW │
130
- ├─────────────────────────────────────────────────────────────────────────────┤
131
- │ │
132
- │ 1. @Step Method Throws Error │
133
- │ ↓ │
134
- │ Location: Any @Step decorated method │
135
- │ Action: Method throws Error or rejects Promise │
136
- │ │
137
- │ 2. @Step Decorator Catch Block │
138
- │ ↓ │
139
- │ Location: src/decorators/step.ts:109-134 │
140
- │ Action: │
141
- │ - Captures error state via getObservedState(this) │
142
- │ - Creates WorkflowError object with full context: │
143
- │ * message: error?.message ?? 'Unknown error' │
144
- │ * original: err (preserves original thrown error) │
145
- │ * workflowId: wf.id │
146
- │ * stack: error?.stack │
147
- │ * state: snap (observed state snapshot) │
148
- │ * logs: [...wf.node.logs] (copies current logs) │
149
- │ - Emits error event: { type: 'error', node: wf.node, error: ... } │
150
- │ - Re-throws WorkflowError │
151
- │ │
152
- │ 3. Workflow.run() Method │
153
- │ ↓ │
154
- │ Location: src/core/workflow.ts │
155
- │ Action: Error propagates naturally through call stack │
156
- │ NOTE: No automatic catching in run() - error passes through │
157
- │ │
158
- │ 4. Promise.all in @Task Decorator │
159
- │ ↓ │
160
- │ Location: src/decorators/task.ts:112 │
161
- │ Action: │
162
- │ - await Promise.all(runnable.map((w) => w.run())) │
163
- │ - FIRST ERROR WINS - immediately rejects on first rejection │
164
- │ - Other in-flight promises continue but results are LOST │
165
- │ - Parent workflow only receives FIRST error │
166
- │ │
167
- │ 5. Workflow.runFunctional() Error Handler │
168
- │ ↓ │
169
- │ Location: src/core/workflow.ts:470-488 │
170
- │ Action: │
171
- │ - Catches error in functional workflow executor │
172
- │ - Sets status to 'failed' │
173
- │ - Emits error event with WorkflowError context │
174
- │ - Re-throws original error │
175
- │ │
176
- │ 6. Parent Workflow or Root Handler │
177
- │ ↓ │
178
- │ Action: │
179
- │ - Parent may catch for custom handling │
180
- │ - Otherwise propagates to root │
181
- │ - Application-level error handling takes over │
182
- │ │
183
- └─────────────────────────────────────────────────────────────────────────────┘
184
- ```
185
-
186
- ### 3.2 WorkflowError Interface Structure
187
-
188
- **Location:** `src/types/error.ts:7-20`
189
-
190
- ```typescript
191
- export interface WorkflowError {
192
- message: string; // Error message from thrown error
193
- original: unknown; // Original thrown error (preserved)
194
- workflowId: string; // ID of workflow where error occurred
195
- stack?: string; // Stack trace if available
196
- state: SerializedWorkflowState; // State snapshot at error time
197
- logs: LogEntry[]; // Logs from the failing workflow node
198
- }
199
- ```
200
-
201
- **Key Characteristic:** Interface-based (not a class), allowing flexible error object creation while ensuring complete context capture.
202
-
203
- ### 3.3 Error Context Capture Points
204
-
205
- | Context | Where Captured | How |
206
- |---------|----------------|-----|
207
- | Error message | step.ts:117 | `error?.message ?? 'Unknown error'` |
208
- | Original error | step.ts:118 | Preserved as `original: err` |
209
- | Workflow ID | step.ts:119 | `wf.id` from workflow instance |
210
- | Stack trace | step.ts:120 | `error?.stack` if Error instance |
211
- | State snapshot | step.ts:114, 121 | `getObservedState(this as object)` |
212
- | Logs | step.ts:122 | `[...wf.node.logs]` (copied) |
213
-
214
- ---
215
-
216
- ## 4. Concurrent Failure Behavior Analysis
217
-
218
- ### 4.1 What Happens When ONE Concurrent Workflow Fails
219
-
220
- **Scenario:** Two concurrent workflows, one fails
221
-
222
- ```typescript
223
- class GoodChild extends Workflow {
224
- async run() {
225
- return 'good'; // Succeeds
226
- }
227
- }
228
-
229
- class BadChild extends Workflow {
230
- @Step()
231
- async run() {
232
- throw new Error('Bad child error'); // Fails
233
- }
234
- }
235
-
236
- class ParentWorkflow extends Workflow {
237
- @Task({ concurrent: true })
238
- async spawnMixed() {
239
- return [
240
- new GoodChild('Good', this),
241
- new BadChild('Bad', this),
242
- ];
243
- }
244
- }
245
- ```
246
-
247
- **Execution Timeline:**
248
-
249
- ```
250
- Time T0: Promise.all([
251
- run(GoodChild) → Promise<pending>,
252
- run(BadChild) → Promise<pending>
253
- ])
254
-
255
- Time T1: BadChild @Step throws error
256
- → Wrapped as WorkflowError
257
- → Promise.all REJECTS IMMEDIATELY
258
- → GoodChild result LOST
259
-
260
- Time T2: Parent receives WorkflowError from BadChild
261
- → No knowledge of GoodChild result
262
- → No knowledge that GoodChild succeeded
263
- ```
264
-
265
- ### 4.2 What Happens to OTHER Concurrent Workflows
266
-
267
- **CRITICAL BEHAVIOR:** When one workflow fails:
268
-
269
- 1. **Promise.all rejects immediately** - No waiting for other promises
270
- 2. **In-flight workflows continue executing** - They're not cancelled
271
- 3. **Results from other workflows are LOST** - Never captured
272
- 4. **Parent only sees first error** - No error aggregation
273
-
274
- ### 4.3 Can Parent See ALL Errors?
275
-
276
- **Answer:** NO - Parent only sees the FIRST error that causes Promise.all to reject.
277
-
278
- **Evidence from test code:**
279
-
280
- **Location:** `src/__tests__/adversarial/edge-case.test.ts:366-403`
281
-
282
- ```typescript
283
- it('should handle concurrent task execution with errors', async () => {
284
- // Test shows mixed success/failure in concurrent execution
285
- // Both children are attached (line 402: expect(workflow.children.length).toBe(2))
286
- // But error handling only catches first error
287
- });
288
- ```
289
-
290
- ### 4.4 Current Error Semantics
291
-
292
- | Aspect | Behavior |
293
- |--------|----------|
294
- | Fail-fast | YES - Immediate rejection on first error |
295
- | Error aggregation | NO - Only first error visible |
296
- | Partial results | NO - Success results are lost |
297
- | Error context | FULL - WorkflowError captures complete context |
298
- | Race condition preservation | YES - Whichever error arrives first wins |
299
-
300
- ---
301
-
302
- ## 5. Promise.allSettled Migration Requirements
303
-
304
- ### 5.1 Core Code Changes Required
305
-
306
- #### Change 1: Replace Promise.all with Promise.allSettled
307
-
308
- **Current (src/decorators/task.ts:112):**
309
- ```typescript
310
- await Promise.all(runnable.map((w) => w.run()));
311
- ```
312
-
313
- **Required:**
314
- ```typescript
315
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
316
- ```
317
-
318
- #### Change 2: Add Error Strategy Configuration
319
-
320
- **Location:** `src/types/decorators.ts` (TaskOptions interface)
321
-
322
- **Current:**
323
- ```typescript
324
- export interface TaskOptions {
325
- name?: string;
326
- concurrent?: boolean;
327
- }
328
- ```
329
-
330
- **Required:**
331
- ```typescript
332
- export interface TaskOptions {
333
- name?: string;
334
- concurrent?: boolean;
335
- errorStrategy?: 'fail-fast' | 'complete-all'; // NEW
336
- }
337
- ```
338
-
339
- **ALTERNATIVE:** Use existing ErrorMergeStrategy interface
340
-
341
- ```typescript
342
- export interface TaskOptions {
343
- name?: string;
344
- concurrent?: boolean;
345
- errorMergeStrategy?: ErrorMergeStrategy; // Use existing type
346
- }
347
- ```
348
-
349
- ### 5.2 Type Guard Requirements
350
-
351
- **Need to create:** Type guards for PromiseSettledResult
352
-
353
- **Location:** `src/utils/promise-utils.ts` (NEW FILE)
354
-
355
- ```typescript
356
- import type { WorkflowError } from '../types/error.js';
357
-
358
- // Type guard for fulfilled results
359
- export function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
360
- return result.status === 'fulfilled';
361
- }
362
-
363
- // Type guard for rejected results
364
- export function isRejected(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult {
365
- return result.status === 'rejected';
366
- }
367
-
368
- // Check if result is WorkflowError
369
- export function isWorkflowError(error: unknown): error is WorkflowError {
370
- return (
371
- typeof error === 'object' &&
372
- error !== null &&
373
- 'message' in error &&
374
- 'workflowId' in error &&
375
- 'state' in error &&
376
- 'logs' in error
377
- );
378
- }
379
- ```
380
-
381
- ### 5.3 Error Aggregation Pattern Requirements
382
-
383
- **Required:** Logic to collect and process errors from Promise.allSettled results
384
-
385
- ```typescript
386
- // After Promise.allSettled, separate successes and failures
387
- const errors = results
388
- .filter((r): r is PromiseRejectedResult => r.status === 'rejected')
389
- .map((r) => r.reason as WorkflowError);
390
-
391
- // If there are errors and we're in complete-all mode
392
- if (errors.length > 0 && opts.errorStrategy === 'complete-all') {
393
- // Aggregate errors
394
- const mergedError: WorkflowError = {
395
- message: `${errors.length} concurrent workflows failed`,
396
- original: errors.map(e => e.original),
397
- workflowId: wf.id,
398
- stack: errors.map(e => e.stack).filter(Boolean).join('\n---\n'),
399
- state: getObservedState(this),
400
- logs: errors.flatMap(e => e.logs),
401
- };
402
-
403
- // Emit aggregated error
404
- wf.emitEvent({
405
- type: 'error',
406
- node: wf.node,
407
- error: mergedError,
408
- });
409
-
410
- throw mergedError;
411
- }
412
-
413
- // Otherwise, if fail-fast mode, throw first error
414
- if (errors.length > 0) {
415
- throw errors[0];
416
- }
417
- ```
418
-
419
- ### 5.4 Backward Compatibility Requirements
420
-
421
- **CRITICAL:** Must preserve existing behavior when `errorStrategy` is not specified:
422
-
423
- | Configuration | Behavior |
424
- |---------------|----------|
425
- | No errorStrategy | Fail-fast (current Promise.all behavior) |
426
- | errorStrategy: 'fail-fast' | Fail-fast (Promise.all semantics) |
427
- | errorStrategy: 'complete-all' | Wait for all, aggregate errors |
428
-
429
- **Implementation approach:**
430
- ```typescript
431
- if (opts.concurrent && Array.isArray(result)) {
432
- const runnable = workflows.filter(/* ... */);
433
-
434
- if (runnable.length > 0) {
435
- if (opts.errorStrategy === 'complete-all') {
436
- // New behavior: Promise.allSettled with error aggregation
437
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
438
- // ... error aggregation logic
439
- } else {
440
- // Default: maintain current Promise.all behavior
441
- await Promise.all(runnable.map((w) => w.run()));
442
- }
443
- }
444
- }
445
- ```
446
-
447
- ### 5.5 Integration with Existing ErrorMergeStrategy
448
-
449
- **Location:** `src/types/error-strategy.ts`
450
-
451
- **Current State:** Interface exists but is completely unused
452
-
453
- ```typescript
454
- export interface ErrorMergeStrategy {
455
- enabled: boolean;
456
- maxMergeDepth?: number;
457
- combine?(errors: WorkflowError[]): WorkflowError;
458
- }
459
- ```
460
-
461
- **Migration Decision Point:**
462
-
463
- **Option A:** Create new `errorStrategy?: 'fail-fast' | 'complete-all'` option
464
- - Pro: Simpler, more explicit
465
- - Pro: Easier to understand for users
466
- - Con: Doesn't leverage existing ErrorMergeStrategy interface
467
-
468
- **Option B:** Add `errorMergeStrategy?: ErrorMergeStrategy` to TaskOptions
469
- - Pro: Leverages existing design intent
470
- - Pro: Supports custom combine() functions
471
- - Pro: More flexible for advanced use cases
472
- - Con: More complex configuration
473
-
474
- **RECOMMENDATION for P1.M2.T1.S2:** Use Option A initially, can add Option B as enhancement
475
-
476
- ### 5.6 File Structure Changes
477
-
478
- **New File to Create:**
479
- ```
480
- src/utils/promise-utils.ts
481
- ```
482
-
483
- **Files to Modify:**
484
- 1. `src/types/decorators.ts` - Add errorStrategy option
485
- 2. `src/decorators/task.ts` - Implement Promise.allSettled logic
486
- 3. `src/utils/index.ts` - Export new promise utilities (if created)
487
-
488
- ---
489
-
490
- ## 6. Edge Cases and Gotchas
491
-
492
- ### 6.1 Promise.allSettled Gotchas
493
-
494
- #### Gotcha #1: Promise.allSettled Never Rejects
495
-
496
- **CRITICAL:** Unlike Promise.all, Promise.allSettled ALWAYS resolves
497
-
498
- ```typescript
499
- // This NEVER throws
500
- const results = await Promise.allSettled([runnable1, runnable2]);
501
-
502
- // You MUST check for errors manually
503
- const errors = results.filter(r => r.status === 'rejected');
504
- if (errors.length > 0) {
505
- throw errors[0].reason; // Manual error propagation
506
- }
507
- ```
508
-
509
- #### Gotcha #2: Type Narrowing Required
510
-
511
- **Without type guards, TypeScript doesn't know result types:**
512
-
513
- ```typescript
514
- // ❌ BAD: Type error
515
- results.forEach(r => {
516
- if (r.status === 'fulfilled') {
517
- console.log(r.value); // Error: Property 'value' does not exist
518
- }
519
- });
520
-
521
- // ✅ GOOD: With type guard
522
- const isFulfilled = <T>(r: PromiseSettledResult<T>): r is PromiseFulfilledResult<T> =>
523
- r.status === 'fulfilled';
524
-
525
- results.forEach(r => {
526
- if (isFulfilled(r)) {
527
- console.log(r.value); // OK: Type narrowed
528
- }
529
- });
530
- ```
531
-
532
- #### Gotcha #3: Order is Preserved But Results Aren't
533
-
534
- **Promise.allSettled preserves array order, but workflow completion order is non-deterministic:**
535
-
536
- ```typescript
537
- const workflows = [wf1, wf2, wf3];
538
- const results = await Promise.allSettled(workflows.map(w => w.run()));
539
-
540
- // results[0] always corresponds to wf1
541
- // results[1] always corresponds to wf2
542
- // results[2] always corresponds to wf3
543
-
544
- // But wf2 might complete BEFORE wf1 - order of completion != order of results
545
- ```
546
-
547
- ### 6.2 Child Attachment Gotchas
548
-
549
- #### Gotcha #4: Children Attach BEFORE Execution
550
-
551
- **Location:** `src/decorators/task.ts:91-102`
552
-
553
- **CRITICAL:** Parent-child relationship is established BEFORE concurrent execution:
554
-
555
- ```typescript
556
- // Step 1: Attach children (lines 91-102)
557
- for (const workflow of workflows) {
558
- if (workflow && typeof workflow === 'object' && 'id' in workflow) {
559
- const childWf = workflow as WorkflowClass;
560
- if (!childWf.parent) {
561
- childWf.parent = wf;
562
- wf.attachChild(childWf as unknown as WorkflowLike);
563
- }
564
- }
565
- }
566
-
567
- // Step 2: Run concurrently (lines 104-114)
568
- if (opts.concurrent && Array.isArray(result)) {
569
- // Children already attached at this point
570
- await Promise.all(runnable.map((w) => w.run()));
571
- }
572
- ```
573
-
574
- **Implication:** Failed workflows remain attached to parent even after errors.
575
-
576
- ### 6.3 Runnable Filter Gotchas
577
-
578
- #### Gotcha #5: No Duplicate Prevention
579
-
580
- **The runnable filter does NOT prevent duplicate workflow execution:**
581
-
582
- ```typescript
583
- @Task({ concurrent: true })
584
- async spawnDuplicate() {
585
- const child = new ChildWorkflow('same', this);
586
- return [child, child]; // Same workflow twice
587
- }
588
-
589
- // Result: child.run() is called twice
590
- // Potential: Race conditions, duplicate side effects
591
- ```
592
-
593
- #### Gotcha #6: Non-Workflow Returns Are Silently Skipped
594
-
595
- **Lenient validation allows flexible signatures:**
596
-
597
- ```typescript
598
- @Task()
599
- async mixedReturn() {
600
- return [
601
- new ChildWorkflow('child1', this), // Attached & run
602
- 'some string', // Silently skipped
603
- 42, // Silently skipped
604
- null, // Silently skipped
605
- new ChildWorkflow('child2', this), // Attached & run
606
- ];
607
- }
608
-
609
- // Original return value preserved (line 123)
610
- // Only workflow-like objects are filtered for execution
611
- ```
612
-
613
- ### 6.4 Error Context Gotchas
614
-
615
- #### Gotcha #7: WorkflowError May Contain Non-Error Objects
616
-
617
- **The `original` property is `unknown`, not `Error`:**
618
-
619
- ```typescript
620
- export interface WorkflowError {
621
- original: unknown; // Could be anything thrown
622
- }
623
- ```
624
-
625
- **Implication:** When aggregating errors, don't assume Error interface:
626
-
627
- ```typescript
628
- // ❌ BAD: Assumes Error interface
629
- errors.forEach(e => {
630
- console.log(e.original.stack); // Error if original isn't Error
631
- });
632
-
633
- // ✅ GOOD: Type guard first
634
- if (error.original instanceof Error) {
635
- console.log(error.original.stack);
636
- }
637
- ```
638
-
639
- ### 6.5 Event Emission Gotchas
640
-
641
- #### Gotcha #8: Error Events Emitted Per Workflow
642
-
643
- **Each failing workflow emits its own error event:**
644
-
645
- ```typescript
646
- // In @Step decorator (step.ts:126-130)
647
- wf.emitEvent({
648
- type: 'error',
649
- node: wf.node,
650
- error: workflowError,
651
- });
652
- ```
653
-
654
- **Implication:** With Promise.allSettled, observers see multiple error events for concurrent failures.
655
-
656
- **Migration consideration:** May want to emit aggregated error event after collection.
657
-
658
- ### 6.6 Testing Gotchas
659
-
660
- #### Gotcha #9: Concurrent Execution Order is Non-Deterministic
661
-
662
- **From test file (`src/__tests__/adversarial/prd-compliance.test.ts:421-460`):**
663
-
664
- ```typescript
665
- it('should run workflows concurrently when concurrent: true', async () => {
666
- // Test comment acknowledges non-deterministic order:
667
- // "With concurrent execution, we can't guarantee order, but all should be present"
668
- expect(executionOrder).toContain('Child1');
669
- expect(executionOrder).toContain('Child2');
670
- expect(executionOrder).toContain('Child3');
671
- });
672
- ```
673
-
674
- **Implication:** Tests cannot assume specific execution order with concurrent workflows.
675
-
676
- ---
677
-
678
- ## 7. Cross-References to Existing Research
679
-
680
- ### 7.1 Related Documents
681
-
682
- | Document | Location | Relevance |
683
- |----------|----------|-----------|
684
- | Error Handling Patterns | `plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md` | Documents Promise.all location and ErrorMergeStrategy |
685
- | Promise.allSettled Research | `plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md` | Comprehensive best practices and migration strategies |
686
- | Promise.allSettled Quick Ref | `plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md` | Quick reference for implementation |
687
-
688
- ### 7.2 Related Code Files
689
-
690
- | File | Lines | Purpose |
691
- |------|-------|---------|
692
- | `src/decorators/task.ts` | 104-114 | Promise.all implementation (primary target) |
693
- | `src/decorators/step.ts` | 109-134 | Error wrapping and WorkflowError creation |
694
- | `src/core/workflow.ts` | 470-488 | runFunctional error handling |
695
- | `src/types/error-strategy.ts` | All | ErrorMergeStrategy interface (currently unused) |
696
- | `src/types/error.ts` | All | WorkflowError interface definition |
697
- | `src/types/decorators.ts` | All | TaskOptions interface (needs extension) |
698
-
699
- ### 7.3 Related Test Files
700
-
701
- | File | Lines | Test Coverage |
702
- |------|-------|---------------|
703
- | `src/__tests__/adversarial/edge-case.test.ts` | 366-403 | Concurrent execution with errors |
704
- | `src/__tests__/adversarial/prd-compliance.test.ts` | 421-460 | Concurrent execution order |
705
- | `src/__tests__/adversarial/deep-analysis.test.ts` | 473 | Promise.all in test code |
706
-
707
- ---
708
-
709
- ## 8. Summary for P1.M2.T1.S2 Implementation
710
-
711
- ### 8.1 Key Findings
712
-
713
- 1. **Promise.all fails fast** - Only first error is visible to parent
714
- 2. **Child attachment is separate** - Happens before execution, regardless of success
715
- 3. **Error context is complete** - WorkflowError captures all needed information
716
- 4. **ErrorMergeStrategy exists but unused** - Requires Promise.allSettled to function
717
- 5. **Type guards are required** - PromiseSettledResult needs type narrowing
718
-
719
- ### 8.2 Implementation Checklist for P1.M2.T1.S2
720
-
721
- - [ ] Add `errorStrategy?: 'fail-fast' | 'complete-all'` to TaskOptions
722
- - [ ] Create type guards in `src/utils/promise-utils.ts`
723
- - [ ] Replace Promise.all with conditional Promise.allSettled logic
724
- - [ ] Implement error aggregation for 'complete-all' mode
725
- - [ ] Ensure backward compatibility (default = fail-fast)
726
- - [ ] Add tests for both error strategies
727
- - [ ] Update documentation and examples
728
-
729
- ### 8.3 Critical Success Factors
730
-
731
- 1. **Maintain backward compatibility** - Default behavior must remain unchanged
732
- 2. **Type safety** - Use proper type guards for PromiseSettledResult
733
- 3. **Complete error context** - Aggregate errors must preserve WorkflowError structure
734
- 4. **Clear semantics** - 'fail-fast' vs 'complete-all' should be unambiguous
735
- 5. **Test coverage** - Cover mixed success/failure scenarios
736
-
737
- ---
738
-
739
- **Document Status:** ✅ Complete - Ready for P1.M2.T1.S2 Implementation
740
-
741
- **Next Step:** Proceed to P1.M2.T1.S2 - Implement Promise.allSettled migration with error aggregation