groundswell 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +86 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +204 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +203 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +833 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +127 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +323 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +61 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +358 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +543 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +986 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +240 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +620 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +192 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +344 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +1317 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +423 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +40 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +113 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +275 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +34 -5
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/CHANGELOG.md +0 -188
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -258
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/index.ts +0 -18
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/index.ts +0 -4
- package/src/utils/observable.ts +0 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -1,506 +0,0 @@
|
|
|
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
|