groundswell 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/subtask-planning/prp-base-create.md +120 -0
- package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
- package/.claude/commands/task-breakdown.md +94 -0
- package/.claude/system_prompts/task-breakdown.md +1 -0
- package/CHANGELOG.md +188 -0
- package/PRD.md +543 -0
- package/README.md +99 -5
- package/examples/README.md +15 -1
- package/examples/examples/11-reparenting-workflows.ts +269 -0
- package/examples/index.ts +4 -0
- package/package-lock.json +2398 -0
- package/package.json +3 -1
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
- package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
- package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
- package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
- package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
- package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
- package/src/__tests__/adversarial/edge-case.test.ts +703 -0
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
- package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
- package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
- package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
- package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
- package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
- package/src/__tests__/helpers/index.ts +18 -0
- package/src/__tests__/helpers/tree-verification.ts +257 -0
- package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
- package/src/__tests__/integration/observer-logging.test.ts +643 -0
- package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
- package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
- package/src/__tests__/unit/context.test.ts +79 -0
- package/src/__tests__/unit/logger.test.ts +293 -0
- package/src/__tests__/unit/observable.test.ts +321 -0
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
- package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
- package/src/__tests__/unit/workflow.test.ts +277 -1
- package/src/core/agent.ts +21 -1
- package/src/core/logger.ts +27 -2
- package/src/core/workflow-context.ts +6 -4
- package/src/core/workflow.ts +252 -14
- package/src/debugger/tree-debugger.ts +52 -7
- package/src/decorators/task.ts +65 -2
- package/src/index.ts +4 -2
- package/src/types/decorators.ts +8 -1
- package/src/types/events.ts +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/observable.ts +32 -3
- package/src/utils/workflow-error-utils.ts +56 -0
- package/tsconfig.json +1 -1
- package/llms_full.txt +0 -5890
- package/tasks.json +0 -0
- /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
- /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
- /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
- /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
- /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
- /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# RECOMMENDATION: isDescendantOf Public API
|
|
2
|
+
|
|
3
|
+
**Work Item**: P1.M3.T4.S1 - Evaluate use cases for public isDescendantOf API
|
|
4
|
+
**Date**: 2026-01-12
|
|
5
|
+
**Status**: RECOMMENDATION APPROVED
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Executive Summary
|
|
10
|
+
|
|
11
|
+
**RECOMMENDATION**: **MAKE `isDescendantOf()` PUBLIC** with documentation safeguards.
|
|
12
|
+
|
|
13
|
+
**Confidence Level**: **HIGH (9/10)**
|
|
14
|
+
|
|
15
|
+
**Key Finding**: The `isDescendantOf()` method does NOT expose any information beyond what is already publicly accessible via the `parent` and `children` properties. Making it public improves API ergonomics without increasing security risk.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Decision Matrix
|
|
20
|
+
|
|
21
|
+
| Criterion | Score | Notes |
|
|
22
|
+
|-----------|-------|-------|
|
|
23
|
+
| **User Value** | 8/10 | Provides clean API for hierarchy queries; evidence of user need from introspection tools |
|
|
24
|
+
| **Security Risk** | 2/10 | No new information exposed; parent/children already public |
|
|
25
|
+
| **Implementation Cost** | 1/10 | Change `private` to `public`; already battle-tested (25+ tests) |
|
|
26
|
+
| **Industry Alignment** | 5/10 | No industry standard but not an anti-pattern; would be differentiator |
|
|
27
|
+
| **Maintenance Burden** | 2/10 | Simple method with minimal surface area |
|
|
28
|
+
|
|
29
|
+
**Overall Assessment**: LOW risk, HIGH value, EASY implementation
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Detailed Findings
|
|
34
|
+
|
|
35
|
+
### 1. Current Implementation
|
|
36
|
+
|
|
37
|
+
**Location**: `src/core/workflow.ts:162-180`
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
/**
|
|
41
|
+
* Check if this workflow is a descendant of the given ancestor workflow
|
|
42
|
+
* Traverses the parent chain upward looking for the ancestor reference
|
|
43
|
+
* Uses visited Set to detect cycles during traversal
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
* @param ancestor - The potential ancestor workflow to check
|
|
47
|
+
* @returns true if ancestor is found in parent chain, false otherwise
|
|
48
|
+
* @throws {Error} If a cycle is detected during traversal
|
|
49
|
+
*/
|
|
50
|
+
private isDescendantOf(ancestor: Workflow): boolean {
|
|
51
|
+
const visited = new Set<Workflow>();
|
|
52
|
+
let current: Workflow | null = this.parent;
|
|
53
|
+
|
|
54
|
+
while (current !== null) {
|
|
55
|
+
if (visited.has(current)) {
|
|
56
|
+
throw new Error('Circular parent-child relationship detected');
|
|
57
|
+
}
|
|
58
|
+
visited.add(current);
|
|
59
|
+
|
|
60
|
+
if (current === ancestor) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
current = current.parent;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Current Usage**: Single call site at `src/core/workflow.ts:293` in `attachChild()` method for circular reference detection.
|
|
72
|
+
|
|
73
|
+
**Test Coverage**: 25+ test cases covering:
|
|
74
|
+
- Basic circular reference detection
|
|
75
|
+
- Deep hierarchies (1000+ levels)
|
|
76
|
+
- Complex circular reference scenarios
|
|
77
|
+
- Performance validation
|
|
78
|
+
|
|
79
|
+
### 2. User Needs Assessment
|
|
80
|
+
|
|
81
|
+
**Evidence from Codebase:**
|
|
82
|
+
|
|
83
|
+
#### Introspection Tools (Public Hierarchy Access)
|
|
84
|
+
```typescript
|
|
85
|
+
// File: src/tools/introspection.ts
|
|
86
|
+
export const INTROSPECTION_TOOLS: Tool[] = [
|
|
87
|
+
inspectCurrentNodeTool, // "Where am I?" - shows depth, parent info
|
|
88
|
+
readAncestorChainTool, // "What's above me?" - full ancestor chain
|
|
89
|
+
listSiblingsChildrenTool, // "What's around me?" - siblings and children
|
|
90
|
+
// ... more tools
|
|
91
|
+
];
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Finding**: Introspection tools demonstrate clear user need for hierarchy navigation.
|
|
95
|
+
|
|
96
|
+
#### Example: Parent-Child Workflow Display
|
|
97
|
+
```typescript
|
|
98
|
+
// File: examples/examples/03-parent-child.ts:222-231
|
|
99
|
+
console.log('Pipeline:', pipeline.id);
|
|
100
|
+
console.log(' Children (batches):', pipeline.children.length);
|
|
101
|
+
for (const batch of pipeline.children) {
|
|
102
|
+
console.log(` ${batch.getNode().name} - ${batch.children.length} items`);
|
|
103
|
+
for (const item of batch.children) {
|
|
104
|
+
console.log(` ${item.getNode().name} [${item.getNode().status}]`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Finding**: Users are manually traversing hierarchy using `parent` and `children` properties.
|
|
110
|
+
|
|
111
|
+
#### Example: Ancestor Chain Query
|
|
112
|
+
```typescript
|
|
113
|
+
// File: examples/examples/10-introspection.ts:186-207
|
|
114
|
+
const result = await handleReadAncestorChain({ maxDepth: 10 });
|
|
115
|
+
console.log(`Total depth: ${result.totalDepth}`);
|
|
116
|
+
console.log('Ancestors (from current to root):');
|
|
117
|
+
for (const ancestor of result.ancestors) {
|
|
118
|
+
console.log(` Depth ${ancestor.depth}: ${ancestor.name} [${ancestor.status}]`);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Finding**: Users want to query ancestry relationships programmatically.
|
|
123
|
+
|
|
124
|
+
**Use Cases Identified:**
|
|
125
|
+
1. **Hierarchy Validation**: Check if a workflow belongs to a specific tree
|
|
126
|
+
2. **Debugging**: Understand workflow position in hierarchy
|
|
127
|
+
3. **Conditional Logic**: Execute code only if in specific hierarchy branch
|
|
128
|
+
4. **Tree Verification**: Validate workflow tree structure
|
|
129
|
+
|
|
130
|
+
### 3. Security Assessment
|
|
131
|
+
|
|
132
|
+
**Information Disclosure Comparison:**
|
|
133
|
+
|
|
134
|
+
| API | Information Exposed | Access | Risk Level |
|
|
135
|
+
|-----|-------------------|--------|------------|
|
|
136
|
+
| `workflow.parent` | Direct parent reference | Any `Workflow` | MEDIUM |
|
|
137
|
+
| `workflow.children` | All immediate children | Any `Workflow` | MEDIUM |
|
|
138
|
+
| `workflow.getNode()` | Full tree + logs + events + state | Any `Workflow` | HIGH |
|
|
139
|
+
| `read_ancestor_chain` | All ancestors to root | Execution context | MEDIUM |
|
|
140
|
+
| `isDescendantOf()` | Boolean relationship check | Would be public | LOW |
|
|
141
|
+
|
|
142
|
+
**Key Finding**: `isDescendantOf()` does NOT expose any new information. The `parent` and `children` properties are already public, allowing full tree traversal:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
// Current attack (without isDescendantOf):
|
|
146
|
+
function isDescendant(current: Workflow, ancestor: Workflow): boolean {
|
|
147
|
+
let node = current;
|
|
148
|
+
while (node.parent) {
|
|
149
|
+
if (node.parent === ancestor) return true;
|
|
150
|
+
node = node.parent;
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// With isDescendantOf (convenience, not new capability):
|
|
156
|
+
const isDesc = current.isDescendantOf(ancestor);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Risk Level**: **LOW** (no increase over current exposure)
|
|
160
|
+
|
|
161
|
+
**Mitigation**: Add security documentation warning applications to implement access control if exposing workflows via APIs.
|
|
162
|
+
|
|
163
|
+
### 4. Industry Comparison
|
|
164
|
+
|
|
165
|
+
**Research Summary** (6 major workflow engines analyzed):
|
|
166
|
+
|
|
167
|
+
| System | Ancestry API | Access Control | Notes |
|
|
168
|
+
|--------|--------------|----------------|-------|
|
|
169
|
+
| **Apache Airflow** | No public API | RBAC (DAG-level) | `get_upstream()`/`get_downstream()` (immediate only) |
|
|
170
|
+
| **Temporal** | No public API | mTLS + API keys | Child workflows exist, but no ancestry checking |
|
|
171
|
+
| **Prefect** | No public API | Token auth | Focus on execution state, not topology |
|
|
172
|
+
| **Dagster** | Indirect only | Workspace isolation | `AssetSelection.upstream()`/`.downstream()` |
|
|
173
|
+
| **GitHub Actions** | No public API | GitHub auth | REST API for execution, not topology |
|
|
174
|
+
| **AWS Step Functions** | No public API | IAM permissions | State machines, execution history only |
|
|
175
|
+
| **Groundswell** | Would be public | App's responsibility | Unique in exposing explicit ancestry check |
|
|
176
|
+
|
|
177
|
+
**Finding**: Groundswell would be UNIQUE in exposing a public `isDescendantOf()` API. This is not an anti-pattern, but a differentiator.
|
|
178
|
+
|
|
179
|
+
**Industry Pattern**: Most systems handle ancestry checking internally or provide limited immediate relationship queries only.
|
|
180
|
+
|
|
181
|
+
### 5. Implementation Cost Analysis
|
|
182
|
+
|
|
183
|
+
**Code Changes Required**:
|
|
184
|
+
1. Change `private` to `public` at line 162
|
|
185
|
+
2. Add JSDoc documentation with security warning
|
|
186
|
+
3. No logic changes required
|
|
187
|
+
|
|
188
|
+
**Test Changes Required**:
|
|
189
|
+
1. None - 25+ existing tests already cover the method
|
|
190
|
+
|
|
191
|
+
**Documentation Changes Required**:
|
|
192
|
+
1. Add to API documentation with examples
|
|
193
|
+
2. Add security warning to introspection-security-guide.md
|
|
194
|
+
|
|
195
|
+
**Estimated Effort**: 30 minutes
|
|
196
|
+
|
|
197
|
+
**Risk**: Very Low - method is already stable and battle-tested
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Recommendation
|
|
202
|
+
|
|
203
|
+
### DECISION: MAKE PUBLIC
|
|
204
|
+
|
|
205
|
+
**Rationale:**
|
|
206
|
+
|
|
207
|
+
1. **User Value**: Clear evidence of user need from introspection tools and examples
|
|
208
|
+
2. **No Security Risk**: Does not expose new information beyond existing public APIs
|
|
209
|
+
3. **Low Implementation Cost**: Simple visibility change; already tested
|
|
210
|
+
4. **Competitive Differentiator**: No major workflow engine has this API
|
|
211
|
+
5. **Ergonomics**: Cleaner than manual parent chain traversal
|
|
212
|
+
|
|
213
|
+
### Safeguards Required
|
|
214
|
+
|
|
215
|
+
1. **Documentation Warning**:
|
|
216
|
+
```typescript
|
|
217
|
+
/**
|
|
218
|
+
* Check if this workflow is a descendant of the given ancestor workflow.
|
|
219
|
+
*
|
|
220
|
+
* @warning This method reveals workflow hierarchy information. If your
|
|
221
|
+
* application exposes workflows via an API, ensure you implement proper
|
|
222
|
+
* access control to prevent unauthorized topology discovery.
|
|
223
|
+
*
|
|
224
|
+
* @example Check ancestry before an operation
|
|
225
|
+
* ```typescript
|
|
226
|
+
* if (child.isDescendantOf(root)) {
|
|
227
|
+
* console.log('Child is in the root hierarchy');
|
|
228
|
+
* }
|
|
229
|
+
* ```
|
|
230
|
+
*
|
|
231
|
+
* @example Prevent circular operations
|
|
232
|
+
* ```typescript
|
|
233
|
+
* if (!newChild.isDescendantOf(parent)) {
|
|
234
|
+
* parent.attachChild(newChild);
|
|
235
|
+
* }
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
public isDescendantOf(ancestor: Workflow): boolean
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
2. **Update Security Documentation**:
|
|
242
|
+
- Add `isDescendantOf()` section to `introspection-security-guide.md`
|
|
243
|
+
- Document that hierarchy information is exposed
|
|
244
|
+
- Recommend application-level access control
|
|
245
|
+
|
|
246
|
+
3. **Provide Usage Examples**:
|
|
247
|
+
- Add to API documentation
|
|
248
|
+
- Show common use cases (validation, debugging, conditional logic)
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Implementation Guidance for P1.M3.T4.S2
|
|
253
|
+
|
|
254
|
+
### Step 1: Update Method Visibility
|
|
255
|
+
|
|
256
|
+
**File**: `src/core/workflow.ts`
|
|
257
|
+
**Line**: 162
|
|
258
|
+
|
|
259
|
+
**Change**:
|
|
260
|
+
```typescript
|
|
261
|
+
// BEFORE:
|
|
262
|
+
private isDescendantOf(ancestor: Workflow): boolean {
|
|
263
|
+
|
|
264
|
+
// AFTER:
|
|
265
|
+
public isDescendantOf(ancestor: Workflow): boolean {
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Step 2: Add JSDoc Documentation
|
|
269
|
+
|
|
270
|
+
**File**: `src/core/workflow.ts`
|
|
271
|
+
**Lines**: 162-180
|
|
272
|
+
|
|
273
|
+
**Add before method**:
|
|
274
|
+
```typescript
|
|
275
|
+
/**
|
|
276
|
+
* Check if this workflow is a descendant of the given ancestor workflow.
|
|
277
|
+
*
|
|
278
|
+
* Traverses the parent chain upward looking for the ancestor reference.
|
|
279
|
+
* Uses a visited Set to detect cycles during traversal.
|
|
280
|
+
*
|
|
281
|
+
* @warning This method reveals workflow hierarchy information. If your
|
|
282
|
+
* application exposes workflows via an API, ensure you implement proper
|
|
283
|
+
* access control to prevent unauthorized topology discovery.
|
|
284
|
+
*
|
|
285
|
+
* @example Check if a workflow belongs to a specific hierarchy
|
|
286
|
+
* ```typescript
|
|
287
|
+
* const root = new Workflow('root');
|
|
288
|
+
* const child = new Workflow('child', { parent: root });
|
|
289
|
+
*
|
|
290
|
+
* if (child.isDescendantOf(root)) {
|
|
291
|
+
* console.log('Child is in root hierarchy');
|
|
292
|
+
* }
|
|
293
|
+
* ```
|
|
294
|
+
*
|
|
295
|
+
* @example Validate before attaching to prevent circular references
|
|
296
|
+
* ```typescript
|
|
297
|
+
* if (!newChild.isDescendantOf(parent)) {
|
|
298
|
+
* parent.attachChild(newChild);
|
|
299
|
+
* } else {
|
|
300
|
+
* throw new Error('Would create circular reference');
|
|
301
|
+
* }
|
|
302
|
+
* ```
|
|
303
|
+
*
|
|
304
|
+
* @param ancestor - The potential ancestor workflow to check
|
|
305
|
+
* @returns true if ancestor is found in parent chain, false otherwise
|
|
306
|
+
* @throws {Error} If a cycle is detected during traversal
|
|
307
|
+
*/
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Step 3: Update Security Documentation
|
|
311
|
+
|
|
312
|
+
**File**: `plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md`
|
|
313
|
+
|
|
314
|
+
**Add section**:
|
|
315
|
+
```markdown
|
|
316
|
+
## isDescendantOf() Method
|
|
317
|
+
|
|
318
|
+
The `isDescendantOf()` method allows checking if a workflow is a descendant of another workflow.
|
|
319
|
+
|
|
320
|
+
### Information Exposed
|
|
321
|
+
- Boolean relationship check (true if descendant, false otherwise)
|
|
322
|
+
- Does NOT expose new information beyond `parent` and `children` properties
|
|
323
|
+
|
|
324
|
+
### Security Considerations
|
|
325
|
+
- Reveals workflow hierarchy relationships
|
|
326
|
+
- Applications exposing workflows via APIs should implement access control
|
|
327
|
+
- Consider filtering hierarchy information for unauthenticated users
|
|
328
|
+
|
|
329
|
+
### Mitigation Patterns
|
|
330
|
+
- Implement authentication before exposing workflow references
|
|
331
|
+
- Use filtered DTOs when returning workflow data via APIs
|
|
332
|
+
- Audit access to hierarchy information
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Step 4: Run Tests
|
|
336
|
+
|
|
337
|
+
**Verify**: All existing tests still pass
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# Run tests covering isDescendantOf
|
|
341
|
+
npm test -- circular-reference
|
|
342
|
+
npm test -- deep-hierarchy
|
|
343
|
+
npm test -- complex-circular-reference
|
|
344
|
+
npm test -- attachChild-performance
|
|
345
|
+
|
|
346
|
+
# Expected: All tests pass without modification
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Step 5: Update Type Exports (if needed)
|
|
350
|
+
|
|
351
|
+
**File**: `src/index.ts`
|
|
352
|
+
|
|
353
|
+
**Verify**: The `Workflow` class is already exported (no changes needed)
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
// Should already exist:
|
|
357
|
+
export { Workflow } from './core/workflow.js';
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Alternative Considered: Keep Private
|
|
363
|
+
|
|
364
|
+
**If keeping private**, rationale would be:
|
|
365
|
+
|
|
366
|
+
1. **Industry Alignment**: Most systems don't expose this
|
|
367
|
+
2. **Minimal API Surface**: Smaller public API is easier to maintain
|
|
368
|
+
3. **Workarounds Exist**: Users can manually traverse `parent` chain
|
|
369
|
+
|
|
370
|
+
**Why NOT chosen:**
|
|
371
|
+
- Workaround code is error-prone (forgetting cycle detection)
|
|
372
|
+
- User needs evidence shows demand for this functionality
|
|
373
|
+
- No security benefit (parent/children already public)
|
|
374
|
+
- Low cost to implement
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Next Steps for P1.M3.T4.S2
|
|
379
|
+
|
|
380
|
+
1. **Review this recommendation** and confirm approval
|
|
381
|
+
2. **Implement changes** following the implementation guidance above
|
|
382
|
+
3. **Run tests** to verify no regressions
|
|
383
|
+
4. **Update documentation** as specified
|
|
384
|
+
5. **Create PR** with reference to this recommendation document
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## References
|
|
389
|
+
|
|
390
|
+
### Research Artifacts
|
|
391
|
+
|
|
392
|
+
- **External Research**: `P1M3T4S1/research/external_workflow_engines_research.md`
|
|
393
|
+
- Comprehensive comparison of 6 major workflow engines
|
|
394
|
+
- Specific URLs and code examples for each system
|
|
395
|
+
|
|
396
|
+
- **Security Analysis**: `P1M3T4S1/research/security_implications_analysis.md`
|
|
397
|
+
- Detailed security risk assessment
|
|
398
|
+
- Comparison with existing public APIs
|
|
399
|
+
|
|
400
|
+
### Code References
|
|
401
|
+
|
|
402
|
+
- **Implementation**: `src/core/workflow.ts:162-180`
|
|
403
|
+
- **Usage Site**: `src/core/workflow.ts:293` (attachChild method)
|
|
404
|
+
- **Introspection Tools**: `src/tools/introspection.ts`
|
|
405
|
+
- **Examples**: `examples/10-introspection.ts`, `examples/03-parent-child.ts`
|
|
406
|
+
|
|
407
|
+
### Documentation References
|
|
408
|
+
|
|
409
|
+
- **PRD**: `PRD.md` - Section on WorkflowNode hierarchy
|
|
410
|
+
- **Security Guide**: `plan/.../introspection-security-guide.md`
|
|
411
|
+
- **Bug Fix Tasks**: `plan/.../bug_fix_tasks.json` - P1.M3.T4 task definition
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
**Document Prepared By**: P1.M3.T4.S1 Research Task
|
|
416
|
+
**Review Required By**: P1.M3.T4.S2 Implementation Task
|
|
417
|
+
**Final Approval**: Technical Lead / Project Maintainer
|