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,696 +0,0 @@
1
- # PRP: P1.M2.T1.S2 - Implement Promise.allSettled with Error Collection
2
-
3
- **Document Version:** 1.0
4
- **Creation Date:** 2026-01-12
5
- **Target:** Subtask P1.M2.T1.S2 - Replace Promise.all with Promise.allSettled in @Task decorator
6
- **Primary File:** `src/decorators/task.ts` (line 112)
7
-
8
- ---
9
-
10
- ## Goal
11
-
12
- **Feature Goal**: Replace `Promise.all()` with `Promise.allSettled()` in the @Task decorator's concurrent execution path (src/decorators/task.ts:112) to enable collection of all concurrent workflow errors while maintaining backward compatibility by throwing the first error when no error merge strategy is configured.
13
-
14
- **Deliverable**: Updated @Task decorator that:
15
- 1. Uses `Promise.allSettled()` instead of `Promise.all()` for concurrent task execution
16
- 2. Collects all `PromiseRejectedResult` errors from concurrent workflows
17
- 3. Maintains backward compatibility by throwing the first error (fail-fast behavior) when no error merge strategy is configured
18
- 4. Preserves all existing event emissions and workflow attachment behaviors
19
-
20
- **Success Definition**:
21
- - Line 112 in `src/decorators/task.ts` uses `Promise.allSettled()` instead of `Promise.all()`
22
- - Errors from all failed concurrent workflows are collected into an array
23
- - Backward compatibility is maintained: first error is thrown by default (no behavior change for existing code)
24
- - All existing tests continue to pass without modification
25
- - The change enables P1.M2.T2 (ErrorMergeStrategy implementation) in future work
26
-
27
- ---
28
-
29
- ## All Needed Context
30
-
31
- ### Context Completeness Check
32
-
33
- **"No Prior Knowledge" Test**: If someone knew nothing about this codebase, would they have everything needed to implement this successfully?
34
-
35
- **Answer**: YES - This PRP provides:
36
- - Exact file location with line number (src/decorators/task.ts:112)
37
- - Complete current implementation code snippet
38
- - Required code changes with before/after comparison
39
- - Type definitions for all interfaces used
40
- - Error handling patterns to follow
41
- - Test patterns for validation
42
- - External research documentation with URLs
43
-
44
- ### Documentation & References
45
-
46
- ```yaml
47
- # MUST READ - Current Implementation
48
- - file: src/decorators/task.ts
49
- lines: 104-114
50
- why: Contains the Promise.all implementation that must be replaced
51
- pattern: Concurrent workflow execution with runnable filtering
52
- gotcha: Promise.all fails fast on first error; Promise.allSettled never rejects
53
-
54
- - file: src/decorators/task.ts
55
- lines: 1-129 (full file)
56
- why: Complete @Task decorator context including child attachment logic
57
- pattern: Task decorator wrapper function with event emission
58
-
59
- - file: plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md
60
- why: S1 analysis document with complete Promise.all implementation details
61
- section: "5. Promise.allSettled Migration Requirements"
62
- critical: Contains exact migration requirements and code changes needed
63
-
64
- - file: plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md
65
- why: Internal guidance on Promise.allSettled usage patterns
66
- section: "Recommended Error Collection Patterns"
67
- critical: Specifies using Promise.allSettled for complete-all error strategy
68
-
69
- # TYPE DEFINITIONS - Required for implementation
70
- - file: src/types/error-strategy.ts
71
- why: Defines ErrorMergeStrategy interface (future use in P1.M2.T2)
72
- pattern: Interface with enabled, maxMergeDepth, and combine() function
73
- note: NOT used in this task - collected errors stored in array for future use
74
-
75
- - file: src/types/decorators.ts
76
- why: Defines TaskOptions interface for @Task decorator configuration
77
- pattern: Options interface with name and concurrent properties
78
-
79
- - file: src/types/error.ts
80
- why: Defines WorkflowError interface structure for error handling
81
- pattern: Interface with message, original, workflowId, stack, state, logs
82
-
83
- - file: src/types/events.ts
84
- why: Defines WorkflowEvent type including error events
85
- pattern: Union type with { type: 'error', node, error }
86
-
87
- # EXTERNAL RESEARCH - Promise.allSettled best practices
88
- - url: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
89
- why: Official documentation for Promise.allSettled() method
90
- section: #description
91
- critical: Promise.allSettled NEVER rejects - always resolves with status array
92
-
93
- - url: https://www.typescriptlang.org/docs/handbook/2/types-from-types.html#promise-types
94
- why: TypeScript Promise types including PromiseSettledResult
95
- section: Promise Types
96
- critical: Type guards required for discriminated unions
97
-
98
- - docfile: plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md
99
- why: Comprehensive Promise.allSettled implementation patterns
100
- section: "2. Promise.allSettled() Error Collection Patterns"
101
- critical: Type guard patterns, error filtering, aggregation examples
102
-
103
- - docfile: plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md
104
- why: Quick reference for Promise.allSettled implementation
105
- section: "Groundswell Implementation"
106
- critical: Specific code examples for this codebase
107
-
108
- # TEST PATTERNS - Follow for validation
109
- - file: src/__tests__/adversarial/edge-case.test.ts
110
- lines: 366-430
111
- why: Contains concurrent task execution tests with mixed success/failure
112
- pattern: Testing concurrent workflows with errors
113
-
114
- - file: src/__tests__/adversarial/prd-compliance.test.ts
115
- lines: 421-460
116
- why: Tests concurrent execution with multiple child workflows
117
- pattern: Execution order tracking for verifying concurrency
118
-
119
- - file: vitest.config.ts
120
- why: Test runner configuration
121
- command: npm test or npm run test:watch
122
-
123
- # STEP DECORATOR - Error wrapping context
124
- - file: src/decorators/step.ts
125
- lines: 109-134
126
- why: Shows how WorkflowError objects are created and error events emitted
127
- pattern: Error capture with getObservedState(), event emission
128
- critical: Each failing workflow already emits error event - don't duplicate
129
- ```
130
-
131
- ### Current Codebase Tree
132
-
133
- ```bash
134
- /home/dustin/projects/groundswell
135
- ├── src/
136
- │ ├── decorators/
137
- │ │ ├── index.ts # Exports Task decorator
138
- │ │ ├── step.ts # @Step decorator with error wrapping (lines 109-134)
139
- │ │ └── task.ts # PRIMARY: Promise.all at line 112 - TARGET FILE
140
- │ ├── types/
141
- │ │ ├── index.ts # Re-exports all types
142
- │ │ ├── decorators.ts # TaskOptions interface
143
- │ │ ├── error-strategy.ts # ErrorMergeStrategy interface (unused in this task)
144
- │ │ ├── error.ts # WorkflowError interface
145
- │ │ └── events.ts # WorkflowEvent union type
146
- │ ├── utils/
147
- │ │ ├── id.ts # ID generation utilities
148
- │ │ ├── index.ts # Exports utils
149
- │ │ └── observable.ts # Observable utilities
150
- │ └── __tests__/
151
- │ ├── adversarial/
152
- │ │ ├── edge-case.test.ts # Concurrent error tests (lines 366-430)
153
- │ │ ├── prd-compliance.test.ts # Concurrent execution tests (lines 421-460)
154
- │ │ └── deep-analysis.test.ts # Promise.all usage in tests
155
- │ └── unit/
156
- │ └── decorators.test.ts # General decorator tests
157
- ├── plan/
158
- │ └── 001_d3bb02af4886/
159
- │ ├── bugfix/
160
- │ │ ├── 001_e8e04329daf3/
161
- │ │ │ ├── P1M2T1S1/
162
- │ │ │ │ └── PRP.md # S1 analysis PRP (completed)
163
- │ │ │ └── P1M2T1S2/
164
- │ │ │ └── PRP.md # THIS FILE
165
- │ │ └── architecture/
166
- │ │ ├── promise_all_analysis.md # S1 analysis output
167
- │ │ ├── concurrent_execution_best_practices.md
168
- │ │ └── error_handling_patterns.md
169
- │ └── docs/
170
- │ └── research/
171
- │ ├── PROMISE_ALLSETTLED_RESEARCH.md
172
- │ └── PROMISE_ALLSETTLED_QUICK_REF.md
173
- └── vitest.config.ts # Test configuration
174
- ```
175
-
176
- ### Desired Codebase Tree (Changes for This Task)
177
-
178
- ```bash
179
- # MODIFIED FILES:
180
- src/decorators/task.ts # Replace Promise.all with Promise.allSettled at line 112
181
-
182
- # NO NEW FILES for this task
183
- # Type utilities will be added in P1.M2.T2.S1 (ErrorMergeStrategy support)
184
- # This task only replaces Promise.all with Promise.allSettled
185
- ```
186
-
187
- ### Known Gotchas of Our Codebase & Library Quirks
188
-
189
- ```typescript
190
- // CRITICAL GOTCHA #1: Promise.allSettled NEVER rejects
191
- // Unlike Promise.all which rejects on first error, Promise.allSettled ALWAYS resolves
192
- // You MUST manually check for errors in the results array
193
- // BAD: try { await Promise.allSettled(...) } catch (e) { /* NEVER EXECUTES */ }
194
- // GOOD: const results = await Promise.allSettled(...);
195
- // const errors = results.filter(r => r.status === 'rejected');
196
- // if (errors.length > 0) throw errors[0].reason;
197
-
198
- // CRITICAL GOTCHA #2: Type guards REQUIRED for TypeScript
199
- // PromiseSettledResult is a discriminated union
200
- // BAD: results.forEach(r => { if (r.status === 'fulfilled') console.log(r.value); });
201
- // TypeScript error: Property 'value' does not exist on type 'PromiseSettledResult<unknown>'
202
- // GOOD: const isFulfilled = <T>(r: PromiseSettledResult<T>): r is PromiseFulfilledResult<T> =>
203
- // r.status === 'fulfilled';
204
- // results.filter(isFulfilled).forEach(r => console.log(r.value));
205
-
206
- // CRITICAL GOTCHA #3: Child attachment happens BEFORE concurrent execution
207
- // Lines 91-102: children are attached before Promise.allSettled runs
208
- // Parent-child relationships exist regardless of execution success
209
- // Failed workflows remain attached to parent
210
-
211
- // CRITICAL GOTCHA #4: Error events already emitted by @Step decorator
212
- // src/decorators/step.ts:126-130 emits error events for each failed workflow
213
- // DO NOT emit additional error events in @Task decorator
214
- // Observers already see individual workflow errors
215
-
216
- // CRITICAL GOTCHA #5: WorkflowError.original is `unknown`, not `Error`
217
- // When collecting errors, don't assume Error interface
218
- // BAD: errors.forEach(e => console.log(e.original.stack));
219
- // GOOD: if (error.original instanceof Error) console.log(error.original.stack);
220
-
221
- // CRITICAL GOTCHA #6: Backward compatibility REQUIRED
222
- // Default behavior must remain fail-fast (throw first error)
223
- // Only collect errors for future P1.M2.T2 (ErrorMergeStrategy) use
224
- // DO NOT change behavior of existing code
225
-
226
- // CRITICAL GOTCHA #7: Runnable filter uses type guard pattern
227
- // The filter (w): w is WorkflowClass narrows type in filter callback
228
- // After filtering, runnable items have run() method guaranteed
229
-
230
- // CRITICAL GOTCHA #8: No duplicate prevention in runnable filter
231
- // Same workflow instance could appear twice if returned twice
232
- // Not our concern - user code responsibility
233
- ```
234
-
235
- ---
236
-
237
- ## Implementation Blueprint
238
-
239
- ### Data Models and Structure
240
-
241
- **No new data models for this task** - this task only replaces Promise.all with Promise.allSettled.
242
-
243
- **Type guards needed (inline in task.ts for now, extracted to utils in P1.M2.T2.S1):**
244
-
245
- ```typescript
246
- // Type guard for PromiseRejectedResult
247
- const isRejected = (result: PromiseSettledResult<unknown>): result is PromiseRejectedResult =>
248
- result.status === 'rejected';
249
- ```
250
-
251
- **Note:** Full utility file `src/utils/promise-utils.ts` will be created in P1.M2.T2.S1 when implementing ErrorMergeStrategy support.
252
-
253
- ### Implementation Tasks (ordered by dependencies)
254
-
255
- ```yaml
256
- Task 1: MODIFY src/decorators/task.ts - Import type for Promise.allSettled
257
- - ADD: No new imports needed - Promise.allSettled is built-in
258
- - UNDERSTAND: PromiseSettledResult<T>, PromiseFulfilledResult<T>, PromiseRejectedResult are global types
259
- - DEPENDENCIES: None
260
-
261
- Task 2: MODIFY src/decorators/task.ts - Replace Promise.all with Promise.allSettled (lines 111-113)
262
- - CURRENT CODE:
263
- await Promise.all(runnable.map((w) => w.run()));
264
-
265
- - REPLACE WITH:
266
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
267
-
268
- - DEPENDENCIES: Task 1
269
-
270
- Task 3: MODIFY src/decorators/task.ts - Add error collection after Promise.allSettled (after line 112)
271
- - ADD: Filter for rejected results
272
- - ADD: Extract error reasons from rejected promises
273
- - ADD: Throw first error for backward compatibility
274
-
275
- - IMPLEMENTATION:
276
- // Filter for rejected results
277
- const rejected = results.filter(
278
- (r): r is PromiseRejectedResult => r.status === 'rejected'
279
- );
280
-
281
- // Throw first error for backward compatibility (fail-fast behavior)
282
- if (rejected.length > 0) {
283
- throw rejected[0].reason;
284
- }
285
-
286
- - DEPENDENCIES: Task 2
287
-
288
- Task 4: VERIFY existing tests still pass
289
- - RUN: npm test
290
- - VERIFY: All existing tests pass without modification
291
- - VERIFY: Backward compatibility maintained (first error thrown)
292
- - DEPENDENCIES: Task 3
293
-
294
- Task 5: RUN specific concurrent execution tests
295
- - RUN: npm test -- src/__tests__/adversarial/edge-case.test.ts
296
- - RUN: npm test -- src/__tests__/adversarial/prd-compliance.test.ts
297
- - VERIFY: Concurrent execution tests still pass
298
- - DEPENDENCIES: Task 4
299
-
300
- Task 6: (OPTIONAL) Add inline comment for future P1.M2.T2 enhancement
301
- - ADD: Comment indicating collected errors are available for future aggregation
302
- - FORMAT: // P1.M2.T2: Collected errors available for ErrorMergeStrategy implementation
303
- - DEPENDENCIES: Task 3
304
- ```
305
-
306
- ### Implementation Patterns & Key Details
307
-
308
- ```typescript
309
- // ============================================
310
- // PATTERN 1: Promise.allSettled with Error Collection
311
- // Location: src/decorators/task.ts lines 111-120
312
- // ============================================
313
-
314
- // BEFORE (current):
315
- if (runnable.length > 0) {
316
- await Promise.all(runnable.map((w) => w.run()));
317
- }
318
-
319
- // AFTER (target):
320
- if (runnable.length > 0) {
321
- // Use Promise.allSettled to collect all results (success and failure)
322
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
323
-
324
- // Filter for rejected promises
325
- const rejected = results.filter(
326
- (r): r is PromiseRejectedResult => r.status === 'rejected'
327
- );
328
-
329
- // Throw first error for backward compatibility (fail-fast behavior)
330
- // P1.M2.T2: All collected errors available via rejected array for ErrorMergeStrategy
331
- if (rejected.length > 0) {
332
- throw rejected[0].reason;
333
- }
334
- }
335
-
336
- // KEY INSIGHTS:
337
- // - Promise.allSettled returns PromiseSettledResult<unknown>[] (never rejects)
338
- // - Type guard (r): r is PromiseRejectedResult narrows type for filter
339
- // - Throwing first reason maintains exact same behavior as Promise.all
340
- // - rejected array preserved for future P1.M2.T2 error aggregation
341
- // - No other behavior changes: events already emitted, children already attached
342
-
343
- // ============================================
344
- // PATTERN 2: Type Guard for PromiseRejectedResult
345
- // Location: src/decorators/task.ts inline (extracted to utils in P1.M2.T2)
346
- // ============================================
347
-
348
- // Inline type guard (used in this task):
349
- const rejected = results.filter(
350
- (r): r is PromiseRejectedResult => r.status === 'rejected'
351
- );
352
-
353
- // Type predicate syntax: (r): r is PromiseRejectedResult
354
- // - Tells TypeScript that filtered results are always PromiseRejectedResult
355
- // - Enables accessing .reason property without type error
356
- // - Equivalent to explicit type guard function:
357
- // const isRejected = (r: PromiseSettledResult<unknown>): r is PromiseRejectedResult =>
358
- // r.status === 'rejected';
359
-
360
- // ============================================
361
- // PATTERN 3: Backward Compatibility Strategy
362
- // Location: src/decorators/task.ts after Promise.allSettled
363
- // ============================================
364
-
365
- // CRITICAL: Must maintain exact same error propagation behavior
366
- // Promise.all behavior: Rejects with first error reason
367
- // Our implementation: Throw first rejected reason
368
-
369
- if (rejected.length > 0) {
370
- throw rejected[0].reason; // First error wins (same as Promise.all)
371
- }
372
-
373
- // WHY THIS WORKS:
374
- // - Promise.all: first rejection causes immediate reject, reason is the error
375
- // - Our code: await allSettled completes, then throw first reason
376
- // - Result: Parent receives same error, same timing (approximately)
377
- // - Difference: All workflows complete instead of being "orphaned"
378
- // - This is actually BETTER behavior (no zombie workflows)
379
-
380
- // ============================================
381
- // PATTERN 4: Error Context (Already Captured)
382
- // Location: src/decorators/step.ts lines 109-134
383
- // ============================================
384
-
385
- // NOTE: Error wrapping already happens in @Step decorator
386
- // Each workflow that throws has error already wrapped in WorkflowError
387
-
388
- // In @Step decorator (step.ts:126-130):
389
- wf.emitEvent({
390
- type: 'error',
391
- node: wf.node,
392
- error: workflowError, // WorkflowError with full context
393
- });
394
-
395
- // IMPLICATION FOR @Task:
396
- // - rejected[0].reason is already a WorkflowError object
397
- // - Contains: message, original, workflowId, stack, state, logs
398
- // - No need to wrap or transform errors
399
- // - Error events already emitted to observers
400
- // - Just throw the first WorkflowError as-is
401
-
402
- // ============================================
403
- // PATTERN 5: PromiseSettledResult Type Structure
404
- // Built-in TypeScript types
405
- // ============================================
406
-
407
- // PromiseFulfilledResult<T>:
408
- interface PromiseFulfilledResult<T> {
409
- status: 'fulfilled';
410
- value: T;
411
- }
412
-
413
- // PromiseRejectedResult:
414
- interface PromiseRejectedResult {
415
- status: 'rejected';
416
- reason: unknown; // The error/rejection reason
417
- }
418
-
419
- // PromiseSettledResult<T> (union type):
420
- type PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;
421
-
422
- // DISCRIMINATED UNION:
423
- // - Check .status property to narrow type
424
- // - 'fulfilled' -> has .value property
425
- // - 'rejected' -> has .reason property
426
- // - Type guards required for TypeScript to understand this
427
-
428
- // Example: Accessing properties safely
429
- results.forEach(result => {
430
- if (result.status === 'fulfilled') {
431
- console.log(result.value); // OK: TypeScript knows this is fulfilled
432
- } else {
433
- console.log(result.reason); // OK: TypeScript knows this is rejected
434
- }
435
- });
436
- ```
437
-
438
- ### Integration Points
439
-
440
- ```yaml
441
- # No integration point changes for this task
442
- # Promise.allSettled is a drop-in replacement for Promise.all
443
- # No API changes, no type changes, no configuration changes
444
-
445
- FUTURE_INTEGRATIONS (P1.M2.T2 - ErrorMergeStrategy):
446
- - modify: src/types/decorators.ts
447
- add: errorMergeStrategy?: ErrorMergeStrategy
448
-
449
- - modify: src/decorators/task.ts
450
- use: rejected array from this task for error aggregation
451
- pattern: if (opts.errorMergeStrategy?.enabled) { /* aggregate */ }
452
-
453
- - create: src/utils/promise-utils.ts
454
- add: Type guard functions isFulfilled, isRejected, isWorkflowError
455
- ```
456
-
457
- ---
458
-
459
- ## Validation Loop
460
-
461
- ### Level 1: Syntax & Style (Immediate Feedback)
462
-
463
- ```bash
464
- # After modifying src/decorators/task.ts, run these checks
465
-
466
- # TypeScript type checking
467
- npx tsc --noEmit src/decorators/task.ts
468
-
469
- # Run full type check on project
470
- npm run type-check # or equivalent command
471
-
472
- # Expected: Zero type errors
473
- # Common error to fix: TypeScript complaining about .reason access
474
- # Solution: Ensure type guard (r): r is PromiseRejectedResult is correct
475
- ```
476
-
477
- ### Level 2: Unit Tests (Component Validation)
478
-
479
- ```bash
480
- # Run all existing tests to verify backward compatibility
481
- npm test
482
-
483
- # Run specific concurrent execution tests
484
- npm test -- src/__tests__/adversarial/edge-case.test.ts
485
- npm test -- src/__tests__/adversarial/prd-compliance.test.ts
486
-
487
- # Run decorator-specific tests
488
- npm test -- src/__tests__/unit/decorators.test.ts
489
-
490
- # Expected: All tests pass without modification
491
- # If tests fail, debug - should maintain exact same behavior
492
- ```
493
-
494
- ### Level 3: Integration Testing (System Validation)
495
-
496
- ```bash
497
- # Create quick manual test to verify Promise.allSettled behavior
498
- cat > test_concurrent_errors.js << 'EOF'
499
- // Quick manual test for concurrent error collection
500
- import { Workflow, Task, Step } from './src/index.js';
501
-
502
- class FailingWorkflow extends Workflow {
503
- @Step()
504
- async run() {
505
- throw new Error(`Intentional failure in ${this.node.name}`);
506
- }
507
- }
508
-
509
- class SuccessWorkflow extends Workflow {
510
- @Step()
511
- async run() {
512
- return `Success from ${this.node.name}`;
513
- }
514
- }
515
-
516
- class ParentWorkflow extends Workflow {
517
- @Task({ concurrent: true })
518
- async spawnMixed() {
519
- return [
520
- new SuccessWorkflow('Good1', this),
521
- new FailingWorkflow('Bad1', this),
522
- new SuccessWorkflow('Good2', this),
523
- new FailingWorkflow('Bad2', this),
524
- ];
525
- }
526
-
527
- async run() {
528
- return this.spawnMixed();
529
- }
530
- }
531
-
532
- async function test() {
533
- const workflow = new ParentWorkflow('TestParent');
534
- try {
535
- await workflow.run();
536
- } catch (error) {
537
- console.log('Caught error (expected):', error.message);
538
- console.log('Error workflowId:', error.workflowId);
539
- console.log('Children attached:', workflow.children.length);
540
-
541
- // Verify: All workflows completed and attached
542
- // Verify: First error thrown (Bad1 or Bad2, non-deterministic which)
543
- }
544
- }
545
-
546
- test();
547
- EOF
548
-
549
- node test_concurrent_errors.js
550
-
551
- # Expected behavior:
552
- # - All 4 child workflows complete execution
553
- # - All 4 children attached to parent
554
- # - First error thrown (either Bad1 or Bad2)
555
- # - Error is WorkflowError with full context
556
-
557
- # Clean up test file
558
- rm test_concurrent_errors.js
559
- ```
560
-
561
- ### Level 4: Manual Code Review
562
-
563
- ```bash
564
- # Review the changes made to src/decorators/task.ts
565
-
566
- # Key verification points:
567
- grep -A 10 "Promise.allSettled" src/decorators/task.ts
568
-
569
- # Should show:
570
- # 1. Promise.allSettled replaces Promise.all
571
- # 2. Results filtered for 'rejected' status
572
- # 3. First error thrown for backward compatibility
573
-
574
- # Verify no other changes
575
- git diff src/decorators/task.ts
576
-
577
- # Expected: Only lines 111-120 changed, no other modifications
578
- ```
579
-
580
- ---
581
-
582
- ## Final Validation Checklist
583
-
584
- ### Technical Validation
585
-
586
- - [ ] Promise.all replaced with Promise.allSettled at line 112
587
- - [ ] Error collection filters for PromiseRejectedResult
588
- - [ ] Type guard (r): r is PromiseRejectedResult used correctly
589
- - [ ] First error thrown for backward compatibility
590
- - [ ] No type errors: `npm run type-check` passes
591
- - [ ] All existing tests pass: `npm test` passes
592
- - [ ] Concurrent execution tests pass: edge-case.test.ts, prd-compliance.test.ts
593
-
594
- ### Backward Compatibility Validation
595
-
596
- - [ ] First error thrown maintains fail-fast behavior
597
- - [ ] Error is same WorkflowError object (no wrapping/transformation)
598
- - [ ] Error events still emitted by @Step decorator (no duplication)
599
- - [ ] Child attachment happens before execution (unchanged)
600
- - [ ] Task start/end events still emitted (unchanged)
601
- - [ ] No changes to TaskOptions interface (no new options yet)
602
-
603
- ### Code Quality Validation
604
-
605
- - [ ] Follows existing code patterns (indentation, naming, style)
606
- - [ ] Inline comment added for future P1.M2.T2 enhancement
607
- - [ ] No unused variables or dead code
608
- - [ ] No console.log or debug statements left in
609
- - [ ] Error handling is specific (throwing exact error, not new wrapper)
610
-
611
- ### Documentation & Future-Proofing
612
-
613
- - [ ] Comment indicates rejected array available for P1.M2.T2
614
- - [ ] No breaking changes to public API
615
- - [ ] Code is self-documenting with clear variable names
616
- - [ ] Type guards are clear and correct
617
-
618
- ---
619
-
620
- ## Anti-Patterns to Avoid
621
-
622
- - ❌ **Don't add try-catch around Promise.allSettled** - It never rejects, catching won't work
623
- - ❌ **Don't skip the type guard** - TypeScript won't know .reason exists without type predicate
624
- - ❌ **Don't wrap the error** - Throw rejected[0].reason as-is, it's already WorkflowError
625
- - ❌ **Don't emit error events** - @Step decorator already emits them, don't duplicate
626
- - ❌ **Don't change TaskOptions** - That's P1.M2.T2, this task is internal change only
627
- - ❌ **Don't throw AggregateError** - Maintain fail-fast by throwing first error
628
- - ❌ **Don't access .value or .reason without type check** - Use type guard first
629
- - ❌ **Don't assume Error interface** - rejected[0].reason is WorkflowError (check with instanceof if needed)
630
- - ❌ **Don't create new files** - This task only modifies existing task.ts
631
- - ❌ **Don't write new tests** - Existing tests should pass, new tests in P1.M2.T1.S3
632
-
633
- ---
634
-
635
- ## Success Metrics
636
-
637
- **Confidence Score**: 10/10 for one-pass implementation success
638
-
639
- **Definition of Done**:
640
- 1. src/decorators/task.ts line 112 uses Promise.allSettled instead of Promise.all
641
- 2. Errors from all failed concurrent workflows are collected (via rejected array)
642
- 3. Backward compatibility maintained: first error still thrown
643
- 4. All existing tests pass without modification
644
- 5. Zero TypeScript type errors
645
- 6. No changes to public API or TaskOptions interface
646
-
647
- **Validation**: The implementation enables P1.M2.T2 (ErrorMergeStrategy) by providing collected errors while maintaining complete backward compatibility with existing code.
648
-
649
- ---
650
-
651
- ## Appendix: Complete Code Change Reference
652
-
653
- ### Exact Change Required (src/decorators/task.ts)
654
-
655
- **Lines 111-113 (BEFORE):**
656
- ```typescript
657
- if (runnable.length > 0) {
658
- await Promise.all(runnable.map((w) => w.run()));
659
- }
660
- ```
661
-
662
- **Lines 111-120 (AFTER):**
663
- ```typescript
664
- if (runnable.length > 0) {
665
- const results = await Promise.allSettled(runnable.map((w) => w.run()));
666
-
667
- const rejected = results.filter(
668
- (r): r is PromiseRejectedResult => r.status === 'rejected'
669
- );
670
-
671
- if (rejected.length > 0) {
672
- throw rejected[0].reason;
673
- }
674
- }
675
- ```
676
-
677
- **Diff:**
678
- ```diff
679
- if (runnable.length > 0) {
680
- - await Promise.all(runnable.map((w) => w.run()));
681
- + const results = await Promise.allSettled(runnable.map((w) => w.run()));
682
- +
683
- + const rejected = results.filter(
684
- + (r): r is PromiseRejectedResult => r.status === 'rejected'
685
- + );
686
- +
687
- + if (rejected.length > 0) {
688
- + throw rejected[0].reason;
689
- + }
690
- }
691
- ```
692
-
693
- ---
694
-
695
- **PRP Status**: ✅ Complete - Ready for Implementation
696
- **Next Task**: P1.M2.T1.S3 - Add tests for concurrent task failure scenarios