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,603 +0,0 @@
|
|
|
1
|
-
# Workflow Engine Test References for Concurrent Failures
|
|
2
|
-
|
|
3
|
-
## Repository Quick Links
|
|
4
|
-
|
|
5
|
-
### Apache Airflow
|
|
6
|
-
- **Main Repo**: https://github.com/apache/airflow
|
|
7
|
-
- **Key Test Files**:
|
|
8
|
-
- `tests/models/test_taskinstance.py` - Task failure states
|
|
9
|
-
- `tests/executors/test_local_executor.py` - Concurrent task execution
|
|
10
|
-
- `tests/dag_processing/test_dag_run.py` - DAG-level failures
|
|
11
|
-
- `tests/www/views/test_views.py` - UI error display
|
|
12
|
-
|
|
13
|
-
### Temporal
|
|
14
|
-
- **Main Repo**: https://github.com/temporalio/sdk-python
|
|
15
|
-
- **Key Test Files**:
|
|
16
|
-
- `tests/worker/workflow_tests/test_child_workflow.py` - Child workflows
|
|
17
|
-
- `tests/worker/workflow_tests/test_workflow_replay.py` - Failure recovery
|
|
18
|
-
- `tests/worker/activity_tests/test_activity.py` - Activity failures
|
|
19
|
-
|
|
20
|
-
### Prefect
|
|
21
|
-
- **Main Repo**: https://github.com/PrefectHQ/prefect
|
|
22
|
-
- **Key Test Files**:
|
|
23
|
-
- `tests/tasks/test_task_runners.py` - Concurrent execution
|
|
24
|
-
- `tests/orchestration/test_task_runs.py` - State tracking
|
|
25
|
-
- `tests/engine/test_execution.py` - Engine failure handling
|
|
26
|
-
|
|
27
|
-
### Dagster
|
|
28
|
-
- **Main Repo**: https://github.com/dagster-io/dagster
|
|
29
|
-
- **Key Test Files**:
|
|
30
|
-
- `dagster_tests/core_tests/execution_tests/` - Execution patterns
|
|
31
|
-
- `dagster_tests/core_tests/composite_tests/` - Composite solids
|
|
32
|
-
|
|
33
|
-
### Node.js Promise Tests
|
|
34
|
-
- **Main Repo**: https://github.com/nodejs/node
|
|
35
|
-
- **Key Test Files**:
|
|
36
|
-
- `test/parallel/test-promise-all-settled.js` - allSettled behavior
|
|
37
|
-
- `test/parallel/test-promise-any.js` - Promise.any patterns
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Common Testing Patterns by Engine
|
|
42
|
-
|
|
43
|
-
### 1. Airflow: TaskInstance State Tracking
|
|
44
|
-
|
|
45
|
-
**Location**: `tests/models/test_taskinstance.py`
|
|
46
|
-
|
|
47
|
-
```python
|
|
48
|
-
def test_concurrent_task_failure_states(self):
|
|
49
|
-
"""
|
|
50
|
-
Test that multiple task instances can fail concurrently
|
|
51
|
-
while others succeed, and all states are tracked correctly.
|
|
52
|
-
"""
|
|
53
|
-
dag = DAG(
|
|
54
|
-
'test_concurrent_failures',
|
|
55
|
-
default_args={
|
|
56
|
-
'owner': 'airflow',
|
|
57
|
-
'start_date': datetime(2024, 1, 1),
|
|
58
|
-
'retries': 0,
|
|
59
|
-
}
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
# Create tasks with different outcomes
|
|
63
|
-
tasks = []
|
|
64
|
-
for i in range(10):
|
|
65
|
-
task = PythonOperator(
|
|
66
|
-
task_id=f'task_{i}',
|
|
67
|
-
python_callable=execute_task,
|
|
68
|
-
op_args=[i],
|
|
69
|
-
dag=dag
|
|
70
|
-
)
|
|
71
|
-
tasks.append(task)
|
|
72
|
-
|
|
73
|
-
# Execute
|
|
74
|
-
dr = dag.create_dagrun(
|
|
75
|
-
run_id='test_run',
|
|
76
|
-
execution_date=datetime(2024, 1, 1),
|
|
77
|
-
state=State.RUNNING
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
# Run tasks
|
|
81
|
-
for task in tasks:
|
|
82
|
-
ti = TaskInstance(task, run_id=dr.run_id)
|
|
83
|
-
ti.run(ignore_ti_state=True)
|
|
84
|
-
|
|
85
|
-
# Assert: All task instances have a state
|
|
86
|
-
tis = dr.get_task_instances()
|
|
87
|
-
assert len(tis) == 10
|
|
88
|
-
|
|
89
|
-
# Assert: Count failures and successes
|
|
90
|
-
failed = [ti for ti in tis if ti.state == State.FAILED]
|
|
91
|
-
success = [ti for ti in tis if ti.state == State.SUCCESS]
|
|
92
|
-
|
|
93
|
-
assert len(failed) == expected_failures
|
|
94
|
-
assert len(success) == expected_successes
|
|
95
|
-
|
|
96
|
-
# Assert: No task instances in RUNNING state (all settled)
|
|
97
|
-
running = [ti for ti in tis if ti.state == State.RUNNING]
|
|
98
|
-
assert len(running) == 0
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
**Key Assertions**:
|
|
102
|
-
- All task instances have a terminal state
|
|
103
|
-
- Correct count of failures vs successes
|
|
104
|
-
- No tasks left in RUNNING state
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
### 2. Temporal: Child Workflow Error Collection
|
|
109
|
-
|
|
110
|
-
**Location**: `tests/worker/workflow_tests/test_child_workflow.py`
|
|
111
|
-
|
|
112
|
-
```python
|
|
113
|
-
@workflow.defn
|
|
114
|
-
class ParentWorkflow:
|
|
115
|
-
@workflow.run
|
|
116
|
-
async def run(self) -> dict[str, Any]:
|
|
117
|
-
# Start multiple child workflows
|
|
118
|
-
handles = [
|
|
119
|
-
workflow.start_child_workflow(
|
|
120
|
-
ChildWorkflow,
|
|
121
|
-
id=f"child-{i}",
|
|
122
|
-
task_queue="test-queue"
|
|
123
|
-
)
|
|
124
|
-
for i in range(5)
|
|
125
|
-
]
|
|
126
|
-
|
|
127
|
-
# Wait for all children with exception collection
|
|
128
|
-
results = []
|
|
129
|
-
errors = []
|
|
130
|
-
|
|
131
|
-
for handle in handles:
|
|
132
|
-
try:
|
|
133
|
-
result = await handle.result()
|
|
134
|
-
results.append(result)
|
|
135
|
-
except ApplicationError as e:
|
|
136
|
-
errors.append({
|
|
137
|
-
'child_id': handle.id,
|
|
138
|
-
'error': e.message,
|
|
139
|
-
'details': e.details
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
# Return aggregated results
|
|
143
|
-
return {
|
|
144
|
-
'results': results,
|
|
145
|
-
'errors': errors,
|
|
146
|
-
'total': len(handles)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
# Test
|
|
150
|
-
async def test_child_workflow_error_collection():
|
|
151
|
-
# Create a workflow that will fail specific children
|
|
152
|
-
async def test_workflow():
|
|
153
|
-
result = await ParentWorkflow.run()
|
|
154
|
-
assert result['total'] == 5
|
|
155
|
-
assert len(result['results']) + len(result['errors']) == 5
|
|
156
|
-
assert all('child_id' in e for e in result['errors'])
|
|
157
|
-
|
|
158
|
-
# Execute test
|
|
159
|
-
await execute_workflow(test_workflow)
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
**Key Assertions**:
|
|
163
|
-
- Total children = results + errors (all accounted for)
|
|
164
|
-
- Each error has child identifier
|
|
165
|
-
- No orphaned child workflows
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
### 3. Prefect: State Aggregation for Concurrent Tasks
|
|
170
|
-
|
|
171
|
-
**Location**: `tests/tasks/test_task_runners.py`
|
|
172
|
-
|
|
173
|
-
```python
|
|
174
|
-
async def test_concurrent_task_state_aggregation():
|
|
175
|
-
"""
|
|
176
|
-
Test that all task states are aggregated correctly
|
|
177
|
-
when multiple tasks run concurrently with mixed outcomes.
|
|
178
|
-
"""
|
|
179
|
-
|
|
180
|
-
@task
|
|
181
|
-
async def failing_task(task_id: str):
|
|
182
|
-
raise ValueError(f"Task {task_id} failed")
|
|
183
|
-
|
|
184
|
-
@task
|
|
185
|
-
async def succeeding_task(task_id: str):
|
|
186
|
-
return f"Task {task_id} succeeded"
|
|
187
|
-
|
|
188
|
-
# Create task runs with mixed outcomes
|
|
189
|
-
task_runs = []
|
|
190
|
-
|
|
191
|
-
for i in range(10):
|
|
192
|
-
if i % 3 == 0:
|
|
193
|
-
# Every 3rd task fails
|
|
194
|
-
task_runs.append(failing_task(f"task-{i}"))
|
|
195
|
-
else:
|
|
196
|
-
task_runs.append(succeeding_task(f"task-{i}"))
|
|
197
|
-
|
|
198
|
-
# Run all tasks concurrently
|
|
199
|
-
results = await asyncio.gather(
|
|
200
|
-
*task_runs,
|
|
201
|
-
return_exceptions=True
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
# Aggregate states
|
|
205
|
-
failed = [r for r in results if isinstance(r, Exception)]
|
|
206
|
-
succeeded = [r for r in results if not isinstance(r, Exception)]
|
|
207
|
-
|
|
208
|
-
# Assert: All tasks completed
|
|
209
|
-
assert len(failed) + len(succeeded) == 10
|
|
210
|
-
|
|
211
|
-
# Assert: Expected failure count
|
|
212
|
-
assert len(failed) == 4 # 0, 3, 6, 9
|
|
213
|
-
|
|
214
|
-
# Assert: Expected success count
|
|
215
|
-
assert len(succeeded) == 6
|
|
216
|
-
|
|
217
|
-
# Assert: All error messages are distinct
|
|
218
|
-
error_messages = [str(e) for e in failed]
|
|
219
|
-
assert len(set(error_messages)) == 4
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
**Key Assertions**:
|
|
223
|
-
- Total results = failed + succeeded
|
|
224
|
-
- Correct counts for each state
|
|
225
|
-
- Distinct error messages
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
### 4. Node.js: Promise.allSettled Edge Cases
|
|
230
|
-
|
|
231
|
-
**Location**: `test/parallel/test-promise-all-settled.js`
|
|
232
|
-
|
|
233
|
-
```javascript
|
|
234
|
-
// Test 1: All promises rejected
|
|
235
|
-
assert.rejects(
|
|
236
|
-
Promise.all([
|
|
237
|
-
Promise.reject(1),
|
|
238
|
-
Promise.reject(2),
|
|
239
|
-
Promise.reject(3)
|
|
240
|
-
]),
|
|
241
|
-
{ 1: 1 }
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
// Test 2: Mixed rejection/fulfillment
|
|
245
|
-
const input = [
|
|
246
|
-
Promise.resolve(1),
|
|
247
|
-
Promise.reject('err1'),
|
|
248
|
-
Promise.resolve(2),
|
|
249
|
-
Promise.reject('err2'),
|
|
250
|
-
Promise.resolve(3)
|
|
251
|
-
];
|
|
252
|
-
|
|
253
|
-
Promise.allSettled(input).then((results) => {
|
|
254
|
-
// Assert: All promises settled
|
|
255
|
-
assert.strictEqual(results.length, 5);
|
|
256
|
-
|
|
257
|
-
// Assert: Verify status distribution
|
|
258
|
-
const fulfilled = results.filter(r => r.status === 'fulfilled');
|
|
259
|
-
const rejected = results.filter(r => r.status === 'rejected');
|
|
260
|
-
|
|
261
|
-
assert.strictEqual(fulfilled.length, 3);
|
|
262
|
-
assert.strictEqual(rejected.length, 2);
|
|
263
|
-
|
|
264
|
-
// Assert: Values preserved in order
|
|
265
|
-
assert.deepStrictEqual(
|
|
266
|
-
fulfilled.map(r => r.value),
|
|
267
|
-
[1, 2, 3]
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
// Assert: Reasons preserved in order
|
|
271
|
-
assert.deepStrictEqual(
|
|
272
|
-
rejected.map(r => r.reason),
|
|
273
|
-
['err1', 'err2']
|
|
274
|
-
);
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
// Test 3: Empty input
|
|
278
|
-
Promise.allSettled([]).then((results) => {
|
|
279
|
-
assert.deepStrictEqual(results, []);
|
|
280
|
-
assert.strictEqual(results.length, 0);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
// Test 4: All non-thenables
|
|
284
|
-
Promise.allSettled([1, 2, 3]).then((results) => {
|
|
285
|
-
assert.strictEqual(results.length, 3);
|
|
286
|
-
results.forEach((result) => {
|
|
287
|
-
assert.strictEqual(result.status, 'fulfilled');
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
// Test 5: Already settled promises
|
|
292
|
-
const settledPromise = Promise.resolve('already settled');
|
|
293
|
-
Promise.allSettled([settledPromise]).then((results) => {
|
|
294
|
-
assert.strictEqual(results[0].status, 'fulfilled');
|
|
295
|
-
assert.strictEqual(results[0].value, 'already settled');
|
|
296
|
-
});
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
**Key Assertions**:
|
|
300
|
-
- All promises in result array
|
|
301
|
-
- Statuses correct (fulfilled vs rejected)
|
|
302
|
-
- Values/reasons preserved
|
|
303
|
-
- Handles empty and non-thenable inputs
|
|
304
|
-
|
|
305
|
-
---
|
|
306
|
-
|
|
307
|
-
## Test Helpers by Engine
|
|
308
|
-
|
|
309
|
-
### Airflow: State Verification Helper
|
|
310
|
-
|
|
311
|
-
```python
|
|
312
|
-
def verify_dag_run_states(dag_run: DagRun, expected: Dict[str, int]):
|
|
313
|
-
"""
|
|
314
|
-
Helper to verify DAG run has expected state distribution.
|
|
315
|
-
|
|
316
|
-
Args:
|
|
317
|
-
dag_run: DAG run to verify
|
|
318
|
-
expected: Dict mapping state to expected count
|
|
319
|
-
e.g., {'success': 7, 'failed': 3}
|
|
320
|
-
"""
|
|
321
|
-
tis = dag_run.get_task_instances()
|
|
322
|
-
|
|
323
|
-
# Count actual states
|
|
324
|
-
actual_counts = {}
|
|
325
|
-
for ti in tis:
|
|
326
|
-
state = ti.state
|
|
327
|
-
actual_counts[state] = actual_counts.get(state, 0) + 1
|
|
328
|
-
|
|
329
|
-
# Verify each expected state count
|
|
330
|
-
for state, expected_count in expected.items():
|
|
331
|
-
actual_count = actual_counts.get(state, 0)
|
|
332
|
-
assert actual_count == expected_count, (
|
|
333
|
-
f"Expected {expected_count} tasks in state {state}, "
|
|
334
|
-
f"but found {actual_count}"
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
# Verify all tasks accounted for
|
|
338
|
-
total_expected = sum(expected.values())
|
|
339
|
-
total_actual = len(tis)
|
|
340
|
-
assert total_actual == total_expected, (
|
|
341
|
-
f"Expected {total_expected} task instances, "
|
|
342
|
-
f"but found {total_actual}"
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
# Verify no tasks in non-terminal states
|
|
346
|
-
non_terminal = [
|
|
347
|
-
state for state in actual_counts.keys()
|
|
348
|
-
if state not in [State.SUCCESS, State.FAILED, State.SKIPPED]
|
|
349
|
-
]
|
|
350
|
-
assert len(non_terminal) == 0, (
|
|
351
|
-
f"Found tasks in non-terminal states: {non_terminal}"
|
|
352
|
-
)
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
### Temporal: Error Aggregation Helper
|
|
358
|
-
|
|
359
|
-
```python
|
|
360
|
-
@dataclass
|
|
361
|
-
class ChildWorkflowError:
|
|
362
|
-
child_id: str
|
|
363
|
-
error_type: str
|
|
364
|
-
message: str
|
|
365
|
-
details: Dict[str, Any]
|
|
366
|
-
|
|
367
|
-
@dataclass
|
|
368
|
-
class ChildWorkflowResult:
|
|
369
|
-
child_id: str
|
|
370
|
-
result: Any
|
|
371
|
-
status: str
|
|
372
|
-
|
|
373
|
-
def aggregate_child_results(
|
|
374
|
-
handles: List[ChildWorkflowHandle]
|
|
375
|
-
) -> Dict[str, Any]:
|
|
376
|
-
"""
|
|
377
|
-
Aggregate results from multiple child workflows,
|
|
378
|
-
collecting both successes and failures.
|
|
379
|
-
|
|
380
|
-
Returns:
|
|
381
|
-
Dict with 'results', 'errors', and 'total' keys
|
|
382
|
-
"""
|
|
383
|
-
results = []
|
|
384
|
-
errors = []
|
|
385
|
-
|
|
386
|
-
for handle in handles:
|
|
387
|
-
try:
|
|
388
|
-
result = handle.result()
|
|
389
|
-
results.append(ChildWorkflowResult(
|
|
390
|
-
child_id=handle.id,
|
|
391
|
-
result=result,
|
|
392
|
-
status='completed'
|
|
393
|
-
))
|
|
394
|
-
except Exception as e:
|
|
395
|
-
errors.append(ChildWorkflowError(
|
|
396
|
-
child_id=handle.id,
|
|
397
|
-
error_type=type(e).__name__,
|
|
398
|
-
message=str(e),
|
|
399
|
-
details=getattr(e, 'details', {})
|
|
400
|
-
))
|
|
401
|
-
|
|
402
|
-
return {
|
|
403
|
-
'results': results,
|
|
404
|
-
'errors': errors,
|
|
405
|
-
'total': len(handles),
|
|
406
|
-
'success_count': len(results),
|
|
407
|
-
'error_count': len(errors)
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
# Test helper
|
|
411
|
-
def assert_child_execution_complete(aggregation: Dict[str, Any]):
|
|
412
|
-
"""
|
|
413
|
-
Assert that all child workflows completed.
|
|
414
|
-
"""
|
|
415
|
-
assert aggregation['total'] > 0, "No child workflows executed"
|
|
416
|
-
|
|
417
|
-
total_accounted = aggregation['success_count'] + aggregation['error_count']
|
|
418
|
-
assert total_accounted == aggregation['total'], (
|
|
419
|
-
f"Not all children accounted for: "
|
|
420
|
-
f"{aggregation['total']} total, {total_accounted} accounted"
|
|
421
|
-
)
|
|
422
|
-
|
|
423
|
-
# Verify all errors have child_id
|
|
424
|
-
for error in aggregation['errors']:
|
|
425
|
-
assert error.child_id, "Error missing child_id"
|
|
426
|
-
assert error.message, "Error missing message"
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
---
|
|
430
|
-
|
|
431
|
-
### Prefect: Promise.allSettled-like Helper
|
|
432
|
-
|
|
433
|
-
```python
|
|
434
|
-
from typing import Any, List, Tuple
|
|
435
|
-
from prefect import task
|
|
436
|
-
|
|
437
|
-
async def run_tasks_with_settlement(
|
|
438
|
-
tasks: List[Coroutine]
|
|
439
|
-
) -> Tuple[List[Any], List[Exception]]:
|
|
440
|
-
"""
|
|
441
|
-
Run all tasks to completion, collecting both
|
|
442
|
-
successful results and failures.
|
|
443
|
-
|
|
444
|
-
Similar to Promise.allSettled in JavaScript.
|
|
445
|
-
|
|
446
|
-
Returns:
|
|
447
|
-
Tuple of (successful_results, failures)
|
|
448
|
-
"""
|
|
449
|
-
# Run all tasks, catching exceptions
|
|
450
|
-
results = await asyncio.gather(
|
|
451
|
-
*tasks,
|
|
452
|
-
return_exceptions=True
|
|
453
|
-
)
|
|
454
|
-
|
|
455
|
-
# Separate successes from failures
|
|
456
|
-
successes = []
|
|
457
|
-
failures = []
|
|
458
|
-
|
|
459
|
-
for result in results:
|
|
460
|
-
if isinstance(result, Exception):
|
|
461
|
-
failures.append(result)
|
|
462
|
-
else:
|
|
463
|
-
successes.append(result)
|
|
464
|
-
|
|
465
|
-
return successes, failures
|
|
466
|
-
|
|
467
|
-
# Test helper
|
|
468
|
-
def assert_settlement_counts(
|
|
469
|
-
successes: List[Any],
|
|
470
|
-
failures: List[Exception],
|
|
471
|
-
expected_successes: int,
|
|
472
|
-
expected_failures: int
|
|
473
|
-
):
|
|
474
|
-
"""
|
|
475
|
-
Assert expected counts of successes and failures.
|
|
476
|
-
"""
|
|
477
|
-
assert len(successes) == expected_successes, (
|
|
478
|
-
f"Expected {expected_successes} successes, "
|
|
479
|
-
f"got {len(successes)}"
|
|
480
|
-
)
|
|
481
|
-
|
|
482
|
-
assert len(failures) == expected_failures, (
|
|
483
|
-
f"Expected {expected_failures} failures, "
|
|
484
|
-
f"got {len(failures)}"
|
|
485
|
-
)
|
|
486
|
-
|
|
487
|
-
# Assert all error messages are unique
|
|
488
|
-
error_messages = [str(e) for e in failures]
|
|
489
|
-
assert len(set(error_messages)) == len(error_messages), (
|
|
490
|
-
"Some error messages are duplicates"
|
|
491
|
-
)
|
|
492
|
-
```
|
|
493
|
-
|
|
494
|
-
---
|
|
495
|
-
|
|
496
|
-
## Observable Testing Patterns
|
|
497
|
-
|
|
498
|
-
### Event Tracking Template
|
|
499
|
-
|
|
500
|
-
```python
|
|
501
|
-
class EventTracker:
|
|
502
|
-
"""
|
|
503
|
-
Helper to track events during concurrent workflow execution.
|
|
504
|
-
"""
|
|
505
|
-
|
|
506
|
-
def __init__(self):
|
|
507
|
-
self.events = []
|
|
508
|
-
|
|
509
|
-
def track_event(self, event_type: str, **kwargs):
|
|
510
|
-
"""Record an event with timestamp and metadata."""
|
|
511
|
-
self.events.append({
|
|
512
|
-
'type': event_type,
|
|
513
|
-
'timestamp': time.time(),
|
|
514
|
-
**kwargs
|
|
515
|
-
})
|
|
516
|
-
|
|
517
|
-
def get_events_by_type(self, event_type: str) -> List[Dict]:
|
|
518
|
-
"""Get all events of a specific type."""
|
|
519
|
-
return [e for e in self.events if e['type'] == event_type]
|
|
520
|
-
|
|
521
|
-
def assert_event_count(self, event_type: str, expected_count: int):
|
|
522
|
-
"""Assert expected number of events of a type."""
|
|
523
|
-
actual = len(self.get_events_by_type(event_type))
|
|
524
|
-
assert actual == expected_count, (
|
|
525
|
-
f"Expected {expected_count} {event_type} events, "
|
|
526
|
-
f"got {actual}"
|
|
527
|
-
)
|
|
528
|
-
|
|
529
|
-
def assert_event_sequence(self, expected_sequence: List[str]):
|
|
530
|
-
"""Assert events occurred in expected order."""
|
|
531
|
-
actual_sequence = [e['type'] for e in self.events]
|
|
532
|
-
assert actual_sequence == expected_sequence, (
|
|
533
|
-
f"Event sequence mismatch.\n"
|
|
534
|
-
f"Expected: {expected_sequence}\n"
|
|
535
|
-
f"Actual: {actual_sequence}"
|
|
536
|
-
)
|
|
537
|
-
|
|
538
|
-
def assert_all_children_accounted(self, child_count: int):
|
|
539
|
-
"""Assert all child workflows have terminal events."""
|
|
540
|
-
completed = len(self.get_events_by_type('child_completed'))
|
|
541
|
-
failed = len(self.get_events_by_type('child_failed'))
|
|
542
|
-
|
|
543
|
-
assert completed + failed == child_count, (
|
|
544
|
-
f"Not all children accounted for. "
|
|
545
|
-
f"Expected {child_count}, got {completed + failed}"
|
|
546
|
-
)
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
---
|
|
550
|
-
|
|
551
|
-
## Performance Testing Patterns
|
|
552
|
-
|
|
553
|
-
### Timeout Protection Template
|
|
554
|
-
|
|
555
|
-
```typescript
|
|
556
|
-
/**
|
|
557
|
-
* Helper to run workflows with timeout protection
|
|
558
|
-
* to detect hanging promises.
|
|
559
|
-
*/
|
|
560
|
-
async function runWithTimeout<T>(
|
|
561
|
-
promise: Promise<T>,
|
|
562
|
-
timeoutMs: number,
|
|
563
|
-
errorMessage: string = 'Operation timed out'
|
|
564
|
-
): Promise<T> {
|
|
565
|
-
const timeout = new Promise<never>((_, reject) =>
|
|
566
|
-
setTimeout(() => reject(new Error(errorMessage)), timeoutMs)
|
|
567
|
-
);
|
|
568
|
-
|
|
569
|
-
return Promise.race([promise, timeout]);
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
// Usage in test
|
|
573
|
-
it('should complete all workflows without hanging', async () => {
|
|
574
|
-
const children = createChildren(10);
|
|
575
|
-
|
|
576
|
-
const results = await runWithTimeout(
|
|
577
|
-
Promise.allSettled(children.map(c => c.run())),
|
|
578
|
-
5000, // 5 second timeout
|
|
579
|
-
'Workflows hung - some promises did not settle'
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
expect(results.length).toBe(10);
|
|
583
|
-
});
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
---
|
|
587
|
-
|
|
588
|
-
## Summary of Key Patterns
|
|
589
|
-
|
|
590
|
-
| Pattern | Purpose | Example From |
|
|
591
|
-
|---------|---------|--------------|
|
|
592
|
-
| **Promise.allSettled** | Ensure all tasks complete regardless of failures | Node.js, Prefect |
|
|
593
|
-
| **Event Tracking** | Verify errors are emitted and captured | Airflow, Temporal |
|
|
594
|
-
| **State Aggregation** | Collect final states of all concurrent tasks | Prefect, Temporal |
|
|
595
|
-
| **Count Assertions** | Verify expected failure/success counts | All engines |
|
|
596
|
-
| **Timeout Protection** | Detect hanging or orphaned workflows | Temporal, Node.js |
|
|
597
|
-
| **Error Context** | Preserve workflow info in errors | Temporal, Airflow |
|
|
598
|
-
| **Distinct Errors** | Ensure multiple failures create distinct errors | All engines |
|
|
599
|
-
| **Completion Verification** | Explicitly verify all tasks complete | All engines |
|
|
600
|
-
|
|
601
|
-
---
|
|
602
|
-
|
|
603
|
-
This document provides a reference guide for finding specific test implementations in major workflow engines. Each engine has extensive test suites that demonstrate these patterns in production code.
|