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,415 +0,0 @@
|
|
|
1
|
-
# Bug Analysis: attachChild() Tree Integrity Violation
|
|
2
|
-
|
|
3
|
-
## Bug Summary
|
|
4
|
-
|
|
5
|
-
**Severity**: Critical
|
|
6
|
-
**Location**: `src/core/workflow.ts:187-201` (attachChild method)
|
|
7
|
-
**Discovered By**: Comprehensive end-to-end testing (240 existing tests + adversarial testing)
|
|
8
|
-
**Impact**: Inconsistent tree state, broken observer propagation, data integrity violation
|
|
9
|
-
|
|
10
|
-
## Bug Description
|
|
11
|
-
|
|
12
|
-
The `attachChild()` method does not validate if a child workflow already has a parent before attaching it to a new parent. This allows a single child to appear in multiple parents' `children` arrays while only linking to one parent via its `parent` property, creating an inconsistent tree state.
|
|
13
|
-
|
|
14
|
-
## Current Implementation (Buggy)
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
// File: src/core/workflow.ts, lines 187-201
|
|
18
|
-
public attachChild(child: Workflow): void {
|
|
19
|
-
// Only checks if already attached to THIS workflow
|
|
20
|
-
if (this.children.includes(child)) {
|
|
21
|
-
throw new Error('Child already attached to this workflow');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// NO VALIDATION: Does not check if child.parent is already set!
|
|
25
|
-
|
|
26
|
-
this.children.push(child);
|
|
27
|
-
this.node.children.push(child.node);
|
|
28
|
-
|
|
29
|
-
this.emitEvent({
|
|
30
|
-
type: 'childAttached',
|
|
31
|
-
parentId: this.id,
|
|
32
|
-
child: child.node,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Steps to Reproduce
|
|
38
|
-
|
|
39
|
-
```typescript
|
|
40
|
-
import { Workflow } from './src/index.js';
|
|
41
|
-
|
|
42
|
-
const parent1 = new Workflow('Parent1');
|
|
43
|
-
const parent2 = new Workflow('Parent2');
|
|
44
|
-
|
|
45
|
-
// Create child with parent1 - child is automatically attached via constructor
|
|
46
|
-
const child = new Workflow('Child', parent1);
|
|
47
|
-
|
|
48
|
-
// BUG: attachChild doesn't check if child already has a parent
|
|
49
|
-
parent2.attachChild(child);
|
|
50
|
-
|
|
51
|
-
// Result: INCONSISTENT STATE
|
|
52
|
-
console.log(child.parent === parent1); // true (original parent)
|
|
53
|
-
console.log(parent1.children.includes(child)); // true (still in parent1)
|
|
54
|
-
console.log(parent2.children.includes(child)); // true (also in parent2!)
|
|
55
|
-
console.log(child.parent === parent2); // false (not updated)
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Impact Analysis
|
|
59
|
-
|
|
60
|
-
### 1. Observer Event Propagation Failure
|
|
61
|
-
|
|
62
|
-
**Problem**: Events from the shared child only propagate to the original parent's observers.
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
const parent1 = new Workflow('Parent1');
|
|
66
|
-
const parent2 = new Workflow('Parent2');
|
|
67
|
-
const child = new Workflow('Child', parent1);
|
|
68
|
-
|
|
69
|
-
parent2.attachChild(child); // Bug creates inconsistency
|
|
70
|
-
|
|
71
|
-
// Add observers
|
|
72
|
-
parent1.addObserver({ onEvent: (e) => console.log('P1:', e.type), ... });
|
|
73
|
-
parent2.addObserver({ onEvent: (e) => console.log('P2:', e.type), ... });
|
|
74
|
-
|
|
75
|
-
// Emit event from child
|
|
76
|
-
child.emitEvent({ type: 'stepStart', ... });
|
|
77
|
-
|
|
78
|
-
// Output:
|
|
79
|
-
// P1: stepStart ✅ (original parent receives it)
|
|
80
|
-
// ❌ (parent2 never receives it, even though child is in parent2.children!)
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Root Cause**: The `getRootObservers()` method follows the `child.parent` chain:
|
|
84
|
-
```typescript
|
|
85
|
-
protected getRootObservers(): WorkflowObserver[] {
|
|
86
|
-
// Only follows child.parent, which is parent1
|
|
87
|
-
let root = this;
|
|
88
|
-
while (root.parent) root = root.parent;
|
|
89
|
-
return root.observers;
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 2. Tree Debugger Inconsistency
|
|
94
|
-
|
|
95
|
-
**Problem**: Tree debugger shows child in both trees, but navigation is broken.
|
|
96
|
-
|
|
97
|
-
```typescript
|
|
98
|
-
import { WorkflowTreeDebugger } from './src/index.js';
|
|
99
|
-
|
|
100
|
-
const debugger1 = new WorkflowTreeDebugger(parent1);
|
|
101
|
-
const debugger2 = new WorkflowTreeDebugger(parent2);
|
|
102
|
-
|
|
103
|
-
console.log(debugger1.toTreeString());
|
|
104
|
-
// Parent1
|
|
105
|
-
// └─ Child ✅ (visible)
|
|
106
|
-
|
|
107
|
-
console.log(debugger2.toTreeString());
|
|
108
|
-
// Parent2
|
|
109
|
-
// └─ Child ✅ (visible)
|
|
110
|
-
|
|
111
|
-
// But navigation via parent/child links:
|
|
112
|
-
console.log(child.parent.node.name); // "Parent1" (not Parent2!)
|
|
113
|
-
console.log(parent2.children[0].parent === parent2); // false!
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 3. getRoot() Returns Wrong Root
|
|
117
|
-
|
|
118
|
-
**Problem**: The `getRoot()` method only follows the `child.parent` chain.
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
const parent1 = new Workflow('Parent1');
|
|
122
|
-
const parent2 = new Workflow('Parent2');
|
|
123
|
-
const child = new Workflow('Child', parent1);
|
|
124
|
-
|
|
125
|
-
parent2.attachChild(child);
|
|
126
|
-
|
|
127
|
-
// getRoot() only follows child.parent
|
|
128
|
-
console.log(child.getRoot()); // Returns parent1, NOT parent2
|
|
129
|
-
// Even though child appears in parent2's tree!
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 4. Data Integrity Violation
|
|
133
|
-
|
|
134
|
-
**Problem**: Violates PRD's "1:1 tree mirror" requirement.
|
|
135
|
-
|
|
136
|
-
**PRD Section 12.2 Requirement**:
|
|
137
|
-
> "A child workflow should have exactly one parent.
|
|
138
|
-
> The `child.parent` property should always match the parent that contains it.
|
|
139
|
-
> A child should only appear in one parent's `children` array."
|
|
140
|
-
|
|
141
|
-
**Current Behavior**: All three requirements violated.
|
|
142
|
-
|
|
143
|
-
## Why Existing Tests Didn't Catch This
|
|
144
|
-
|
|
145
|
-
The existing 241 tests don't cover this scenario because:
|
|
146
|
-
|
|
147
|
-
1. **Normal Usage**: Most tests create children with a parent and don't re-attach them
|
|
148
|
-
2. **Constructor Pattern**: Using `new Workflow(name, parent)` automatically attaches, so explicit `attachChild()` calls are rare
|
|
149
|
-
3. **Missing Adversarial Tests**: No tests explicitly try to attach a child that already has a different parent
|
|
150
|
-
4. **Observer Tests**: Observer tests don't verify that events DON'T propagate to wrong parents
|
|
151
|
-
|
|
152
|
-
## Root Cause
|
|
153
|
-
|
|
154
|
-
The `attachChild()` method was designed with these assumptions:
|
|
155
|
-
|
|
156
|
-
1. **Assumption 1**: Children are created without parents and attached later
|
|
157
|
-
- **Reality**: Constructor auto-attaches if parent is provided
|
|
158
|
-
- **Gap**: No validation for pre-existing parent
|
|
159
|
-
|
|
160
|
-
2. **Assumption 2**: Developers will read the docs and not misuse the API
|
|
161
|
-
- **Reality**: API allows accidental misuse (no validation)
|
|
162
|
-
- **Gap**: No defensive programming for edge cases
|
|
163
|
-
|
|
164
|
-
3. **Assumption 3**: The check `this.children.includes(child)` is sufficient
|
|
165
|
-
- **Reality**: Only prevents duplicates in THIS parent, not other parents
|
|
166
|
-
- **Gap**: No validation of child's current parent state
|
|
167
|
-
|
|
168
|
-
## Solution Design
|
|
169
|
-
|
|
170
|
-
### Primary Fix: Add Parent Validation
|
|
171
|
-
|
|
172
|
-
```typescript
|
|
173
|
-
public attachChild(child: Workflow): void {
|
|
174
|
-
// Validation 1: Prevent duplicate attachment to this workflow
|
|
175
|
-
if (this.children.includes(child)) {
|
|
176
|
-
throw new Error(
|
|
177
|
-
`Child '${child.node.name}' is already attached to workflow '${this.node.name}'`
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// VALIDATION 2: Check if child already has a different parent (THE FIX)
|
|
182
|
-
if (child.parent !== null && child.parent !== this) {
|
|
183
|
-
throw new Error(
|
|
184
|
-
`Child '${child.node.name}' already has parent '${child.parent.node.name}'. ` +
|
|
185
|
-
`A workflow can only have one parent. ` +
|
|
186
|
-
`Use detachChild() on the current parent first if you need to reparent.`
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Update child's parent if it's currently null
|
|
191
|
-
if (child.parent === null) {
|
|
192
|
-
child.parent = this;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Add to both trees
|
|
196
|
-
this.children.push(child);
|
|
197
|
-
this.node.children.push(child.node);
|
|
198
|
-
|
|
199
|
-
// Emit event
|
|
200
|
-
this.emitEvent({
|
|
201
|
-
type: 'childAttached',
|
|
202
|
-
parentId: this.id,
|
|
203
|
-
child: child.node,
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### Secondary Fix: Add Circular Reference Detection
|
|
209
|
-
|
|
210
|
-
Prevent attaching an ancestor as a child (would create a cycle):
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
public attachChild(child: Workflow): void {
|
|
214
|
-
// ... existing validations ...
|
|
215
|
-
|
|
216
|
-
// VALIDATION 3: Prevent circular references
|
|
217
|
-
if (this.isDescendantOf(child)) {
|
|
218
|
-
throw new Error(
|
|
219
|
-
`Cannot attach child '${child.node.name}' - it is an ancestor of '${this.node.name}'. ` +
|
|
220
|
-
`This would create a circular reference.`
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// ... rest of method ...
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Check if this workflow is a descendant of another workflow
|
|
229
|
-
*/
|
|
230
|
-
private isDescendantOf(ancestor: Workflow): boolean {
|
|
231
|
-
let current: Workflow | null = this;
|
|
232
|
-
const visited = new Set<Workflow>();
|
|
233
|
-
|
|
234
|
-
while (current !== null) {
|
|
235
|
-
if (visited.has(current)) {
|
|
236
|
-
throw new Error('Circular reference detected in tree structure');
|
|
237
|
-
}
|
|
238
|
-
visited.add(current);
|
|
239
|
-
|
|
240
|
-
if (current === ancestor) {
|
|
241
|
-
return true;
|
|
242
|
-
}
|
|
243
|
-
current = current.parent;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
return false;
|
|
247
|
-
}
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
### Tertiary Fix: Add detachChild() Method
|
|
251
|
-
|
|
252
|
-
Enable proper reparenting workflow:
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
/**
|
|
256
|
-
* Detach a child workflow from this parent
|
|
257
|
-
* @throws {Error} If child is not attached to this workflow
|
|
258
|
-
*/
|
|
259
|
-
public detachChild(child: Workflow): void {
|
|
260
|
-
const index = this.children.indexOf(child);
|
|
261
|
-
if (index === -1) {
|
|
262
|
-
throw new Error(
|
|
263
|
-
`Child '${child.node.name}' is not attached to workflow '${this.node.name}'`
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Remove from workflow children array
|
|
268
|
-
this.children.splice(index, 1);
|
|
269
|
-
|
|
270
|
-
// Remove from node children array
|
|
271
|
-
const nodeIndex = this.node.children.indexOf(child.node);
|
|
272
|
-
if (nodeIndex !== -1) {
|
|
273
|
-
this.node.children.splice(nodeIndex, 1);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Clear child's parent reference
|
|
277
|
-
child.parent = null;
|
|
278
|
-
|
|
279
|
-
// Emit detached event for observers
|
|
280
|
-
this.emitEvent({
|
|
281
|
-
type: 'childDetached',
|
|
282
|
-
parentId: this.id,
|
|
283
|
-
childId: child.id,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
### Quaternary Fix: Update Event Types
|
|
289
|
-
|
|
290
|
-
Add `childDetached` to the event type union:
|
|
291
|
-
|
|
292
|
-
```typescript
|
|
293
|
-
// File: src/types/events.ts
|
|
294
|
-
export type WorkflowEvent =
|
|
295
|
-
| { type: 'stepStart'; node: WorkflowNode; step: string }
|
|
296
|
-
| { type: 'stepFinish'; node: WorkflowNode; step: string; result: unknown }
|
|
297
|
-
| { type: 'stateUpdated'; node: WorkflowNode; state: Record<string, unknown> }
|
|
298
|
-
| { type: 'childAttached'; parentId: string; child: WorkflowNode }
|
|
299
|
-
| { type: 'childDetached'; parentId: string; childId: string } // NEW
|
|
300
|
-
| { type: 'treeUpdated'; node: WorkflowNode }
|
|
301
|
-
| { type: 'error'; node: WorkflowNode; error: WorkflowError };
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
## Test Coverage Requirements
|
|
305
|
-
|
|
306
|
-
### Required New Tests
|
|
307
|
-
|
|
308
|
-
1. **Prevent attaching child with existing parent**:
|
|
309
|
-
```typescript
|
|
310
|
-
it('should throw when attaching child that already has a different parent')
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
2. **Allow attaching child with null parent**:
|
|
314
|
-
```typescript
|
|
315
|
-
it('should attach child when child.parent is null')
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
3. **Prevent circular references**:
|
|
319
|
-
```typescript
|
|
320
|
-
it('should throw when attaching ancestor as child (circular reference)')
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
4. **Prevent duplicate children**:
|
|
324
|
-
```typescript
|
|
325
|
-
it('should throw when attaching same child twice to same parent')
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
5. **detachChild() removes child properly**:
|
|
329
|
-
```typescript
|
|
330
|
-
it('should detach child and clear parent reference')
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
6. **Observer propagation after reparenting**:
|
|
334
|
-
```typescript
|
|
335
|
-
it('should propagate events to new parent observers after reparenting')
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
7. **Bidirectional tree consistency**:
|
|
339
|
-
```typescript
|
|
340
|
-
it('should maintain consistency between workflow tree and node tree')
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
8. **Adversarial: manual parent mutation**:
|
|
344
|
-
```typescript
|
|
345
|
-
it('should handle manual parent mutation gracefully')
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
9. **Deep hierarchy without stack overflow**:
|
|
349
|
-
```typescript
|
|
350
|
-
it('should handle 1000+ level deep hierarchies')
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
10. **Complex circular reference detection**:
|
|
354
|
-
```typescript
|
|
355
|
-
it('should detect circular references in deep trees')
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
## Backward Compatibility
|
|
359
|
-
|
|
360
|
-
### Breaking Changes
|
|
361
|
-
|
|
362
|
-
**None**. This fix only prevents buggy behavior that was already incorrect.
|
|
363
|
-
|
|
364
|
-
### Behavior Changes
|
|
365
|
-
|
|
366
|
-
- **Before**: `attachChild()` would silently create inconsistent state
|
|
367
|
-
- **After**: `attachChild()` throws clear error with guidance
|
|
368
|
-
|
|
369
|
-
### Migration Path
|
|
370
|
-
|
|
371
|
-
Users who were accidentally relying on the buggy behavior (e.g., attaching a child to multiple parents) will need to:
|
|
372
|
-
|
|
373
|
-
1. **Option A**: Use only one parent (recommended)
|
|
374
|
-
2. **Option B**: Implement reparenting with `detachChild()`:
|
|
375
|
-
```typescript
|
|
376
|
-
// Before (buggy):
|
|
377
|
-
parent2.attachChild(child); // Silent failure if child has parent
|
|
378
|
-
|
|
379
|
-
// After (correct):
|
|
380
|
-
if (child.parent) {
|
|
381
|
-
child.parent.detachChild(child);
|
|
382
|
-
}
|
|
383
|
-
parent2.attachChild(child);
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
## Validation Checklist
|
|
387
|
-
|
|
388
|
-
- [ ] Implementation matches PRD Section 12.2 requirements
|
|
389
|
-
- [ ] All 241 existing tests still pass
|
|
390
|
-
- [ ] All new tests pass (10+ tests)
|
|
391
|
-
- [ ] Observer events propagate correctly after fix
|
|
392
|
-
- [ ] Tree debugger shows consistent trees
|
|
393
|
-
- [ ] getRoot() returns correct root after fix
|
|
394
|
-
- [ ] Error messages are clear and actionable
|
|
395
|
-
- [ ] Circular reference detection works
|
|
396
|
-
- [ ] Reparenting workflow works with detachChild()
|
|
397
|
-
- [ ] Code follows existing patterns and style
|
|
398
|
-
- [ ] Types are all correct (TypeScript compilation)
|
|
399
|
-
- [ ] No performance regression
|
|
400
|
-
|
|
401
|
-
## Success Metrics
|
|
402
|
-
|
|
403
|
-
1. **Bug Fixed**: Cannot create inconsistent tree state
|
|
404
|
-
2. **Tests Pass**: All 241+ tests pass
|
|
405
|
-
3. **Observer Works**: Events propagate to correct observers
|
|
406
|
-
4. **PRD Compliance**: Fully compliant with Section 12.2
|
|
407
|
-
5. **Clear Errors**: Error messages guide users to solution
|
|
408
|
-
6. **No Regression**: All existing functionality works as before
|
|
409
|
-
|
|
410
|
-
## References
|
|
411
|
-
|
|
412
|
-
- PRD Section 12.2: Workflow Base Class
|
|
413
|
-
- File: `src/core/workflow.ts`, lines 187-201
|
|
414
|
-
- Test File: `src/__tests__/adversarial/edge-case.test.ts`
|
|
415
|
-
- Event Types: `src/types/events.ts`
|