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,506 @@
1
+ name: "Replace observer error console.error with logger.error"
2
+ description: |
3
+
4
+ ---
5
+
6
+ ## Goal
7
+
8
+ **Feature Goal**: Replace all observer-related `console.error()` calls with `logger.error()` to enable structured error logging for observer callback failures.
9
+
10
+ **Deliverable**: Updated `src/core/logger.ts`, `src/core/workflow.ts`, and `src/utils/observable.ts` with observer errors logged through WorkflowLogger instead of console.
11
+
12
+ **Success Definition**:
13
+ - All 6 observer-related console.error calls replaced with logger.error()
14
+ - 2 validation error console.error calls preserved (lines 277, 286 in workflow.ts)
15
+ - Observable class supports optional logger injection with fallback to console.error
16
+ - WorkflowLogger recursive case handled without infinite recursion
17
+ - All existing tests pass
18
+ - New tests verify observer error logging behavior
19
+
20
+ ## Why
21
+
22
+ - **Structured Logging**: Observer errors currently go to console, which cannot be captured by log aggregation systems or WorkflowLogger observers
23
+ - **Error Context**: logger.error() accepts structured data parameter for better error tracking (error type, observer callback, event type)
24
+ - **Consistency**: Observer errors should follow same logging pattern as other workflow errors
25
+ - **Production Readiness**: console.error bypasses the entire logging infrastructure built into the workflow system
26
+
27
+ ## What
28
+
29
+ Replace 6 observer-related console.error calls with logger.error() calls:
30
+
31
+ | File | Line | Method | Observer Type | Replacement |
32
+ |------|------|--------|---------------|-------------|
33
+ | src/core/logger.ts | 27 | emit() | WorkflowObserver.onLog | Use internal log path |
34
+ | src/core/workflow.ts | 376 | emitEvent() | WorkflowObserver.onEvent | `this.logger.error()` |
35
+ | src/core/workflow.ts | 394 | snapshotState() | WorkflowObserver.onStateUpdated | `this.logger.error()` |
36
+ | src/utils/observable.ts | 39 | next() | Observer.next | Logger injection |
37
+ | src/utils/observable.ts | 52 | error() | Observer.error | Logger injection |
38
+ | src/utils/observable.ts | 65 | complete() | Observer.complete | Logger injection |
39
+
40
+ **Preserve** 2 validation error console.error calls:
41
+ - src/core/workflow.ts:277 - Child already has parent validation
42
+ - src/core/workflow.ts:286 - Circular reference detection
43
+
44
+ ### Success Criteria
45
+
46
+ - [ ] No observer-related console.error calls remain in production code
47
+ - [ ] Observer errors include structured context (error, observer type, event/node info)
48
+ - [ ] Observable class works with and without logger injection
49
+ - [ ] WorkflowLogger handles observer onLog errors without infinite recursion
50
+ - [ ] All existing tests pass
51
+ - [ ] New tests verify observer error logging
52
+
53
+ ## All Needed Context
54
+
55
+ ### Context Completeness Check
56
+
57
+ **"No Prior Knowledge" test**: If someone knew nothing about this codebase, would they have everything needed to implement this successfully?
58
+
59
+ **Answer**: YES - This PRP includes:
60
+ - Exact file paths and line numbers for all 6 console.error calls to replace
61
+ - Complete code snippets showing surrounding context
62
+ - Specific replacement patterns for each location
63
+ - Observable logger injection pattern with full implementation
64
+ - WorkflowLogger recursive case solution
65
+ - Test patterns and validation commands
66
+ - External best practices references
67
+
68
+ ### Documentation & References
69
+
70
+ ```yaml
71
+ # MUST READ - S1 Research Output (console.error locations and categorization)
72
+ - docfile: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md
73
+ why: Complete inventory of all 8 console.error calls with categorization, line numbers, and replacement patterns
74
+ critical: Contains the exact 6 calls to replace and 2 calls to preserve
75
+
76
+ # WorkflowLogger Implementation
77
+ - file: src/core/logger.ts
78
+ why: Core logger class with error() method signature: `error(message: string, data?: unknown): void`
79
+ pattern: Log entry creation via private log() method, emit() notifies observers
80
+ gotcha: emit() calls observer.onLog() - replacing console.error:27 requires avoiding infinite recursion
81
+
82
+ # Workflow Class Logger Usage
83
+ - file: src/core/workflow.ts
84
+ why: Has `this.logger` property (protected readonly) initialized in constructor at line 111
85
+ pattern: `this.logger.error('message', { error })` with structured data
86
+ gotcha: Lines 277, 286 are validation errors - preserve these console.error calls
87
+
88
+ # Observable Class (Needs Logger Injection)
89
+ - file: src/utils/observable.ts
90
+ why: Standalone utility class with no WorkflowLogger access
91
+ pattern: Constructor injection pattern with optional fallback
92
+ gotcha: Must maintain backward compatibility - work without logger
93
+
94
+ # Observer Type Definitions
95
+ - file: src/types/observer.ts
96
+ why: WorkflowObserver interface with onLog, onEvent, onStateUpdated, onTreeChanged methods
97
+ pattern: All methods are void, throw from observers crashes notification loop
98
+
99
+ # LogEntry Type Definition
100
+ - file: src/types/logging.ts
101
+ why: LogEntry structure: id, workflowId, timestamp, level, message, data?, parentLogId?
102
+ pattern: data parameter accepts any unknown value for structured logging
103
+
104
+ # Test Pattern Reference
105
+ - file: src/__tests__/unit/logger.test.ts
106
+ why: Shows how to test logger behavior, access logs via workflow.node.logs
107
+ pattern: Class-based workflow extending Workflow, verify logs array content
108
+ gotcha: Use vi.spyOn(console, 'error').mockImplementation() to suppress output
109
+
110
+ # Observable Usage Example
111
+ - file: src/debugger/tree-debugger.ts
112
+ why: Shows Observable class usage pattern in production code
113
+ pattern: `this.events = new Observable<WorkflowEvent>()` - no logger injected currently
114
+ gotcha: Will need to update constructor calls to inject logger after implementing injection
115
+
116
+ # External Research
117
+ - url: /home/dustin/projects/groundswell/research/error-logging-best-practices.md
118
+ why: Observer pattern error handling best practices, logger context propagation patterns
119
+ critical: AsyncLocalStorage pattern for automatic context propagation (consider for future)
120
+ ```
121
+
122
+ ### Current Codebase Tree
123
+
124
+ ```bash
125
+ src/
126
+ ├── core/
127
+ │ ├── logger.ts # WorkflowLogger class - REPLACE line 27
128
+ │ └── workflow.ts # Workflow class - REPLACE lines 376, 394
129
+ ├── utils/
130
+ │ └── observable.ts # Observable class - REPLACE lines 39, 52, 65
131
+ ├── types/
132
+ │ ├── observer.ts # WorkflowObserver interface
133
+ │ └── logging.ts # LogEntry, LogLevel types
134
+ ├── debugger/
135
+ │ └── tree-debugger.ts # Uses Observable (will need logger update)
136
+ └── __tests__/
137
+ ├── unit/
138
+ │ └── logger.test.ts # Logger test patterns
139
+ └── integration/ # Integration test patterns
140
+ ```
141
+
142
+ ### Desired Codebase Tree (New Files)
143
+
144
+ ```bash
145
+ src/
146
+ ├── core/
147
+ │ ├── logger.ts # MODIFIED: Internal error logging for observer onLog errors
148
+ │ └── workflow.ts # MODIFIED: Use this.logger.error() for observer errors
149
+ ├── utils/
150
+ │ └── observable.ts # MODIFIED: Add logger injection pattern
151
+ └── __tests__/
152
+ ├── unit/
153
+ │ ├── logger.test.ts # MODIFIED: Add observer error logging tests
154
+ │ └── observable.test.ts # NEW: Test Observable error logging
155
+ └── integration/
156
+ └── observer-logging.test.ts # NEW: Integration tests for observer error logging
157
+ ```
158
+
159
+ ### Known Gotchas & Library Quirks
160
+
161
+ ```typescript
162
+ // CRITICAL: WorkflowLogger.emit() recursive case
163
+ // The emit() method calls observer.onLog() entry
164
+ // If we call this.log() from within emit() catch block, it creates infinite loop:
165
+ // emit() -> log() -> emit() -> observer.onLog() throws -> catch -> log() -> emit() -> ...
166
+ // SOLUTION: Use private emitWithoutObserverNotification() or direct node.logs.push()
167
+
168
+ // CRITICAL: Observable class backward compatibility
169
+ // Observable is used in multiple places (tree-debugger.ts, others)
170
+ // Constructor must accept optional logger: constructor(logger?: ObservableLogger)
171
+ // If no logger provided, fall back to console.error for backward compatibility
172
+
173
+ // CRITICAL: Validation error console.error calls must be preserved
174
+ // Lines 277 and 286 in workflow.ts are NOT observer errors
175
+ // These provide immediate visibility before throw for structural invariants
176
+
177
+ // PATTERN: logger.error() signature
178
+ // error(message: string, data?: unknown): void
179
+ // Always pass error in data object: { error: err, eventType: event.type }
180
+
181
+ // GOTCHA: Workflow.getRootObservers() returns array
182
+ // Used in emitEvent() and snapshotState() - get observers before loop
183
+
184
+ // GOTCHA: Observer errors must never crash workflow
185
+ // All observer callbacks already wrapped in try-catch - preserve this pattern
186
+ ```
187
+
188
+ ## Implementation Blueprint
189
+
190
+ ### Data Models and Structure
191
+
192
+ ```typescript
193
+ // New type for Observable logger injection (add to src/utils/observable.ts)
194
+ export interface ObservableLogger {
195
+ error(message: string, data?: unknown): void;
196
+ }
197
+
198
+ // Existing type (already defined in src/types/logging.ts)
199
+ export interface LogEntry {
200
+ id: string;
201
+ workflowId: string;
202
+ timestamp: number;
203
+ level: LogLevel;
204
+ message: string;
205
+ data?: unknown;
206
+ parentLogId?: string;
207
+ }
208
+ ```
209
+
210
+ ### Implementation Tasks (ordered by dependencies)
211
+
212
+ ```yaml
213
+ Task 1: MODIFY src/utils/observable.ts - Add Logger Injection Pattern
214
+ - ADD: ObservableLogger interface definition
215
+ - ADD: private logger?: ObservableLogger property
216
+ - MODIFY: constructor to accept optional logger parameter
217
+ - ADD: private logError(message: string, error: unknown) method
218
+ - MODIFY: next() - replace console.error:39 with this.logError()
219
+ - MODIFY: error() - replace console.error:52 with this.logError()
220
+ - MODIFY: complete() - replace console.error:65 with this.logError()
221
+ - PATTERN: If logger provided, use logger.error(); else console.error()
222
+ - BACKWARD_COMPAT: Constructor with no parameters must work
223
+
224
+ Task 2: MODIFY src/core/logger.ts - Handle Recursive Observer Error
225
+ - ADD: private emitWithoutObserverNotification(entry: LogEntry) method
226
+ - IMPLEMENTATION: Direct this.node.logs.push(entry), bypass emit()
227
+ - MODIFY: emit() catch block - replace console.error:27
228
+ - PATTERN: this.emitWithoutObserverNotification(errorEntry) to avoid recursion
229
+ - ENTRY_STRUCTURE: { id, workflowId, timestamp, level: 'error', message, data: { error } }
230
+
231
+ Task 3: MODIFY src/core/workflow.ts - Replace Observer Error Logging
232
+ - MODIFY: emitEvent() at line 376
233
+ - REPLACE: console.error('Observer onEvent error:', err)
234
+ - WITH: this.logger.error('Observer onEvent error', { error: err, eventType: event.type })
235
+ - MODIFY: snapshotState() at line 394
236
+ - REPLACE: console.error('Observer onStateUpdated error:', err)
237
+ - WITH: this.logger.error('Observer onStateUpdated error', { error: err, nodeId: this.node.id })
238
+ - PRESERVE: Lines 277, 286 validation error console.error calls
239
+ - GOTCHA: Get observers before loop: const observers = this.getRootObservers()
240
+
241
+ Task 4: MODIFY src/debugger/tree-debugger.ts - Update Observable Constructor
242
+ - MODIFY: line 41 - new Observable<WorkflowEvent>()
243
+ - WITH: new Observable<WorkflowEvent>(undefined) or pass logger if available
244
+ - NOTE: WorkflowTreeDebugger is observer, doesn't have logger access
245
+ - DECISION: Pass undefined to use console.error fallback (acceptable for debugger)
246
+
247
+ Task 5: CREATE src/__tests__/unit/observable.test.ts
248
+ - IMPLEMENT: Test Observable error logging with logger injection
249
+ - IMPLEMENT: Test Observable error logging without logger (fallback)
250
+ - IMPLEMENT: Test subscriber next() error handling
251
+ - IMPLEMENT: Test subscriber error() error handling
252
+ - IMPLEMENT: Test subscriber complete() error handling
253
+ - PATTERN: Mock logger, verify logger.error called with correct parameters
254
+ - PATTERN: Use vi.fn() for logger mock, expect(logger.error).toHaveBeenCalledWith()
255
+
256
+ Task 6: CREATE src/__tests__/integration/observer-logging.test.ts
257
+ - IMPLEMENT: Test WorkflowLogger observer onLog error logging
258
+ - IMPLEMENT: Test Workflow observer onEvent error logging
259
+ - IMPLEMENT: Test Workflow observer onStateUpdated error logging
260
+ - IMPLEMENT: Test validation errors still use console.error (lines 277, 286)
261
+ - PATTERN: Create throwing observer, verify error logged to workflow.node.logs
262
+ - PATTERN: Use vi.spyOn(console, 'error') to verify validation errors
263
+ ```
264
+
265
+ ### Implementation Patterns & Key Details
266
+
267
+ ```typescript
268
+ // Pattern 1: Observable Logger Injection (src/utils/observable.ts)
269
+
270
+ export interface ObservableLogger {
271
+ error(message: string, data?: unknown): void;
272
+ }
273
+
274
+ export class Observable<T> {
275
+ private subscribers: Set<Observer<T>> = new Set();
276
+ private logger?: ObservableLogger;
277
+
278
+ constructor(logger?: ObservableLogger) {
279
+ this.logger = logger;
280
+ }
281
+
282
+ private logError(message: string, error: unknown): void {
283
+ if (this.logger) {
284
+ this.logger.error(message, { error });
285
+ } else {
286
+ // Fallback for backward compatibility
287
+ console.error(message, error);
288
+ }
289
+ }
290
+
291
+ next(value: T): void {
292
+ for (const subscriber of this.subscribers) {
293
+ try {
294
+ subscriber.next?.(value);
295
+ } catch (err) {
296
+ this.logError('Observable subscriber error', err);
297
+ }
298
+ }
299
+ }
300
+
301
+ // Same pattern for error() and complete()
302
+ }
303
+
304
+ // Pattern 2: WorkflowLogger Recursive Error Handling (src/core/logger.ts)
305
+
306
+ export class WorkflowLogger {
307
+ // ... existing code ...
308
+
309
+ private emitWithoutObserverNotification(entry: LogEntry): void {
310
+ // Direct push to avoid infinite recursion
311
+ this.node.logs.push(entry);
312
+ }
313
+
314
+ private emit(entry: LogEntry): void {
315
+ this.node.logs.push(entry);
316
+ for (const obs of this.observers) {
317
+ try {
318
+ obs.onLog(entry);
319
+ } catch (err) {
320
+ // Create error entry and emit without observer notification
321
+ const errorEntry: LogEntry = {
322
+ id: generateId(),
323
+ workflowId: this.node.id,
324
+ timestamp: Date.now(),
325
+ level: 'error',
326
+ message: 'Observer onLog error',
327
+ data: { error: err },
328
+ };
329
+ this.emitWithoutObserverNotification(errorEntry);
330
+ }
331
+ }
332
+ }
333
+ }
334
+
335
+ // Pattern 3: Workflow Observer Error Logging (src/core/workflow.ts)
336
+
337
+ export class Workflow {
338
+ protected readonly logger: WorkflowLogger;
339
+
340
+ public emitEvent(event: WorkflowEvent): void {
341
+ this.node.events.push(event);
342
+ const observers = this.getRootObservers();
343
+
344
+ for (const obs of observers) {
345
+ try {
346
+ obs.onEvent(event);
347
+ if (event.type === 'treeUpdated' || event.type === 'childAttached' || event.type === 'childDetached') {
348
+ obs.onTreeChanged(this.getRoot().node);
349
+ }
350
+ } catch (err) {
351
+ this.logger.error('Observer onEvent error', { error: err, eventType: event.type });
352
+ }
353
+ }
354
+ }
355
+
356
+ public snapshotState(): void {
357
+ const snapshot = getObservedState(this);
358
+ this.node.stateSnapshot = snapshot;
359
+ const observers = this.getRootObservers();
360
+
361
+ for (const obs of observers) {
362
+ try {
363
+ obs.onStateUpdated(this.node);
364
+ } catch (err) {
365
+ this.logger.error('Observer onStateUpdated error', { error: err, nodeId: this.node.id });
366
+ }
367
+ }
368
+
369
+ this.emitEvent({ type: 'stateSnapshot', node: this.node });
370
+ this.emitEvent({ type: 'treeUpdated', root: this.getRoot().node });
371
+ }
372
+ }
373
+ ```
374
+
375
+ ### Integration Points
376
+
377
+ ```yaml
378
+ BREAKING_CHANGES: None - Observable constructor change is backward compatible
379
+
380
+ OBSERVABLE_CONSTRUCTOR:
381
+ - file: src/debugger/tree-debugger.ts:41
382
+ - change: new Observable<WorkflowEvent>() -> new Observable<WorkflowEvent>(undefined)
383
+ - reason: Explicit undefined for optional parameter (no logger available in context)
384
+
385
+ TYPES_IMPORT:
386
+ - file: src/utils/observable.ts
387
+ - note: May need to import generateId if creating LogEntry in Observable
388
+ - alternative: Use ObservableLogger interface instead of creating LogEntry directly
389
+
390
+ TEST_MOCKS:
391
+ - pattern: Use vi.fn() for logger mocks
392
+ - example: const mockLogger = { error: vi.fn() };
393
+ ```
394
+
395
+ ## Validation Loop
396
+
397
+ ### Level 1: Syntax & Style (Immediate Feedback)
398
+
399
+ ```bash
400
+ # Run after each file modification - fix before proceeding
401
+ npm run lint -- src/utils/observable.ts
402
+ npm run lint -- src/core/logger.ts
403
+ npm run lint -- src/core/workflow.ts
404
+
405
+ # Type checking
406
+ npm run type-check
407
+
408
+ # Project-wide validation
409
+ npm run lint
410
+ npm run type-check
411
+
412
+ # Expected: Zero errors. If errors exist, READ output and fix before proceeding.
413
+ ```
414
+
415
+ ### Level 2: Unit Tests (Component Validation)
416
+
417
+ ```bash
418
+ # Test Observable class changes
419
+ npm test -- src/__tests__/unit/observable.test.ts
420
+
421
+ # Test logger changes
422
+ npm test -- src/__tests__/unit/logger.test.ts
423
+
424
+ # Test all unit tests
425
+ npm test -- src/__tests__/unit/
426
+
427
+ # Coverage validation (if available)
428
+ npm run test:coverage
429
+
430
+ # Expected: All tests pass. If failing, debug root cause and fix implementation.
431
+ ```
432
+
433
+ ### Level 3: Integration Testing (System Validation)
434
+
435
+ ```bash
436
+ # Run all tests to verify no regressions
437
+ npm test
438
+
439
+ # Verify observer error logging integration tests
440
+ npm test -- src/__tests__/integration/observer-logging.test.ts
441
+
442
+ # Expected: All tests pass, observer errors logged correctly
443
+ ```
444
+
445
+ ### Level 4: Manual Verification
446
+
447
+ ```bash
448
+ # Create test workflow to verify observer error logging
449
+ # Run test and check that observer errors appear in workflow.node.logs
450
+ # Verify that console.error is NOT called for observer errors
451
+ # Verify that console.error IS still called for validation errors (lines 277, 286)
452
+
453
+ # Check that Observable works with and without logger
454
+ # Create Observable with logger - verify errors logged
455
+ # Create Observable without logger - verify console.error fallback
456
+
457
+ # Expected: Observer errors in logs, validation errors in console
458
+ ```
459
+
460
+ ## Final Validation Checklist
461
+
462
+ ### Technical Validation
463
+
464
+ - [ ] All 6 observer-related console.error calls replaced
465
+ - [ ] 2 validation error console.error calls preserved (workflow.ts:277, 286)
466
+ - [ ] All tests pass: `npm test`
467
+ - [ ] No linting errors: `npm run lint`
468
+ - [ ] No type errors: `npm run type-check`
469
+ - [ ] Observable backward compatibility maintained
470
+
471
+ ### Feature Validation
472
+
473
+ - [ ] Observer onLog errors logged to WorkflowLogger (logger.ts:27)
474
+ - [ ] Observer onEvent errors logged via this.logger.error (workflow.ts:376)
475
+ - [ ] Observer onStateUpdated errors logged via this.logger.error (workflow.ts:394)
476
+ - [ ] Observable next/errors/complete errors use logger injection (observable.ts:39,52,65)
477
+ - [ ] Observable console.error fallback works without logger
478
+ - [ ] Validation errors still use console.error (immediate visibility before throw)
479
+
480
+ ### Code Quality Validation
481
+
482
+ - [ ] Follows existing logger.error() signature: `error(message, data?)`
483
+ - [ ] Error context includes structured data (error, event type, node info)
484
+ - [ ] No infinite recursion in WorkflowLogger.emit()
485
+ - [ ] Observable constructor backward compatible (optional logger)
486
+ - [ ] Observer error isolation preserved (observer throws don't crash workflow)
487
+
488
+ ### Test Coverage
489
+
490
+ - [ ] Observable error logging with/without logger tested
491
+ - [ ] WorkflowLogger observer onLog error tested
492
+ - [ ] Workflow observer onEvent error tested
493
+ - [ ] Workflow observer onStateUpdated error tested
494
+ - [ ] Validation error console.error preservation tested
495
+ - [ ] Error isolation verified (observer throws don't crash)
496
+
497
+ ---
498
+
499
+ ## Anti-Patterns to Avoid
500
+
501
+ - ❌ Don't call this.log() from within WorkflowLogger.emit() catch block (infinite recursion)
502
+ - ❌ Don't remove validation error console.error calls (lines 277, 286 in workflow.ts)
503
+ - ❌ Don't make Observable logger parameter required (breaks backward compatibility)
504
+ - ❌ Don't let observer errors propagate outside try-catch (crashes workflow)
505
+ - ❌ Don't use console.log for any of the replacements (must use logger.error)
506
+ - ❌ Don't forget to include error context in data parameter