groundswell 0.0.2 → 0.0.3
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/dist/__tests__/adversarial/attachChild-performance.test.d.ts +16 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js +187 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts +13 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.js +92 -0
- package/dist/__tests__/adversarial/circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +16 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js +127 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +21 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js +667 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts +6 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js +877 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +13 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +186 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +6 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js +626 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts +6 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.js +857 -0
- package/dist/__tests__/adversarial/edge-case.test.js.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +20 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js +907 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts +2 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js +113 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +22 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +383 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts +21 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js +404 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts +13 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.js +128 -0
- package/dist/__tests__/adversarial/parent-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +20 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +482 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts +6 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js +886 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +22 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js +1843 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +10 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/{src/__tests__/helpers/index.ts → dist/__tests__/helpers/index.js} +2 -10
- package/dist/__tests__/helpers/index.js.map +1 -0
- package/dist/__tests__/helpers/tree-verification.d.ts +90 -0
- package/dist/__tests__/helpers/tree-verification.d.ts.map +1 -0
- package/dist/__tests__/helpers/tree-verification.js +202 -0
- package/dist/__tests__/helpers/tree-verification.js.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts +2 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.js +256 -0
- package/dist/__tests__/integration/agent-workflow.test.js.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +14 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js +668 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts +2 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.js +517 -0
- package/dist/__tests__/integration/observer-logging.test.js.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts +2 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.js +117 -0
- package/dist/__tests__/integration/tree-mirroring.test.js.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts +12 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js +239 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js.map +1 -0
- package/dist/__tests__/unit/agent.test.d.ts +2 -0
- package/dist/__tests__/unit/agent.test.d.ts.map +1 -0
- package/dist/__tests__/unit/agent.test.js +143 -0
- package/dist/__tests__/unit/agent.test.js.map +1 -0
- package/dist/__tests__/unit/cache-key.test.d.ts +5 -0
- package/dist/__tests__/unit/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache-key.test.js +145 -0
- package/dist/__tests__/unit/cache-key.test.js.map +1 -0
- package/dist/__tests__/unit/cache.test.d.ts +5 -0
- package/dist/__tests__/unit/cache.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache.test.js +132 -0
- package/dist/__tests__/unit/cache.test.js.map +1 -0
- package/dist/__tests__/unit/context.test.d.ts +2 -0
- package/dist/__tests__/unit/context.test.d.ts.map +1 -0
- package/dist/__tests__/unit/context.test.js +220 -0
- package/dist/__tests__/unit/context.test.js.map +1 -0
- package/dist/__tests__/unit/decorators.test.d.ts +2 -0
- package/dist/__tests__/unit/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/unit/decorators.test.js +162 -0
- package/dist/__tests__/unit/decorators.test.js.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts +5 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.js +191 -0
- package/dist/__tests__/unit/introspection-tools.test.js.map +1 -0
- package/dist/__tests__/unit/logger.test.d.ts +2 -0
- package/dist/__tests__/unit/logger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/logger.test.js +241 -0
- package/dist/__tests__/unit/logger.test.js.map +1 -0
- package/dist/__tests__/unit/observable.test.d.ts +2 -0
- package/dist/__tests__/unit/observable.test.d.ts.map +1 -0
- package/dist/__tests__/unit/observable.test.js +251 -0
- package/dist/__tests__/unit/observable.test.js.map +1 -0
- package/dist/__tests__/unit/prompt.test.d.ts +2 -0
- package/dist/__tests__/unit/prompt.test.d.ts.map +1 -0
- package/dist/__tests__/unit/prompt.test.js +113 -0
- package/dist/__tests__/unit/prompt.test.js.map +1 -0
- package/dist/__tests__/unit/reflection.test.d.ts +5 -0
- package/dist/__tests__/unit/reflection.test.d.ts.map +1 -0
- package/dist/__tests__/unit/reflection.test.js +160 -0
- package/dist/__tests__/unit/reflection.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js +136 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.js +69 -0
- package/dist/__tests__/unit/tree-debugger.test.js.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +2 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js +154 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js +76 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +122 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js +140 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +1 -0
- package/dist/__tests__/unit/workflow.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow.test.js +330 -0
- package/dist/__tests__/unit/workflow.test.js.map +1 -0
- package/dist/cache/cache-key.d.ts +66 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +195 -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 +112 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +426 -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 +69 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +143 -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 +57 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +263 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +241 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +464 -0
- package/dist/core/workflow.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 +71 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +198 -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 +110 -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/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -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 +329 -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 +66 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +31 -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 +87 -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/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -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/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/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/workflow-context.d.ts +139 -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/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/{src/utils/index.ts → dist/utils/index.d.ts} +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.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/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 +5 -2
- 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/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/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/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,760 +0,0 @@
|
|
|
1
|
-
# Comprehensive Research: Workflow Engine Ancestry/Descendant APIs
|
|
2
|
-
|
|
3
|
-
## Executive Summary
|
|
4
|
-
|
|
5
|
-
This document provides comprehensive research on how popular workflow engines handle ancestry and descendant checking APIs, with specific focus on:
|
|
6
|
-
1. Whether these systems expose public APIs for relationship checking
|
|
7
|
-
2. Terminology used (ancestor/descendant vs parent/child vs upstream/downstream)
|
|
8
|
-
3. Implementation patterns and design decisions
|
|
9
|
-
4. Specific code examples and documentation URLs
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 1. Apache Airflow
|
|
14
|
-
|
|
15
|
-
### Terminology
|
|
16
|
-
- **Upstream/Downstream** - Primary terms for task relationships
|
|
17
|
-
- **Dependencies** - Core concept
|
|
18
|
-
- **DAG (Directed Acyclic Graph)** - Underlying structure
|
|
19
|
-
|
|
20
|
-
### Public APIs
|
|
21
|
-
|
|
22
|
-
#### Relationship Definition (Public)
|
|
23
|
-
```python
|
|
24
|
-
# Method 1: set_upstream / set_downstream
|
|
25
|
-
task_a.set_downstream(task_b) # task_a → task_b
|
|
26
|
-
task_b.set_upstream(task_a) # equivalent
|
|
27
|
-
|
|
28
|
-
# Method 2: Bitshift operators (Pythonic)
|
|
29
|
-
task_a >> task_b # task_a upstream of task_b
|
|
30
|
-
task_b << task_a # equivalent
|
|
31
|
-
|
|
32
|
-
# Method 3: Multiple dependencies
|
|
33
|
-
task_a >> [task_b, task_c, task_d]
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
#### Relationship Querying (Limited)
|
|
37
|
-
```python
|
|
38
|
-
# Get immediate relationships
|
|
39
|
-
downstream_tasks = task.get_downstream()
|
|
40
|
-
upstream_tasks = task.get_upstream()
|
|
41
|
-
|
|
42
|
-
# Returns: Set[Task]
|
|
43
|
-
# Note: These return immediate neighbors, not full ancestry
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
**Documentation URLs:**
|
|
47
|
-
- DAG Concepts: https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html
|
|
48
|
-
- Task Instance Reference: https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html#task-instance
|
|
49
|
-
- BaseOperator API: https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/baseoperator/index.html
|
|
50
|
-
|
|
51
|
-
### API Exposure Analysis
|
|
52
|
-
- **Definition APIs**: ✅ Public (set_upstream, set_downstream, >>, <<)
|
|
53
|
-
- **Query APIs**: ⚠️ Limited (get_downstream, get_upstream - immediate only)
|
|
54
|
-
- **Ancestry Checking**: ❌ Not exposed publicly (internal graph traversal)
|
|
55
|
-
- **Descendant Checking**: ❌ Not exposed publicly
|
|
56
|
-
|
|
57
|
-
### Design Rationale
|
|
58
|
-
Airflow focuses on DAG definition and execution. Relationship querying is mostly internal because:
|
|
59
|
-
1. Users define relationships, don't typically query them
|
|
60
|
-
2. Execution history is more important than topology queries
|
|
61
|
-
3. Graph traversal is handled internally by the scheduler
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 2. Temporal
|
|
66
|
-
|
|
67
|
-
### Terminology
|
|
68
|
-
- **Parent/Child Workflows** - Explicit hierarchical relationships
|
|
69
|
-
- **Workflow Executions** - Independent units
|
|
70
|
-
- **Namespace** - Isolation boundary
|
|
71
|
-
|
|
72
|
-
### Public APIs
|
|
73
|
-
|
|
74
|
-
#### Child Workflow Creation (Public)
|
|
75
|
-
```python
|
|
76
|
-
from temporalio import workflow
|
|
77
|
-
|
|
78
|
-
@workflow.defn
|
|
79
|
-
class ParentWorkflow:
|
|
80
|
-
@workflow.run
|
|
81
|
-
async def run(self) -> None:
|
|
82
|
-
# Start child workflow
|
|
83
|
-
child_id = f"child-{workflow.uuid4()}"
|
|
84
|
-
await workflow.execute_child_workflow(
|
|
85
|
-
ChildWorkflow.run,
|
|
86
|
-
id=child_id,
|
|
87
|
-
task_queue="child-task-queue"
|
|
88
|
-
)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
#### Query Methods (Limited)
|
|
92
|
-
```python
|
|
93
|
-
# Query workflow execution (not relationships)
|
|
94
|
-
handle = client.get_workflow_handle(workflow_id)
|
|
95
|
-
result = await handle.query("get_status")
|
|
96
|
-
|
|
97
|
-
# Child workflow info (if you have the reference)
|
|
98
|
-
# No public API to check "is this workflow a descendant of that one"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
**Documentation URLs:**
|
|
102
|
-
- Child Workflows: https://docs.temporal.io/develop/python/child-workflows
|
|
103
|
-
- Workflow Concepts: https://docs.temporal.io/concepts/what-is-a-workflow-execution
|
|
104
|
-
- Python SDK: https://python.temporal.io
|
|
105
|
-
|
|
106
|
-
### API Exposure Analysis
|
|
107
|
-
- **Definition APIs**: ✅ Public (execute_child_workflow)
|
|
108
|
-
- **Query APIs**: ⚠️ Limited (execution-focused, not topology)
|
|
109
|
-
- **Ancestry Checking**: ❌ Not exposed publicly
|
|
110
|
-
- **Descendant Checking**: ❌ Not exposed publicly
|
|
111
|
-
|
|
112
|
-
### Design Rationale
|
|
113
|
-
Temporal focuses on workflow execution reliability:
|
|
114
|
-
1. Parent-child relationships are for organization, not querying
|
|
115
|
-
2. Execution history and state are primary concerns
|
|
116
|
-
3. Relationships are implicit through execution context
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 3. Prefect
|
|
121
|
-
|
|
122
|
-
### Terminology
|
|
123
|
-
- **Upstream/Downstream** - Task dependency terms
|
|
124
|
-
- **Flows** - Primary unit
|
|
125
|
-
- **Dependencies** - Relationship concept
|
|
126
|
-
|
|
127
|
-
### Public APIs
|
|
128
|
-
|
|
129
|
-
#### Dependency Definition (Public)
|
|
130
|
-
```python
|
|
131
|
-
from prefect import flow, task
|
|
132
|
-
|
|
133
|
-
@task
|
|
134
|
-
def task_a():
|
|
135
|
-
return 1
|
|
136
|
-
|
|
137
|
-
@task
|
|
138
|
-
def task_b(x):
|
|
139
|
-
return x + 1
|
|
140
|
-
|
|
141
|
-
@flow
|
|
142
|
-
def my_flow():
|
|
143
|
-
# Define dependencies
|
|
144
|
-
a = task_a()
|
|
145
|
-
b = task_b(a) # b depends on a (implicit)
|
|
146
|
-
|
|
147
|
-
# Or explicit
|
|
148
|
-
b = task_b.submit(wait_for=[a])
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
#### Relationship Querying (Limited)
|
|
152
|
-
```python
|
|
153
|
-
# Task run relationships (internal, not public API)
|
|
154
|
-
# Focus is on execution state, not topology
|
|
155
|
-
from prefect import get_run_logger
|
|
156
|
-
|
|
157
|
-
@flow
|
|
158
|
-
def query_flow():
|
|
159
|
-
# Can query state, not relationships
|
|
160
|
-
state = task_a.wait_for()
|
|
161
|
-
# No public API like "is_descendant_of()"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**Documentation URLs:**
|
|
165
|
-
- Dependencies: https://docs.prefect.io/latest/concepts/dependencies/
|
|
166
|
-
- Tasks API: https://docs.prefect.io/latest/api-ref/prefect.tasks/
|
|
167
|
-
- Flows: https://docs.prefect.io/concepts/flows/
|
|
168
|
-
|
|
169
|
-
### API Exposure Analysis
|
|
170
|
-
- **Definition APIs**: ✅ Public (through task dependencies)
|
|
171
|
-
- **Query APIs**: ⚠️ Limited (state-focused, not relationship-focused)
|
|
172
|
-
- **Ancestry Checking**: ❌ Not exposed publicly
|
|
173
|
-
- **Descendant Checking**: ❌ Not exposed publicly
|
|
174
|
-
|
|
175
|
-
### Design Rationale
|
|
176
|
-
Prefect emphasizes workflow execution and state:
|
|
177
|
-
1. Dependencies are means to execution order
|
|
178
|
-
2. Task state and results are primary
|
|
179
|
-
3. Topology queries are secondary concern
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 4. Dagster
|
|
184
|
-
|
|
185
|
-
### Terminology
|
|
186
|
-
- **Assets** - Core unit (data/software artifacts)
|
|
187
|
-
- **Lineage** - Asset dependency tracking
|
|
188
|
-
- **Dependencies** - Asset relationships
|
|
189
|
-
|
|
190
|
-
### Public APIs
|
|
191
|
-
|
|
192
|
-
#### Asset Dependencies (Public)
|
|
193
|
-
```python
|
|
194
|
-
from dagster import asset, Definitions
|
|
195
|
-
|
|
196
|
-
@asset
|
|
197
|
-
def upstream_asset():
|
|
198
|
-
return [1, 2, 3]
|
|
199
|
-
|
|
200
|
-
@asset(deps=[upstream_asset])
|
|
201
|
-
def downstream_asset(upstream_asset):
|
|
202
|
-
return upstream_asset + [4]
|
|
203
|
-
|
|
204
|
-
# Or
|
|
205
|
-
from dagster import AssetIn, AssetOut
|
|
206
|
-
|
|
207
|
-
@asset(outs=AssetOut("my_asset"))
|
|
208
|
-
def my_asset(context):
|
|
209
|
-
return context.input_assets()["upstream_asset"]
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
#### Lineage Querying (Partial)
|
|
213
|
-
```python
|
|
214
|
-
from dagster import AssetSelection
|
|
215
|
-
|
|
216
|
-
# Select assets based on dependencies
|
|
217
|
-
selection = AssetSelection.assets("upstream_asset")
|
|
218
|
-
downstream = selection.downstream() # Get downstream assets
|
|
219
|
-
upstream = selection.upstream() # Get upstream assets
|
|
220
|
-
|
|
221
|
-
# Note: This is for selection, not direct relationship checking
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Documentation URLs:**
|
|
225
|
-
- Concepts: https://docs.dagster.io/getting-started/concepts
|
|
226
|
-
- Asset Dependencies: https://docs.dagster.io/guides/dagster/asset-dependencies
|
|
227
|
-
- Asset Selection: https://docs.dagster.io/concepts/assets/asset-selection
|
|
228
|
-
|
|
229
|
-
### API Exposure Analysis
|
|
230
|
-
- **Definition APIs**: ✅ Public (asset dependencies)
|
|
231
|
-
- **Query APIs**: ⚠️ Partial (AssetSelection for navigation)
|
|
232
|
-
- **Ancestry Checking**: ⚠️ Indirect (through AssetSelection)
|
|
233
|
-
- **Descendant Checking**: ⚠️ Indirect (through AssetSelection)
|
|
234
|
-
|
|
235
|
-
### Design Rationale
|
|
236
|
-
Dagster focuses on data lineage:
|
|
237
|
-
1. Assets are primary, workflows are secondary
|
|
238
|
-
2. Lineage is important for data provenance
|
|
239
|
-
3. Selection APIs enable topology queries indirectly
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## 5. GitHub Actions
|
|
244
|
-
|
|
245
|
-
### Terminology
|
|
246
|
-
- **Jobs** - Units of work
|
|
247
|
-
- **Dependencies** - Via `needs` keyword
|
|
248
|
-
- **Workflows** - YAML-based orchestration
|
|
249
|
-
|
|
250
|
-
### Public APIs
|
|
251
|
-
|
|
252
|
-
#### Workflow Dependencies (YAML)
|
|
253
|
-
```yaml
|
|
254
|
-
jobs:
|
|
255
|
-
job_a:
|
|
256
|
-
runs-on: ubuntu-latest
|
|
257
|
-
steps:
|
|
258
|
-
- run: echo "Job A"
|
|
259
|
-
|
|
260
|
-
job_b:
|
|
261
|
-
needs: job_a # job_b depends on job_a
|
|
262
|
-
runs-on: ubuntu-latest
|
|
263
|
-
steps:
|
|
264
|
-
- run: echo "Job B"
|
|
265
|
-
|
|
266
|
-
job_c:
|
|
267
|
-
needs: [job_a, job_b] # Multiple dependencies
|
|
268
|
-
runs-on: ubuntu-latest
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
#### REST API (Querying)
|
|
272
|
-
```bash
|
|
273
|
-
# Get workflow run jobs
|
|
274
|
-
curl -X GET \
|
|
275
|
-
https://api.github.com/repos/{owner}/{repo}/actions/runs/{run_id}/jobs
|
|
276
|
-
|
|
277
|
-
# Response includes dependencies, but no "is_descendant_of" check
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
**Documentation URLs:**
|
|
281
|
-
- Workflow Syntax: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
|
|
282
|
-
- REST API: https://docs.github.com/en/rest/actions
|
|
283
|
-
- Job Dependencies: https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow
|
|
284
|
-
|
|
285
|
-
### API Exposure Analysis
|
|
286
|
-
- **Definition APIs**: ✅ Public (YAML `needs` keyword)
|
|
287
|
-
- **Query APIs**: ⚠️ Limited (REST API for execution, not topology)
|
|
288
|
-
- **Ancestry Checking**: ❌ Not exposed publicly
|
|
289
|
-
- **Descendant Checking**: ❌ Not exposed publicly
|
|
290
|
-
|
|
291
|
-
### Design Rationale
|
|
292
|
-
GitHub Actions focuses on CI/CD execution:
|
|
293
|
-
1. Workflow definition is declarative (YAML)
|
|
294
|
-
2. Execution status is primary concern
|
|
295
|
-
3. Topology queries are not a common use case
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
## 6. AWS Step Functions
|
|
300
|
-
|
|
301
|
-
### Terminology
|
|
302
|
-
- **States** - Units of work
|
|
303
|
-
- **State Machine** - Overall workflow
|
|
304
|
-
- **Transitions** - State relationships
|
|
305
|
-
|
|
306
|
-
### Public APIs
|
|
307
|
-
|
|
308
|
-
#### State Machine Definition (JSON/ASL)
|
|
309
|
-
```json
|
|
310
|
-
{
|
|
311
|
-
"Comment": "A simple minimal example",
|
|
312
|
-
"StartAt": "FirstState",
|
|
313
|
-
"States": {
|
|
314
|
-
"FirstState": {
|
|
315
|
-
"Type": "Task",
|
|
316
|
-
"Resource": "arn:aws:lambda:...:function:FirstFunction",
|
|
317
|
-
"Next": "SecondState"
|
|
318
|
-
},
|
|
319
|
-
"SecondState": {
|
|
320
|
-
"Type": "Task",
|
|
321
|
-
"Resource": "arn:aws:lambda:...:function:SecondFunction",
|
|
322
|
-
"End": true
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
#### SDK APIs
|
|
329
|
-
```python
|
|
330
|
-
import boto3
|
|
331
|
-
|
|
332
|
-
client = boto3.client('stepfunctions')
|
|
333
|
-
|
|
334
|
-
# Get execution history
|
|
335
|
-
response = client.get_execution_history(
|
|
336
|
-
executionArn='arn:aws:states:...'
|
|
337
|
-
)
|
|
338
|
-
|
|
339
|
-
# No public API for "is this state a descendant of that state"
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
**Documentation URLs:**
|
|
343
|
-
- Amazon States Language: https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language.html
|
|
344
|
-
- API Reference: https://docs.aws.amazon.com/step-functions/latest/apireference/
|
|
345
|
-
|
|
346
|
-
### API Exposure Analysis
|
|
347
|
-
- **Definition APIs**: ✅ Public (Amazon States Language JSON)
|
|
348
|
-
- **Query APIs**: ⚠️ Limited (execution history, not topology)
|
|
349
|
-
- **Ancestry Checking**: ❌ Not exposed publicly
|
|
350
|
-
- **Descendant Checking**: ❌ Not exposed publicly
|
|
351
|
-
|
|
352
|
-
### Design Rationale
|
|
353
|
-
AWS Step Functions emphasizes execution:
|
|
354
|
-
1. State machines are declarative
|
|
355
|
-
2. Execution history and monitoring are primary
|
|
356
|
-
3. Topology queries are handled internally
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
## 7. Groundswell (Current Project)
|
|
361
|
-
|
|
362
|
-
### Current Implementation
|
|
363
|
-
|
|
364
|
-
#### isDescendantOf Method (Private)
|
|
365
|
-
**Location**: `/home/dustin/projects/groundswell/src/core/workflow.ts:162-180`
|
|
366
|
-
|
|
367
|
-
```typescript
|
|
368
|
-
/**
|
|
369
|
-
* Check if this workflow is a descendant of the given ancestor workflow
|
|
370
|
-
* Traverses the parent chain upward looking for the ancestor reference
|
|
371
|
-
* Uses visited Set to detect cycles during traversal
|
|
372
|
-
*
|
|
373
|
-
* @private
|
|
374
|
-
* @param ancestor - The potential ancestor workflow to check
|
|
375
|
-
* @returns true if ancestor is found in parent chain, false otherwise
|
|
376
|
-
* @throws {Error} If a cycle is detected during traversal
|
|
377
|
-
*/
|
|
378
|
-
private isDescendantOf(ancestor: Workflow): boolean {
|
|
379
|
-
const visited = new Set<Workflow>();
|
|
380
|
-
let current: Workflow | null = this.parent;
|
|
381
|
-
|
|
382
|
-
while (current !== null) {
|
|
383
|
-
if (visited.has(current)) {
|
|
384
|
-
throw new Error('Circular parent-child relationship detected');
|
|
385
|
-
}
|
|
386
|
-
visited.add(current);
|
|
387
|
-
|
|
388
|
-
if (current === ancestor) {
|
|
389
|
-
return true;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
current = current.parent;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
return false;
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
#### Usage in attachChild (Internal)
|
|
400
|
-
**Location**: `/home/dustin/projects/groundswell/src/core/workflow.ts:293`
|
|
401
|
-
|
|
402
|
-
```typescript
|
|
403
|
-
public attachChild(child: Workflow): void {
|
|
404
|
-
// ... validation code ...
|
|
405
|
-
|
|
406
|
-
// Validate child is not an ancestor (circular reference detection)
|
|
407
|
-
if (this.isDescendantOf(child)) {
|
|
408
|
-
throw new Error(
|
|
409
|
-
`Cannot attach ancestor '${child.name}' as child of '${this.name}'. ` +
|
|
410
|
-
`This would create a circular reference.`
|
|
411
|
-
);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// ... rest of attachment logic ...
|
|
415
|
-
}
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### API Exposure Status
|
|
419
|
-
- **Implementation**: ✅ Complete (isDescendantOf exists)
|
|
420
|
-
- **Visibility**: ❌ Private (marked `@private`)
|
|
421
|
-
- **Public Access**: ❌ Not accessible externally
|
|
422
|
-
- **Internal Use**: ✅ Used for circular reference detection
|
|
423
|
-
|
|
424
|
-
### Known Issues
|
|
425
|
-
**Source**: `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/TEST_RESULTS.md:229`
|
|
426
|
-
|
|
427
|
-
> "The `isDescendantOf()` method is private and only used internally for cycle detection. External code cannot check ancestry relationships."
|
|
428
|
-
|
|
429
|
-
**Task in Backlog**:
|
|
430
|
-
- "Consider Exposing isDescendantOf as Public API"
|
|
431
|
-
- Location: `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bug_fix_tasks.json:342`
|
|
432
|
-
|
|
433
|
-
---
|
|
434
|
-
|
|
435
|
-
## Cross-System Comparison
|
|
436
|
-
|
|
437
|
-
### Terminology Matrix
|
|
438
|
-
|
|
439
|
-
| System | Primary Terms | Secondary Terms | Lineage Concept |
|
|
440
|
-
|--------|--------------|-----------------|-----------------|
|
|
441
|
-
| Apache Airflow | Upstream/Downstream | Parent/Child | No |
|
|
442
|
-
| Temporal | Parent/Child | Ancestor | No |
|
|
443
|
-
| Prefect | Upstream/Downstream | Dependencies | No |
|
|
444
|
-
| Dagster | Dependencies | Lineage | Yes ✅ |
|
|
445
|
-
| GitHub Actions | Dependencies | Needs | No |
|
|
446
|
-
| AWS Step Functions | States | Transitions | No |
|
|
447
|
-
| **Groundswell** | **Parent/Child** | **Ancestor/Descendant** | **Yes ✅** |
|
|
448
|
-
|
|
449
|
-
### API Exposure Matrix
|
|
450
|
-
|
|
451
|
-
| System | Define Relationships | Query Immediate | Query Ancestry | Public Descendant Check |
|
|
452
|
-
|--------|---------------------|-----------------|----------------|-------------------------|
|
|
453
|
-
| Apache Airflow | ✅ Public | ✅ Public | ❌ Internal | ❌ No |
|
|
454
|
-
| Temporal | ✅ Public | ❌ No | ❌ Internal | ❌ No |
|
|
455
|
-
| Prefect | ✅ Public | ❌ No | ❌ Internal | ❌ No |
|
|
456
|
-
| Dagster | ✅ Public | ⚠️ Indirect | ⚠️ Indirect | ⚠️ Indirect |
|
|
457
|
-
| GitHub Actions | ✅ Public | ⚠️ Limited | ❌ No | ❌ No |
|
|
458
|
-
| AWS Step Functions | ✅ Public | ❌ No | ❌ No | ❌ No |
|
|
459
|
-
| **Groundswell** | ✅ Public | ✅ Public | ⚠️ Private | ⚠️ Private (can be made public) |
|
|
460
|
-
|
|
461
|
-
### Method Naming Patterns
|
|
462
|
-
|
|
463
|
-
| Pattern | Systems Using It | Example |
|
|
464
|
-
|---------|------------------|---------|
|
|
465
|
-
| `set_upstream()` / `set_downstream()` | Apache Airflow, Prefect | `task_a.set_downstream(task_b)` |
|
|
466
|
-
| `get_upstream()` / `get_downstream()` | Apache Airflow | `task.get_downstream()` |
|
|
467
|
-
| `execute_child_workflow()` | Temporal | `workflow.execute_child_workflow(ChildWorkflow.run)` |
|
|
468
|
-
| `AssetSelection.upstream()` / `.downstream()` | Dagster | `selection.downstream()` |
|
|
469
|
-
| **`isDescendantOf()`** | **Groundswell** | **`workflow.isDescendantOf(ancestor)`** |
|
|
470
|
-
|
|
471
|
-
**Key Finding**: Groundswell's `isDescendantOf()` naming is unique and more explicit than other systems.
|
|
472
|
-
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
## Industry Patterns
|
|
476
|
-
|
|
477
|
-
### What's Common
|
|
478
|
-
|
|
479
|
-
1. **Definition APIs are Always Public**
|
|
480
|
-
- All systems expose public APIs for defining relationships
|
|
481
|
-
- Examples: `set_downstream()`, `needs:`, `deps:[]`
|
|
482
|
-
|
|
483
|
-
2. **Query APIs are Limited or Internal**
|
|
484
|
-
- Most systems don't expose public ancestry/descendant checking
|
|
485
|
-
- Focus is on execution, not topology queries
|
|
486
|
-
|
|
487
|
-
3. **Upstream/Downstream Dominates**
|
|
488
|
-
- Most systems use this terminology (except Temporal)
|
|
489
|
-
- More intuitive than ancestor/descendant for workflows
|
|
490
|
-
|
|
491
|
-
### What's Rare
|
|
492
|
-
|
|
493
|
-
1. **Explicit Ancestry Checking**
|
|
494
|
-
- Only Dagster has lineage concepts (data-focused)
|
|
495
|
-
- No systems expose `isDescendantOf()`-style methods publicly
|
|
496
|
-
|
|
497
|
-
2. **Public Relationship Validation APIs**
|
|
498
|
-
- Systems validate internally (like Groundswell's attachChild)
|
|
499
|
-
- Don't expose validation as public API
|
|
500
|
-
|
|
501
|
-
3. **Cycle Detection APIs**
|
|
502
|
-
- All handle internally, none expose publicly
|
|
503
|
-
- Groundswell's implementation with visited Set is industry standard
|
|
504
|
-
|
|
505
|
-
---
|
|
506
|
-
|
|
507
|
-
## Recommendations for Groundswell
|
|
508
|
-
|
|
509
|
-
### 1. Terminology
|
|
510
|
-
|
|
511
|
-
**Recommendation**: Keep "Parent/Child" as primary, support "Ancestor/Descendant" as secondary
|
|
512
|
-
|
|
513
|
-
**Rationale**:
|
|
514
|
-
- "Parent/Child" is most universally understood
|
|
515
|
-
- "Ancestor/Descendant" is more precise for deep hierarchies
|
|
516
|
-
- Groundswell already uses both (good consistency)
|
|
517
|
-
|
|
518
|
-
### 2. API Design
|
|
519
|
-
|
|
520
|
-
**Option A: Make isDescendantOf Public**
|
|
521
|
-
```typescript
|
|
522
|
-
class Workflow {
|
|
523
|
-
/**
|
|
524
|
-
* Check if this workflow is a descendant of the given ancestor
|
|
525
|
-
* @param ancestor - Potential ancestor workflow
|
|
526
|
-
* @returns true if this workflow is a descendant
|
|
527
|
-
*/
|
|
528
|
-
public isDescendantOf(ancestor: Workflow): boolean {
|
|
529
|
-
// existing implementation
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
**Pros**:
|
|
535
|
-
- More explicit than `getParent()` chain traversal
|
|
536
|
-
- Useful for validation and debugging
|
|
537
|
-
- Already implemented and tested
|
|
538
|
-
|
|
539
|
-
**Cons**:
|
|
540
|
-
- None significant - method is well-tested
|
|
541
|
-
|
|
542
|
-
**Option B: Add Convenience Methods**
|
|
543
|
-
```typescript
|
|
544
|
-
class Workflow {
|
|
545
|
-
// Direct descendant check
|
|
546
|
-
public isDescendantOf(ancestor: Workflow): boolean;
|
|
547
|
-
|
|
548
|
-
// Convenience: direct child check
|
|
549
|
-
public isChildOf(parent: Workflow): boolean {
|
|
550
|
-
return this.parent === parent;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
// Convenience: has ancestor at any depth
|
|
554
|
-
public hasAncestor(ancestor: Workflow): boolean {
|
|
555
|
-
return this.isDescendantOf(ancestor);
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// Get ancestor chain
|
|
559
|
-
public getAncestors(): Workflow[] {
|
|
560
|
-
const ancestors: Workflow[] = [];
|
|
561
|
-
let current = this.parent;
|
|
562
|
-
while (current) {
|
|
563
|
-
ancestors.push(current);
|
|
564
|
-
current = current.parent;
|
|
565
|
-
}
|
|
566
|
-
return ancestors;
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
**Option C: Add Downstream/Upstream Aliases**
|
|
572
|
-
```typescript
|
|
573
|
-
class Workflow {
|
|
574
|
-
// Alias for compatibility with Airflow/Prefect users
|
|
575
|
-
public getDownstream(): Workflow[] {
|
|
576
|
-
return [...this.children];
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
public getUpstream(): Workflow | null {
|
|
580
|
-
return this.parent;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
// Multiple levels
|
|
584
|
-
public getAllDescendants(): Workflow[] {
|
|
585
|
-
const descendants: Workflow[] = [];
|
|
586
|
-
const queue = [...this.children];
|
|
587
|
-
while (queue.length > 0) {
|
|
588
|
-
const current = queue.shift()!;
|
|
589
|
-
descendants.push(current);
|
|
590
|
-
queue.push(...current.children);
|
|
591
|
-
}
|
|
592
|
-
return descendants;
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
### 3. Documentation Decision
|
|
598
|
-
|
|
599
|
-
**Recommendation**: Document why `isDescendantOf` is private OR make it public
|
|
600
|
-
|
|
601
|
-
**If Private**:
|
|
602
|
-
```typescript
|
|
603
|
-
/**
|
|
604
|
-
* Check if this workflow is a descendant of another
|
|
605
|
-
*
|
|
606
|
-
* @internal
|
|
607
|
-
* This method is used internally for circular reference detection.
|
|
608
|
-
* It is intentionally private to avoid exposing implementation details.
|
|
609
|
-
*
|
|
610
|
-
* If you need to check workflow relationships, use:
|
|
611
|
-
* - workflow.parent (immediate parent)
|
|
612
|
-
* - workflow.children (immediate children)
|
|
613
|
-
* - Manual traversal if needed (but be careful of cycles!)
|
|
614
|
-
*/
|
|
615
|
-
private isDescendantOf(ancestor: Workflow): boolean
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
**If Public**:
|
|
619
|
-
```typescript
|
|
620
|
-
/**
|
|
621
|
-
* Check if this workflow is a descendant of the given ancestor workflow
|
|
622
|
-
*
|
|
623
|
-
* @example Check ancestry before an operation
|
|
624
|
-
* ```typescript
|
|
625
|
-
* if (child.isDescendantOf(root)) {
|
|
626
|
-
* console.log('Child is in the root hierarchy');
|
|
627
|
-
* }
|
|
628
|
-
* ```
|
|
629
|
-
*
|
|
630
|
-
* @example Prevent circular operations
|
|
631
|
-
* ```typescript
|
|
632
|
-
* if (!newChild.isDescendantOf(parent)) {
|
|
633
|
-
* parent.attachChild(newChild);
|
|
634
|
-
* }
|
|
635
|
-
* ```
|
|
636
|
-
*/
|
|
637
|
-
public isDescendantOf(ancestor: Workflow): boolean
|
|
638
|
-
```
|
|
639
|
-
|
|
640
|
-
### 4. Security Considerations
|
|
641
|
-
|
|
642
|
-
If making `isDescendantOf` public, consider:
|
|
643
|
-
|
|
644
|
-
1. **Depth Limits**: Prevent traversal abuse
|
|
645
|
-
```typescript
|
|
646
|
-
public isDescendantOf(ancestor: Workflow, maxDepth: number = 1000): boolean {
|
|
647
|
-
let depth = 0;
|
|
648
|
-
const visited = new Set<Workflow>();
|
|
649
|
-
let current: Workflow | null = this.parent;
|
|
650
|
-
|
|
651
|
-
while (current !== null) {
|
|
652
|
-
if (++depth > maxDepth) {
|
|
653
|
-
throw new Error(`Ancestry depth exceeds ${maxDepth}`);
|
|
654
|
-
}
|
|
655
|
-
if (visited.has(current)) {
|
|
656
|
-
throw new Error('Circular parent-child relationship detected');
|
|
657
|
-
}
|
|
658
|
-
visited.add(current);
|
|
659
|
-
|
|
660
|
-
if (current === ancestor) {
|
|
661
|
-
return true;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
current = current.parent;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
return false;
|
|
668
|
-
}
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
2. **Traversal Logging**: For debugging
|
|
672
|
-
```typescript
|
|
673
|
-
private debugAncestryTraversal(from: Workflow, to: Workflow) {
|
|
674
|
-
if (this.config.debug) {
|
|
675
|
-
this.logger.debug(`Checking ancestry: ${from.name} -> ${to.name}`);
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
```
|
|
679
|
-
|
|
680
|
-
---
|
|
681
|
-
|
|
682
|
-
## Conclusion
|
|
683
|
-
|
|
684
|
-
### Key Findings
|
|
685
|
-
|
|
686
|
-
1. **Groundswell is Ahead of Industry**
|
|
687
|
-
- `isDescendantOf()` implementation is complete and tested
|
|
688
|
-
- More explicit than most systems (which keep this internal)
|
|
689
|
-
- Well-documented with cycle detection
|
|
690
|
-
|
|
691
|
-
2. **Industry Standard: Keep it Internal**
|
|
692
|
-
- Most workflow engines don't expose ancestry checking publicly
|
|
693
|
-
- Focus is on execution, not topology queries
|
|
694
|
-
- Dagster is exception (data lineage focus)
|
|
695
|
-
|
|
696
|
-
3. **Making it Public is Differentiator**
|
|
697
|
-
- No major system exposes explicit `isDescendantOf()` API
|
|
698
|
-
- Could be competitive advantage for debugging/validation
|
|
699
|
-
- Already well-tested (25+ test cases)
|
|
700
|
-
|
|
701
|
-
### Recommendation
|
|
702
|
-
|
|
703
|
-
**Make `isDescendantOf` public with safeguards:**
|
|
704
|
-
|
|
705
|
-
1. Add depth limit parameter (default: 1000)
|
|
706
|
-
2. Keep cycle detection (already implemented)
|
|
707
|
-
3. Add convenience methods (`getAncestors()`, `getAllDescendants()`)
|
|
708
|
-
4. Document clearly with examples
|
|
709
|
-
5. Consider `upstream`/`downstream` aliases for familiarity
|
|
710
|
-
|
|
711
|
-
**Rationale**:
|
|
712
|
-
- Differentiates from competition
|
|
713
|
-
- Already battle-tested
|
|
714
|
-
- Minimal risk (implementation is solid)
|
|
715
|
-
- High value for users (debugging, validation)
|
|
716
|
-
|
|
717
|
-
---
|
|
718
|
-
|
|
719
|
-
## Sources
|
|
720
|
-
|
|
721
|
-
### Documentation URLs
|
|
722
|
-
|
|
723
|
-
**Apache Airflow:**
|
|
724
|
-
- https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html
|
|
725
|
-
- https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html#task-instance
|
|
726
|
-
- https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/xcoms.html
|
|
727
|
-
|
|
728
|
-
**Temporal:**
|
|
729
|
-
- https://docs.temporal.io/develop/python/child-workflows
|
|
730
|
-
- https://docs.temporal.io/concepts/what-is-a-workflow-execution
|
|
731
|
-
- https://docs.temporal.io/namespaces
|
|
732
|
-
- https://typescript.temporal.io/api/namespaces/workflow
|
|
733
|
-
|
|
734
|
-
**Prefect:**
|
|
735
|
-
- https://docs.prefect.io/latest/concepts/dependencies/
|
|
736
|
-
- https://docs.prefect.io/latest/api-ref/prefect.tasks/
|
|
737
|
-
- https://docs.prefect.io/concepts/flows/
|
|
738
|
-
|
|
739
|
-
**Dagster:**
|
|
740
|
-
- https://docs.dagster.io/getting-started/concepts
|
|
741
|
-
- https://docs.dagster.io/guides/dagster/asset-dependencies
|
|
742
|
-
|
|
743
|
-
**GitHub Actions:**
|
|
744
|
-
- https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
|
|
745
|
-
- https://docs.github.com/en/rest/actions
|
|
746
|
-
|
|
747
|
-
**AWS Step Functions:**
|
|
748
|
-
- https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language.html
|
|
749
|
-
- https://docs.aws.amazon.com/step-functions/latest/apireference/
|
|
750
|
-
|
|
751
|
-
### Internal Project Files
|
|
752
|
-
|
|
753
|
-
- `/home/dustin/projects/groundswell/src/core/workflow.ts` - Implementation
|
|
754
|
-
- `/home/dustin/projects/groundswell/CHANGELOG.md` - Version history
|
|
755
|
-
- `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/TEST_RESULTS.md` - Known issues
|
|
756
|
-
- `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bug_fix_tasks.json` - Backlog tasks
|
|
757
|
-
|
|
758
|
-
---
|
|
759
|
-
|
|
760
|
-
*Research conducted on 2026-01-12*
|