groundswell 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/.claude/commands/subtask-planning/prp-base-create.md +120 -0
  2. package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
  3. package/.claude/commands/task-breakdown.md +94 -0
  4. package/.claude/system_prompts/task-breakdown.md +1 -0
  5. package/CHANGELOG.md +188 -0
  6. package/PRD.md +543 -0
  7. package/README.md +99 -5
  8. package/examples/README.md +15 -1
  9. package/examples/examples/11-reparenting-workflows.ts +269 -0
  10. package/examples/index.ts +4 -0
  11. package/package-lock.json +2398 -0
  12. package/package.json +3 -1
  13. package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
  14. package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
  15. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
  16. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
  17. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
  18. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
  19. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
  20. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
  21. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
  22. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
  23. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
  24. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
  25. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
  26. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
  27. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
  28. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
  29. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
  30. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
  31. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
  32. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
  33. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
  34. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
  35. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
  36. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
  37. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
  38. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
  39. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
  40. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
  41. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
  42. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
  43. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
  44. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
  45. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
  46. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
  47. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
  48. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
  49. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
  50. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
  51. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
  52. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
  53. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
  54. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
  55. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
  56. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
  57. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
  58. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
  59. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
  60. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
  61. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
  62. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
  63. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
  64. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
  65. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
  66. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
  67. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
  68. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
  69. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
  70. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
  71. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
  72. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
  73. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
  74. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
  75. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
  76. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
  77. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
  78. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
  79. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
  80. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
  81. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
  82. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
  83. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
  84. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
  85. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
  86. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
  87. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
  88. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
  89. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
  90. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
  91. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
  92. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
  93. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
  94. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
  95. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
  96. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
  97. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
  98. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
  99. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
  100. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
  101. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
  102. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
  103. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
  104. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
  105. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
  106. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
  107. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
  108. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
  109. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
  110. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
  111. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
  112. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
  113. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
  114. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
  115. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
  116. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
  117. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
  118. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
  119. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
  120. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
  121. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
  122. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
  123. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
  124. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
  125. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
  126. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
  127. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
  128. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
  129. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
  130. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
  131. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
  132. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
  133. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
  134. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
  135. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
  136. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
  137. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
  138. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
  139. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
  140. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
  141. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
  142. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
  143. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
  144. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
  145. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
  146. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
  147. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
  148. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
  149. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
  150. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
  151. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
  152. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
  153. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
  154. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
  155. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
  156. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
  157. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
  158. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
  159. package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
  160. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
  161. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
  162. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
  163. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
  164. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
  165. package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
  166. package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
  167. package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
  168. package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
  169. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
  170. package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
  171. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
  172. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
  173. package/src/__tests__/adversarial/edge-case.test.ts +703 -0
  174. package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
  175. package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
  176. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
  177. package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
  178. package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
  179. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
  180. package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
  181. package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
  182. package/src/__tests__/helpers/index.ts +18 -0
  183. package/src/__tests__/helpers/tree-verification.ts +257 -0
  184. package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
  185. package/src/__tests__/integration/observer-logging.test.ts +643 -0
  186. package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
  187. package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
  188. package/src/__tests__/unit/context.test.ts +79 -0
  189. package/src/__tests__/unit/logger.test.ts +293 -0
  190. package/src/__tests__/unit/observable.test.ts +321 -0
  191. package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
  192. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
  193. package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
  194. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
  195. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
  196. package/src/__tests__/unit/workflow.test.ts +277 -1
  197. package/src/core/agent.ts +21 -1
  198. package/src/core/logger.ts +27 -2
  199. package/src/core/workflow-context.ts +6 -4
  200. package/src/core/workflow.ts +252 -14
  201. package/src/debugger/tree-debugger.ts +52 -7
  202. package/src/decorators/task.ts +65 -2
  203. package/src/index.ts +4 -2
  204. package/src/types/decorators.ts +8 -1
  205. package/src/types/events.ts +1 -0
  206. package/src/utils/index.ts +1 -0
  207. package/src/utils/observable.ts +32 -3
  208. package/src/utils/workflow-error-utils.ts +56 -0
  209. package/tsconfig.json +1 -1
  210. package/llms_full.txt +0 -5890
  211. package/tasks.json +0 -0
  212. /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
  213. /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
  214. /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
  215. /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
  216. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
  217. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
  218. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
  219. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
  220. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
  221. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
  222. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
  223. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
  224. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
  225. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
  226. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
  227. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
  228. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
  229. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
  230. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
  231. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
  232. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
  233. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
  234. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
  235. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
  236. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
  237. /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
  238. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
  239. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
  240. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
  241. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
  242. /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
@@ -0,0 +1,713 @@
1
+ # PRP: Write Test for WorkflowContext Error State Capture
2
+
3
+ ---
4
+
5
+ ## Goal
6
+
7
+ **Feature Goal**: Add a comprehensive test to `src/__tests__/unit/context.test.ts` that validates the `WorkflowContext.step()` error handler properly captures state (via `getObservedState(this.workflow)`) and logs (via `[...this.workflow.node.logs] as LogEntry[]`) when errors occur during step execution.
8
+
9
+ **Deliverable**: A new test case `should capture state and logs in step() error handler` added to the existing test suite in `src/__tests__/unit/context.test.ts` that validates error state/logs capture for `WorkflowContext.step()` method.
10
+
11
+ **Success Definition**: The test creates a Workflow with `@ObservedState` decorated fields, calls `ctx.step()` with a function that throws an error, and asserts that the error event's `state` property contains captured observed field values and `logs` property contains log entries.
12
+
13
+ ## User Persona
14
+
15
+ **Target User**: Developer/QA Engineer who needs to verify that `WorkflowContext.step()` error handlers properly capture workflow state and logs for debugging purposes.
16
+
17
+ **Use Case**: When developing or testing workflows that use the functional `ctx.step()` API, developers need assurance that error events emitted from step failures contain complete execution context (state and logs) to diagnose failures and understand what happened before the error occurred.
18
+
19
+ **User Journey**:
20
+ 1. Developer writes a workflow using the functional executor pattern with `ctx.step()` calls
21
+ 2. Developer optionally decorates workflow class fields with `@ObservedState` for state tracking
22
+ 3. Step execution may encounter errors during workflow run
23
+ 4. Error event is emitted with `WorkflowError` object containing `state` and `logs`
24
+ 5. Developer inspects `error.state` to see captured workflow state
25
+ 6. Developer inspects `error.logs` to see execution history
26
+
27
+ **Pain Points Addressed**:
28
+ - Previously `error.state` was empty object `{}` for all step() errors
29
+ - Previously `error.logs` was empty array `[]` for all step() errors
30
+ - No test validation that `getObservedState(this.workflow)` actually captures decorated fields in step() error handler
31
+ - No test validation that `[...this.workflow.node.logs]` actually captures log entries in step() error handler
32
+
33
+ ## Why
34
+
35
+ - **Bug Fix Validation**: Subtask P1.M1.T2.S4 requires a test to validate the fixes from P1.M1.T2.S2 (state capture in first error handler) and P1.M1.T2.S3 (state/logs capture in second error handler)
36
+ - **Regression Prevention**: Ensures future changes don't break error state/logs capture in `WorkflowContext.step()` method
37
+ - **Documentation**: Test serves as executable documentation of expected error behavior for the step() API
38
+ - **Completes P1.M1.T2**: This is the final subtask in the "Fix Empty State/Logs in WorkflowContext.step() Error Handler" task
39
+ - **Follows Test-Driven Bug Fix**: Implementation (S2, S3) is complete; this test validates the fix works correctly
40
+ - **Complements Existing Tests**: The existing test in `workflow.test.ts` (lines 132-207) validates state capture through the full workflow execution path; this new test focuses specifically on the `step()` error handler behavior
41
+
42
+ ## What
43
+
44
+ Add a test to `src/__tests__/unit/context.test.ts` that:
45
+ 1. Creates a Workflow class with `@ObservedState` decorated fields
46
+ 2. Uses a functional executor that calls `ctx.step()` with a failing function
47
+ 3. Captures error events via `WorkflowObserver`
48
+ 4. Validates that the error event contains captured `state` (with @ObservedState field values)
49
+ 5. Validates that the error event contains captured `logs` (as an array)
50
+
51
+ ### Success Criteria
52
+
53
+ - [ ] New test case added to `src/__tests__/unit/context.test.ts`
54
+ - [ ] Test creates a Workflow class with `@ObservedState` fields
55
+ - [ ] Test uses functional executor pattern (not class-based run() method)
56
+ - [ ] Test calls `ctx.step()` with a function that throws
57
+ - [ ] Test asserts `error.state` contains captured observed field values
58
+ - [ ] Test asserts `error.logs` is an array (may be empty if no logs generated before error)
59
+ - [ ] Test follows existing test patterns in `workflow.test.ts`
60
+ - [ ] All tests pass after new test is added
61
+
62
+ ## All Needed Context
63
+
64
+ ### Context Completeness Check
65
+
66
+ _If someone knew nothing about this codebase, would they have everything needed to implement this successfully?_
67
+
68
+ **YES** - This PRP provides:
69
+ - Exact file location for adding the test (`src/__tests__/unit/context.test.ts`)
70
+ - Complete code snippets showing existing test patterns to follow from `workflow.test.ts`
71
+ - Reference patterns for `@ObservedState` usage from existing tests
72
+ - The exact implementation being tested (WorkflowContext.step() error handlers in workflow-context.ts)
73
+ - All required imports and test structure
74
+ - Known gotchas about functional vs class-based workflows
75
+ - Specific line numbers for error handlers being tested
76
+
77
+ ### Documentation & References
78
+
79
+ ```yaml
80
+ # MUST READ - Include these in your context window
81
+ - file: src/__tests__/unit/workflow.test.ts
82
+ why: PRIMARY REFERENCE - Contains the exact test pattern to follow
83
+ pattern: Lines 132-207 show "should capture @ObservedState fields in workflow error state"
84
+ critical: Shows complete test structure: observer setup, @ObservedState class, ctx.step() error trigger, assertions
85
+ line_range: 132-207
86
+ gotcha: This test already exists and validates step() error handler - P1.M1.T2.S4 may need to enhance or add a variant
87
+
88
+ - file: src/__tests__/unit/workflow.test.ts
89
+ why: Lines 82-130 show basic functional workflow error testing
90
+ pattern: Shows observer pattern, ctx.step() error trigger, basic error assertions
91
+ line_range: 82-130
92
+ critical: Lines 98-100 show ctx.step() usage with throwing function
93
+
94
+ - file: src/__tests__/unit/context.test.ts
95
+ why: TARGET FILE - Add new test case to this file
96
+ pattern: Current tests use vitest describe/it blocks, simple mock creation
97
+ line_range: 1-138
98
+ gotcha: Current tests target AgentExecutionContext, not WorkflowContext. Add new describe() block for WorkflowContext tests
99
+ critical: Consider adding a new describe('WorkflowContext', () => {...}) block to separate from AgentExecutionContext tests
100
+
101
+ - file: src/core/workflow-context.ts
102
+ why: Implementation being tested - WorkflowContext.step() error handlers
103
+ pattern: Lines 155-165 show first error handler in step() method
104
+ pattern: Lines 319-329 show second error handler in replaceLastPromptResult() method
105
+ line_range: 155-165, 319-329
106
+ critical: Line 161: `state: getObservedState(this.workflow)` - this is what the test validates
107
+ critical: Line 162: `logs: [...this.workflow.node.logs] as LogEntry[]` - this is what the test validates
108
+
109
+ - file: src/__tests__/unit/decorators.test.ts
110
+ why: Reference pattern for @ObservedState usage in tests
111
+ pattern: Lines 69-100 show StateTestWorkflow class with @ObservedState decorators
112
+ critical: Shows how to create class with @ObservedState(), @ObservedState({ redact: true }), @ObservedState({ hidden: true })
113
+ line_range: 69-100
114
+
115
+ - file: src/decorators/observed-state.ts
116
+ why: Understanding how getObservedState() works and what it returns
117
+ pattern: Lines 50-77 show getObservedState function implementation
118
+ critical: Returns empty object {} if no fields decorated with @ObservedState
119
+ line_range: 50-77
120
+
121
+ - file: src/types/error.ts
122
+ why: WorkflowError interface definition - structure of error object
123
+ pattern: WorkflowError interface with state and logs properties
124
+ gotcha: error.state is SerializedWorkflowState, error.logs is LogEntry[]
125
+
126
+ - file: src/types/logging.ts
127
+ why: LogEntry type definition - structure of log entries
128
+ pattern: LogEntry interface with id, workflowId, timestamp, level, message, data properties
129
+
130
+ - file: plan/bugfix/P1M1T1S4/PRP.md
131
+ why: Related PRP for functional workflow error state capture test
132
+ pattern: Similar structure and patterns, but for Workflow.runFunctional() instead of WorkflowContext.step()
133
+ critical: Use as template reference, but note the difference between runFunctional() and step() error handlers
134
+
135
+ - url: https://vitest.dev/guide/assertions.html
136
+ why: Vitest assertions documentation
137
+ critical: expect().toBeDefined(), expect().toBe(), expect().rejects.toThrow()
138
+
139
+ - url: https://vitest.dev/guide/expect.html
140
+ why: Vitest expect API for custom matchers
141
+ critical: expect.objectContaining() for partial object matching
142
+ ```
143
+
144
+ ### Current Codebase Tree
145
+
146
+ ```bash
147
+ /home/dustin/projects/groundswell
148
+ ├── dist/ # Compiled JavaScript (not modified)
149
+ ├── docs/ # User documentation
150
+ ├── examples/
151
+ │ └── examples/
152
+ │ └── 05-error-handling.ts # Error handling example
153
+ ├── plan/
154
+ │ ├── architecture/ # Architecture documentation
155
+ │ ├── docs/
156
+ │ │ └── bugfix/
157
+ │ │ └── system_context.md
158
+ │ └── bugfix/
159
+ │ ├── P1M1T1S1/PRP.md
160
+ │ ├── P1M1T1S2/PRP.md
161
+ │ ├── P1M1T1S3/PRP.md
162
+ │ ├── P1M1T1S4/PRP.md
163
+ │ ├── P1M1T2S1/PRP.md
164
+ │ ├── P1M1T2S2/PRP.md
165
+ │ ├── P1M1T2S3/PRP.md
166
+ │ └── P1M1T2S4/ # THIS PRP LOCATION
167
+ ├── src/
168
+ │ ├── __tests__/
169
+ │ │ ├── integration/
170
+ │ │ └── unit/
171
+ │ │ ├── workflow.test.ts # Reference test patterns
172
+ │ │ ├── decorators.test.ts # Reference for @ObservedState
173
+ │ │ └── context.test.ts # TARGET FILE - Add test here
174
+ │ ├── core/
175
+ │ │ ├── workflow.ts # Workflow class
176
+ │ │ ├── workflow-context.ts # Implementation being tested
177
+ │ │ └── context.ts # AgentExecutionContext (different module)
178
+ │ ├── decorators/
179
+ │ │ ├── step.ts
180
+ │ │ └── observed-state.ts # getObservedState function
181
+ │ └── types/
182
+ │ ├── workflow.ts
183
+ │ ├── logging.ts # LogEntry interface
184
+ │ ├── error.ts # WorkflowError interface
185
+ │ └── workflow-context.ts # WorkflowContext interface
186
+ ├── package.json
187
+ ├── vitest.config.ts
188
+ └── tsconfig.json
189
+ ```
190
+
191
+ ### Desired Codebase Tree (files to be added/modified)
192
+
193
+ ```bash
194
+ # Modified: src/__tests__/unit/context.test.ts
195
+ # - Add new describe() block for WorkflowContext tests
196
+ # - Add test case "should capture state and logs in step() error handler"
197
+ ```
198
+
199
+ ### Known Gotchas of Our Codebase & Library Quirks
200
+
201
+ ```typescript
202
+ // CRITICAL: AgentExecutionContext vs WorkflowContext
203
+ // context.test.ts currently tests AgentExecutionContext (from src/core/context.ts)
204
+ // This test should add a NEW describe() block for WorkflowContext (from src/core/workflow-context.ts)
205
+ // These are DIFFERENT modules - do not mix tests
206
+
207
+ // CRITICAL: WorkflowContext cannot be instantiated directly
208
+ // It is created internally by Workflow.createWorkflowContext()
209
+ // Tests must go through Workflow to access WorkflowContext behavior
210
+ // The ctx parameter in the functional executor IS the WorkflowContext
211
+
212
+ // CRITICAL: Existing test in workflow.test.ts (lines 132-207)
213
+ // This test ALREADY validates step() error state capture with @ObservedState
214
+ // P1.M1.T2.S4 test should either:
215
+ // 1. Enhance the existing test with more specific assertions
216
+ // 2. Add a focused variant test in context.test.ts as specified
217
+ // 3. Check if task intends for a DIFFERENT aspect of step() error handling
218
+
219
+ // CRITICAL: Functional vs Class-based workflows
220
+ // Functional workflows: new Workflow(config, async (ctx) => {...})
221
+ // - ctx parameter is WorkflowContext
222
+ // - Can still use @ObservedState on the Workflow class instance
223
+ // Class-based workflows: class MyWorkflow extends Workflow { async run() {...} }
224
+ // - Use this.step() or create ctx manually
225
+ // The test should use functional pattern to test WorkflowContext.step()
226
+
227
+ // CRITICAL: getObservedState(this.workflow) behavior
228
+ // Returns {} if no @ObservedState decorated fields exist
229
+ // Returns object with decorated field values if fields exist
230
+ // Applies redaction: @ObservedState({ redact: true }) fields become '***'
231
+ // Applies hiding: @ObservedState({ hidden: true }) fields are excluded
232
+
233
+ // CRITICAL: Error event capture pattern
234
+ // Must use observer to capture error events
235
+ // Filter events by type: events.filter((e) => e.type === 'error')
236
+ // Access error object: errorEvent.error.state, errorEvent.error.logs
237
+
238
+ // CRITICAL: Test file imports
239
+ // context.test.ts currently imports from core/context.js
240
+ // Need to add imports from main index.js for Workflow, WorkflowObserver, etc.
241
+ // Need to add imports for @ObservedState and getObservedState
242
+
243
+ // CRITICAL: Logs array may be empty
244
+ // If workflow doesn't generate logs before the error, error.logs will be []
245
+ // This is expected behavior - validate it's an array, not that it has entries
246
+
247
+ // CRITICAL: Two error handlers in WorkflowContext
248
+ // First: In step() method at lines 155-165
249
+ // Second: In replaceLastPromptResult() method at lines 319-329
250
+ // Both were fixed in P1.M1.T2.S2 and P1.M1.T2.S3
251
+ // Test should trigger step() error to validate first error handler
252
+
253
+ // CRITICAL: Test name collision
254
+ // workflow.test.ts has "should capture @ObservedState fields in workflow error state"
255
+ // Use a different, more specific name: "should capture state and logs in step() error handler"
256
+ ```
257
+
258
+ ## Implementation Blueprint
259
+
260
+ ### Data Models and Structure
261
+
262
+ **Relevant Types** (for context):
263
+ ```typescript
264
+ // From src/decorators/observed-state.ts
265
+ export function ObservedState(meta: StateFieldMetadata = {}) {
266
+ // Class field decorator - marks fields for state capture
267
+ }
268
+
269
+ export function getObservedState(obj: object): SerializedWorkflowState {
270
+ // Returns object with decorated field values
271
+ // Empty object {} if no decorated fields
272
+ }
273
+
274
+ // From src/types/workflow.ts
275
+ export interface SerializedWorkflowState {
276
+ [key: string]: unknown;
277
+ }
278
+
279
+ // From src/types/error.ts
280
+ export interface WorkflowError {
281
+ message: string;
282
+ original: unknown;
283
+ workflowId: string;
284
+ stack?: string;
285
+ state: SerializedWorkflowState; // <-- Captured by getObservedState(this.workflow)
286
+ logs: LogEntry[]; // <-- Captured by [...this.workflow.node.logs]
287
+ }
288
+
289
+ // From src/types/logging.ts
290
+ export interface LogEntry {
291
+ id: string;
292
+ workflowId: string;
293
+ timestamp: number;
294
+ level: LogLevel;
295
+ message: string;
296
+ data?: unknown;
297
+ parentLogId?: string;
298
+ }
299
+
300
+ // From src/types/workflow-context.ts
301
+ export interface WorkflowContext {
302
+ step<T>(name: string, fn: () => Promise<T>): Promise<T>;
303
+ // ... other methods
304
+ }
305
+ ```
306
+
307
+ ### Implementation Tasks (ordered by dependencies)
308
+
309
+ ```yaml
310
+ Task 1: ADD REQUIRED IMPORTS TO context.test.ts
311
+ - CHECK: Current imports at line 1-10
312
+ - ADD: Workflow class from main index
313
+ - ADD: WorkflowObserver interface from main index
314
+ - ADD: WorkflowEvent type from main index
315
+ - ADD: ObservedState decorator from main index
316
+ - PATTERN: Follow import pattern from workflow.test.ts line 2
317
+ - CURRENT: import { describe, it, expect } from 'vitest';
318
+ - CURRENT: import { getExecutionContext, requireExecutionContext, runInContext, ... } from '../../core/context.js';
319
+ - NEW: import { Workflow, WorkflowObserver, WorkflowEvent, ObservedState } from '../../index.js';
320
+ - PLACEMENT: Top of file, after vitest import, line 2
321
+ - DEPENDENCIES: None
322
+
323
+ Task 2: CREATE TEST WORKFLOW CLASS WITH @ObservedState FIELDS
324
+ - CREATE: StatefulTestWorkflow class inside new describe block
325
+ - IMPLEMENT: Multiple @ObservedState decorated fields
326
+ - INCLUDE: @ObservedState() for normal field (visible with value)
327
+ - INCLUDE: @ObservedState({ redact: true }) for redacted field (shows '***')
328
+ - INCLUDE: @ObservedState({ hidden: true }) for hidden field (not in state)
329
+ - PATTERN: Follow StateTestWorkflow from decorators.test.ts lines 70-81
330
+ - PATTERN: Follow StatefulWorkflowClass from workflow.test.ts lines 135-144
331
+ - PLACEMENT: Inside new describe('WorkflowContext', () => {...}) block
332
+ - DEPENDENCIES: Task 1
333
+
334
+ Task 3: WRITE TEST CASE FOR STEP() ERROR STATE CAPTURE
335
+ - CREATE: New describe() block for WorkflowContext tests
336
+ - CREATE: New it() block with descriptive name
337
+ - NAME: "should capture state and logs in step() error handler"
338
+ - ARRANGE: Create observer to capture error events
339
+ - ARRANGE: Create StatefulTestWorkflow class instance with functional executor
340
+ - ARRANGE: Modify @ObservedState fields on workflow instance
341
+ - ARRANGE: Attach observer to workflow
342
+ - ACT: Run workflow (which calls ctx.step() with throwing function)
343
+ - ASSERT: Verify error event was emitted
344
+ - ASSERT: Verify error.state contains observed field values
345
+ - ASSERT: Verify redacted field shows '***'
346
+ - ASSERT: Verify hidden field is NOT in state
347
+ - ASSERT: Verify error.logs is an array
348
+ - PATTERN: Follow workflow.test.ts lines 132-207 for complete test structure
349
+ - PLACEMENT: After existing AgentExecutionContext describe block, after line 138
350
+ - DEPENDENCIES: Task 2
351
+
352
+ Task 4: RUN TESTS TO VALIDATE
353
+ - RUN: npm test (or npm run test)
354
+ - VERIFY: New test passes
355
+ - VERIFY: All existing tests still pass (no regression)
356
+ - DEPENDENCIES: Task 3
357
+ ```
358
+
359
+ ### Implementation Patterns & Key Details
360
+
361
+ ```typescript
362
+ // ============================================================
363
+ // IMPORTS TO ADD (Line 2 in context.test.ts)
364
+ // ============================================================
365
+ // CURRENT (lines 1-10):
366
+ import { describe, it, expect } from 'vitest';
367
+ import {
368
+ getExecutionContext,
369
+ requireExecutionContext,
370
+ runInContext,
371
+ runInContextSync,
372
+ hasExecutionContext,
373
+ createChildContext,
374
+ type AgentExecutionContext,
375
+ } from '../../core/context.js';
376
+ import type { WorkflowNode, WorkflowEvent } from '../../types/index.js';
377
+
378
+ // NEW (add after line 10):
379
+ import { Workflow, WorkflowObserver, ObservedState } from '../../index.js';
380
+
381
+ // ============================================================
382
+ // TEST WORKFLOW CLASS (add inside or before test)
383
+ // ============================================================
384
+ // Reference from workflow.test.ts lines 135-144
385
+ class StatefulTestWorkflow extends Workflow {
386
+ @ObservedState()
387
+ stepCount: number = 0;
388
+
389
+ @ObservedState({ redact: true })
390
+ apiKey: string = 'secret-key-123';
391
+
392
+ @ObservedState({ hidden: true })
393
+ internalCounter: number = 42;
394
+ }
395
+
396
+ // ============================================================
397
+ // TEST CASE TEMPLATE
398
+ // ============================================================
399
+ // Reference from workflow.test.ts lines 132-207
400
+ describe('WorkflowContext', () => {
401
+ it('should capture state and logs in step() error handler', async () => {
402
+ // Arrange: Create observer to capture error events
403
+ const events: WorkflowEvent[] = [];
404
+
405
+ const observer: WorkflowObserver = {
406
+ onLog: () => {},
407
+ onEvent: (event) => events.push(event),
408
+ onStateUpdated: () => {},
409
+ onTreeChanged: () => {},
410
+ };
411
+
412
+ // Arrange: Create workflow with @ObservedState fields using functional executor
413
+ const workflow = new StatefulTestWorkflow(
414
+ { name: 'StepErrorTest' },
415
+ async (ctx) => {
416
+ // Modify @ObservedState fields on the workflow instance
417
+ (workflow as any).stepCount = 5;
418
+ (workflow as any).apiKey = 'updated-key';
419
+ (workflow as any).internalCounter = 99;
420
+
421
+ // Execute a step that will fail - THIS TRIGGERS WorkflowContext.step() ERROR HANDLER
422
+ await ctx.step('failing-step', async () => {
423
+ throw new Error('Test error from step');
424
+ });
425
+ }
426
+ );
427
+
428
+ // Act: Attach observer and trigger error
429
+ workflow.addObserver(observer);
430
+ await expect(workflow.run()).rejects.toThrow('Test error from step');
431
+
432
+ // Assert: Verify error event was emitted
433
+ const errorEvents = events.filter((e) => e.type === 'error');
434
+ expect(errorEvents.length).toBeGreaterThanOrEqual(1);
435
+
436
+ // Assert: Verify error structure
437
+ const errorEvent = errorEvents[0];
438
+ expect(errorEvent.error).toBeDefined();
439
+ expect(errorEvent.error.message).toBe('Test error from step');
440
+
441
+ // Assert: Verify @ObservedState fields were captured in state
442
+ expect(errorEvent.error.state).toBeDefined();
443
+ expect(typeof errorEvent.error.state).toBe('object');
444
+
445
+ // Assert: Verify public field value is captured
446
+ expect(errorEvent.error.state.stepCount).toBe(5);
447
+
448
+ // Assert: Verify redacted field shows '***'
449
+ expect(errorEvent.error.state.apiKey).toBe('***');
450
+
451
+ // Assert: Verify hidden field is NOT in state
452
+ expect('internalCounter' in errorEvent.error.state).toBe(false);
453
+
454
+ // Assert: Verify logs array is present (may be empty)
455
+ expect(errorEvent.error.logs).toBeDefined();
456
+ expect(Array.isArray(errorEvent.error.logs)).toBe(true);
457
+
458
+ // Assert: Verify workflow status
459
+ expect(workflow.status).toBe('failed');
460
+
461
+ // Assert: Verify workflowId is captured
462
+ expect(errorEvent.error.workflowId).toBe(workflow.id);
463
+ });
464
+ });
465
+
466
+ // ============================================================
467
+ // ALTERNATIVE: Simpler test without field value changes
468
+ // ============================================================
469
+ it('should capture @ObservedState initial values in step() error', async () => {
470
+ const events: WorkflowEvent[] = [];
471
+ const observer: WorkflowObserver = {
472
+ onLog: () => {},
473
+ onEvent: (event) => events.push(event),
474
+ onStateUpdated: () => {},
475
+ onTreeChanged: () => {},
476
+ };
477
+
478
+ const workflow = new StatefulTestWorkflow(
479
+ { name: 'InitialStateTest' },
480
+ async (ctx) => {
481
+ await ctx.step('failing-step', async () => {
482
+ throw new Error('Test error');
483
+ });
484
+ }
485
+ );
486
+
487
+ workflow.addObserver(observer);
488
+ await expect(workflow.run()).rejects.toThrow('Test error');
489
+
490
+ const errorEvents = events.filter((e) => e.type === 'error');
491
+ const errorEvent = errorEvents[0];
492
+
493
+ // Verify captured state (initial values)
494
+ expect(errorEvent.error.state.stepCount).toBe(0);
495
+ expect(errorEvent.error.state.apiKey).toBe('***');
496
+ expect('internalCounter' in errorEvent.error.state).toBe(false);
497
+ expect(Array.isArray(errorEvent.error.logs)).toBe(true);
498
+ });
499
+ ```
500
+
501
+ ### Integration Points
502
+
503
+ ```yaml
504
+ TEST FILE:
505
+ - file: src/__tests__/unit/context.test.ts
506
+ - add_after: Line 138 (end of AgentExecutionContext describe block)
507
+ - add_import: Workflow, WorkflowObserver, WorkflowEvent, ObservedState to line 2
508
+
509
+ TEST RUNNER:
510
+ - command: npm test
511
+ - config: vitest.config.ts
512
+ - pattern: All *.test.ts files are auto-discovered
513
+
514
+ OBSERVER PATTERN:
515
+ - interface: WorkflowObserver from src/types/workflow.ts
516
+ - methods: onLog, onEvent, onStateUpdated, onTreeChanged
517
+ - usage: workflow.addObserver(observer)
518
+
519
+ ERROR EVENT STRUCTURE:
520
+ - type: 'error'
521
+ - node: WorkflowNode
522
+ - error: WorkflowError with state and logs properties
523
+
524
+ WORKFLOWCONTEXT:
525
+ - interface: WorkflowContext from src/types/workflow-context.ts
526
+ - implementation: WorkflowContextImpl from src/core/workflow-context.ts
527
+ - step() method: Lines 144-165 in workflow-context.ts
528
+ - error handler: Lines 155-165 in workflow-context.ts
529
+ ```
530
+
531
+ ## Validation Loop
532
+
533
+ ### Level 1: Syntax & Style (Immediate Feedback)
534
+
535
+ ```bash
536
+ # TypeScript compilation check
537
+ npm run build
538
+ # Expected: Zero compilation errors
539
+ # If errors exist, check import statements and class syntax
540
+
541
+ # Type checking
542
+ npx tsc --noEmit
543
+ # Expected: Zero type errors
544
+
545
+ # Linting (if configured)
546
+ npm run lint
547
+ # Expected: Zero linting errors
548
+ ```
549
+
550
+ ### Level 2: Unit Tests (Component Validation)
551
+
552
+ ```bash
553
+ # Run specific test file
554
+ npm test src/__tests__/unit/context.test.ts
555
+
556
+ # Run specific test by name (after implementation)
557
+ npm test -t "should capture state and logs in step"
558
+
559
+ # Run full test suite
560
+ npm test
561
+
562
+ # Expected: All tests pass
563
+ # Specifically: New test "should capture state and logs in step() error handler" passes
564
+ # No regression in existing AgentExecutionContext tests
565
+
566
+ # Expected test output:
567
+ # ✓ src/__tests__/unit/context.test.ts (N)
568
+ # ✓ AgentExecutionContext
569
+ # ✓ should return undefined outside of context
570
+ # ✓ should throw when requiring context outside of context
571
+ # ✓ ... (existing tests)
572
+ # ✓ WorkflowContext
573
+ # ✓ should capture state and logs in step() error handler <-- NEW TEST
574
+ ```
575
+
576
+ ### Level 3: Integration Testing (System Validation)
577
+
578
+ ```bash
579
+ # Verify test is properly integrated
580
+ grep -n "should capture state and logs in step" src/__tests__/unit/context.test.ts
581
+ # Expected: Shows line number of new test
582
+
583
+ # Verify imports are correct
584
+ grep -n "Workflow" src/__tests__/unit/context.test.ts
585
+ # Expected: Shows import statement and usage in test
586
+
587
+ # Run all context tests
588
+ npm test -- context
589
+ # Expected: All context-related tests pass
590
+
591
+ # Run all workflow tests to ensure no regression
592
+ npm test -- workflow
593
+ # Expected: All workflow tests pass (including existing step() error tests)
594
+ ```
595
+
596
+ ### Level 4: Domain-Specific Validation
597
+
598
+ ```bash
599
+ # Manual verification - inspect test behavior
600
+ npm test -t "should capture state and logs in step" --reporter=verbose
601
+
602
+ # Expected verbose output shows:
603
+ # - Observer capturing error event
604
+ # - Error state containing stepCount: 5
605
+ # - Error state containing apiKey: '***'
606
+ # - Error state NOT containing internalCounter
607
+ # - Error logs being an array
608
+
609
+ # Verify test validates the fix from P1.M1.T2.S2 and P1.M1.T2.S3
610
+ grep -A 5 "state: getObservedState" src/core/workflow-context.ts
611
+ # Expected: Shows line 161 with state: getObservedState(this.workflow)
612
+
613
+ grep -A 5 "logs:.*this.workflow.node.logs" src/core/workflow-context.ts
614
+ # Expected: Shows line 162 with logs: [...this.workflow.node.logs] as LogEntry[]
615
+
616
+ # Verify error event is emitted from step() method
617
+ grep -B 5 -A 10 "type: 'error'" src/core/workflow-context.ts | head -30
618
+ # Expected: Shows error emission in step() method error handler
619
+ ```
620
+
621
+ ## Final Validation Checklist
622
+
623
+ ### Technical Validation
624
+
625
+ - [ ] All 4 validation levels completed successfully
626
+ - [ ] All tests pass: `npm test`
627
+ - [ ] No TypeScript compilation errors: `npm run build`
628
+ - [ ] No type errors: `npx tsc --noEmit`
629
+ - [ ] New test case added to context.test.ts
630
+ - [ ] Required imports added (Workflow, WorkflowObserver, WorkflowEvent, ObservedState)
631
+ - [ ] New describe() block created for WorkflowContext tests
632
+
633
+ ### Feature Validation
634
+
635
+ - [ ] Test creates Workflow class with @ObservedState fields
636
+ - [ ] Test uses functional executor pattern (async (ctx) => {...})
637
+ - [ ] Test calls ctx.step() with throwing function
638
+ - [ ] Test asserts error.state contains captured field values
639
+ - [ ] Test asserts redacted fields show '***'
640
+ - [ ] Test asserts hidden fields are excluded
641
+ - [ ] Test asserts error.logs is an array
642
+ - [ ] Test validates workflow status is 'failed'
643
+ - [ ] Test validates workflowId is captured
644
+ - [ ] Test follows existing test patterns
645
+ - [ ] No regression in existing tests
646
+
647
+ ### Code Quality Validation
648
+
649
+ - [ ] Test name is descriptive and unique (no collision with workflow.test.ts tests)
650
+ - [ ] Test follows AAA pattern (Arrange, Act, Assert)
651
+ - [ ] Test uses observer pattern for event capture
652
+ - [ ] Test uses async/await properly
653
+ - [ ] Test has clear assertions with descriptive comments
654
+ - [ ] Test is self-contained (no external dependencies)
655
+ - [ ] Imports follow existing patterns
656
+ - [ ] New describe() block separates WorkflowContext from AgentExecutionContext tests
657
+
658
+ ### Documentation & Deployment
659
+
660
+ - [ ] Test is self-documenting (descriptive variable names and comments)
661
+ - [ ] No environment variables needed for test
662
+ - [ ] Test can run independently
663
+ - [ ] Test file has proper imports
664
+
665
+ ---
666
+
667
+ ## Anti-Patterns to Avoid
668
+
669
+ - ❌ **Don't mix AgentExecutionContext and WorkflowContext tests** - Add a new describe() block
670
+ - ❌ **Don't test runFunctional() error handler** - That's P1.M1.T1.S4's job
671
+ - ❌ **Don't use class-based run() method** - Use functional executor to test ctx.step()
672
+ - ❌ **Don't create WorkflowContext directly** - It's created internally by Workflow
673
+ - ❌ **Don't use existing test name from workflow.test.ts** - Use "should capture state and logs in step() error handler"
674
+ - ❌ **Don't forget to add imports** - Workflow, WorkflowObserver, WorkflowEvent, ObservedState must be imported
675
+ - ❌ **Don't assume logs has entries** - Empty logs array is valid
676
+ - ❌ **Don't test hidden field presence** - Hidden fields should NOT be in state
677
+ - ❌ **Don't test redacted field value** - Redacted fields should be '***', not actual value
678
+ - ❌ **Don't skip observer pattern** - Must use observer to capture error events
679
+ - ❌ **Don't use sync execution** - run() is async, must use await
680
+ - ❌ **Don't modify existing AgentExecutionContext tests** - Add new tests in separate describe block
681
+ - ❌ **Don't duplicate existing test from workflow.test.ts** - Ensure this test adds unique value or is specifically required
682
+
683
+ ---
684
+
685
+ ## Confidence Score
686
+
687
+ **9/10** for one-pass implementation success likelihood
688
+
689
+ **Justification**:
690
+ - Clear file location and test structure specified
691
+ - Existing test patterns to follow (workflow.test.ts lines 132-207)
692
+ - Reference implementation for @ObservedState in decorators.test.ts
693
+ - Implementation being tested is complete and verified (P1.M1.T2.S2, P1.M1.T2.S3)
694
+ - Simple test addition - no complex logic or new files required
695
+ - All required imports and patterns documented
696
+ - Test runner (vitest) already configured and working
697
+
698
+ **Risk Factors**:
699
+ - Potential confusion with existing test in workflow.test.ts (lines 132-207) which tests similar functionality - mitigated by specifying different test name and location
700
+ - Confusion about AgentExecutionContext vs WorkflowContext - mitigated by explicit instruction to create new describe() block
701
+ - Missing imports - mitigated by explicit import instructions
702
+
703
+ **Mitigation**: PRP provides exact code snippets, line numbers, and patterns to follow. Clear distinction between AgentExecutionContext and WorkflowContext prevents confusion. Note that existing test in workflow.test.ts already validates this behavior - verify with project lead if this task is still needed or if existing test is sufficient.
704
+
705
+ ---
706
+
707
+ ## Related Work Items
708
+
709
+ - **P1.M1.T2.S1**: Add getObservedState import to workflow-context.ts - ✅ COMPLETE
710
+ - **P1.M1.T2.S2**: Fix first error handler in step() method (line 155-162) - ✅ COMPLETE (line 161)
711
+ - **P1.M1.T2.S3**: Fix second error handler in replaceLastPromptResult() method (line 319-326) - ✅ COMPLETE (line 327)
712
+ - **P1.M1.T2.S4**: Write test for WorkflowContext error state capture - ⏳ THIS TASK
713
+ - **P1.M1.T1**: Fix Empty State/Logs in Workflow.runFunctional() Error Handler - ✅ COMPLETE