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,434 @@
|
|
|
1
|
+
# Product Requirement Prompt (PRP): Add Tests for Public isDescendantOf API
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
**Feature Goal**: Add comprehensive test coverage for the public `isDescendantOf` API method, ensuring full validation of true positive (descendant), true negative (not descendant), and edge cases (self-reference, circular reference) scenarios.
|
|
8
|
+
|
|
9
|
+
**Deliverable**: Enhanced test suite in `src/__tests__/unit/workflow-isDescendantOf.test.ts` with additional test cases for any gaps in existing coverage.
|
|
10
|
+
|
|
11
|
+
**Success Definition**:
|
|
12
|
+
- All test scenarios pass including edge cases for circular reference handling
|
|
13
|
+
- Test coverage includes true positive, true negative, self-reference, and corrupted tree scenarios
|
|
14
|
+
- Public API accessibility verified without type casting
|
|
15
|
+
- All existing tests continue to pass
|
|
16
|
+
|
|
17
|
+
## User Persona (if applicable)
|
|
18
|
+
|
|
19
|
+
**Target User**: Library developers integrating Groundswell workflow engine into their applications.
|
|
20
|
+
|
|
21
|
+
**Use Case**: Developers need to programmatically validate workflow hierarchy relationships to:
|
|
22
|
+
- Prevent circular references before attaching workflows
|
|
23
|
+
- Validate workflows belong to specific hierarchies (e.g., production vs staging)
|
|
24
|
+
- Implement conditional logic based on ancestry position
|
|
25
|
+
|
|
26
|
+
**User Journey**:
|
|
27
|
+
1. Developer has workflow instances with parent-child relationships
|
|
28
|
+
2. Developer calls `workflow.isDescendantOf(potentialAncestor)` to check relationship
|
|
29
|
+
3. Method returns boolean indicating ancestry status
|
|
30
|
+
4. Developer uses result for validation, conditional logic, or error prevention
|
|
31
|
+
|
|
32
|
+
**Pain Points Addressed**:
|
|
33
|
+
- No programmatic way to check ancestry without manual parent chain traversal
|
|
34
|
+
- Risk of creating circular references when attaching workflows
|
|
35
|
+
- Difficulty validating workflow hierarchy membership for multi-environment setups
|
|
36
|
+
|
|
37
|
+
## Why
|
|
38
|
+
|
|
39
|
+
- **API Validation**: P1.M3.T4.S2 made `isDescendantOf` public; tests ensure the public API works correctly
|
|
40
|
+
- **Contract Compliance**: Work item contract requires tests covering true positive, true negative, edge cases (same workflow, circular reference)
|
|
41
|
+
- **Safety**: Circular reference detection prevents infinite loops and corrupted tree structures
|
|
42
|
+
- **Developer Confidence**: Comprehensive tests demonstrate reliability for external consumers
|
|
43
|
+
|
|
44
|
+
## What
|
|
45
|
+
|
|
46
|
+
Add test coverage for the public `isDescendantOf` API method. The test file already exists with substantial coverage (21 tests), but one gap exists: no direct test of `isDescendantOf` throwing an error when called on a corrupted tree with circular references.
|
|
47
|
+
|
|
48
|
+
### Success Criteria
|
|
49
|
+
|
|
50
|
+
- [ ] All existing tests pass (21 current tests)
|
|
51
|
+
- [ ] New test added for `isDescendantOf` error handling with circular references
|
|
52
|
+
- [ ] Test coverage includes: direct descendants, nested descendants, unrelated workflows, siblings, self-reference, orphan workflows, complex hierarchies, circular reference error handling
|
|
53
|
+
- [ ] Public API accessibility verified without `(as any)` type casting
|
|
54
|
+
|
|
55
|
+
## All Needed Context
|
|
56
|
+
|
|
57
|
+
### Context Completeness Check
|
|
58
|
+
|
|
59
|
+
**"No Prior Knowledge" test**: A developer unfamiliar with this codebase would have everything needed to implement these tests because:
|
|
60
|
+
- Existing test file provides clear patterns to follow
|
|
61
|
+
- Method implementation is fully documented
|
|
62
|
+
- Test patterns are consistent across the codebase
|
|
63
|
+
- Edge cases are clearly identified
|
|
64
|
+
|
|
65
|
+
### Documentation & References
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# MUST READ - Implementation to test
|
|
69
|
+
- file: src/core/workflow.ts:201-219
|
|
70
|
+
why: Exact implementation of isDescendantOf method to test
|
|
71
|
+
pattern: Iterative traversal with visited Set for cycle detection
|
|
72
|
+
critical: Method throws "Circular parent-child relationship detected" when cycle found
|
|
73
|
+
|
|
74
|
+
# MUST READ - Documentation of method behavior
|
|
75
|
+
- file: src/core/workflow.ts:152-200
|
|
76
|
+
why: JSDoc documentation with usage examples and security warning
|
|
77
|
+
section: Security warning about information disclosure
|
|
78
|
+
|
|
79
|
+
# MUST READ - Existing tests to extend
|
|
80
|
+
- file: src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
81
|
+
why: Current test coverage (21 tests) - identify what's missing
|
|
82
|
+
pattern: Nested describe blocks with BDD-style naming
|
|
83
|
+
coverage: Public API accessibility, direct/nested descendants, unrelated, siblings, self-reference, complex hierarchies
|
|
84
|
+
gap: No direct test of isDescendantOf throwing on corrupted tree
|
|
85
|
+
|
|
86
|
+
# MUST READ - Related circular reference tests
|
|
87
|
+
- file: src/__tests__/adversarial/complex-circular-reference.test.ts
|
|
88
|
+
why: Pattern for testing circular references via attachChild()
|
|
89
|
+
pattern: Tests attachChild() which internally uses isDescendantOf()
|
|
90
|
+
gotcha: These test attachChild(), not isDescendantOf() directly
|
|
91
|
+
|
|
92
|
+
- file: src/__tests__/unit/workflow.test.ts:285-313
|
|
93
|
+
why: Tests getRoot() and getRootObservers() throwing on circular reference
|
|
94
|
+
pattern: Manually create circular ref, then test method throws
|
|
95
|
+
gap: No test for isDescendantOf() throwing on corrupted tree
|
|
96
|
+
|
|
97
|
+
# MUST READ - Test configuration
|
|
98
|
+
- file: vitest.config.ts
|
|
99
|
+
why: Vitest configuration for running tests
|
|
100
|
+
pattern: Tests in src/__tests__/**/*.test.ts, globals enabled
|
|
101
|
+
|
|
102
|
+
# MUST READ - Test helper patterns
|
|
103
|
+
- file: src/__tests__/adversarial/circular-reference.test.ts:20-26
|
|
104
|
+
why: SimpleWorkflow class pattern for testing
|
|
105
|
+
pattern: Extend Workflow, implement minimal run() method
|
|
106
|
+
|
|
107
|
+
# EXTERNAL RESEARCH - Vitest Documentation
|
|
108
|
+
- url: https://vitest.dev/api/
|
|
109
|
+
why: Complete vitest API reference for assertions and test functions
|
|
110
|
+
critical: expect().toThrow() for error testing
|
|
111
|
+
|
|
112
|
+
- url: https://vitest.dev/guide/assertion.html
|
|
113
|
+
why: Assertion patterns including toThrow(), toBe(), toEqual()
|
|
114
|
+
section: Error testing with expect().toThrow()
|
|
115
|
+
|
|
116
|
+
- url: https://vitest.dev/guide/test-context.html
|
|
117
|
+
why: Test context patterns (beforeEach, afterEach, vi, etc.)
|
|
118
|
+
section: Mocking with vi.spyOn() and vi.restoreAllMocks()
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Current Codebase Tree
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
src/
|
|
125
|
+
├── core/
|
|
126
|
+
│ ├── workflow.ts # Workflow class with isDescendantOf (lines 201-219)
|
|
127
|
+
│ ├── logger.ts # WorkflowLogger for hierarchical logging
|
|
128
|
+
│ └── index.ts
|
|
129
|
+
├── types/
|
|
130
|
+
│ └── workflow.ts # Workflow TypeScript interfaces
|
|
131
|
+
├── __tests__/
|
|
132
|
+
│ ├── unit/
|
|
133
|
+
│ │ ├── workflow.test.ts # General workflow tests
|
|
134
|
+
│ │ ├── workflow-isDescendantOf.test.ts # TARGET FILE - Current isDescendantOf tests
|
|
135
|
+
│ │ ├── workflow-detachChild.test.ts # Example public method test pattern
|
|
136
|
+
│ │ └── ...
|
|
137
|
+
│ ├── adversarial/
|
|
138
|
+
│ │ ├── circular-reference.test.ts # Circular ref patterns
|
|
139
|
+
│ │ └── complex-circular-reference.test.ts # Multi-level circular ref tests
|
|
140
|
+
│ └── integration/
|
|
141
|
+
│ └── ...
|
|
142
|
+
├── index.ts # Main exports
|
|
143
|
+
└── vitest.config.ts # Test configuration
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Desired Codebase Tree with Files to be Added
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# NO NEW FILES - Existing file will be enhanced
|
|
150
|
+
src/__tests__/unit/
|
|
151
|
+
└── workflow-isDescendantOf.test.ts # MODIFY: Add circular reference error test
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Known Gotchas of Our Codebase & Library Quirks
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// CRITICAL: isDescendantOf throws "Circular parent-child relationship detected"
|
|
158
|
+
// when it encounters a cycle during traversal. This is NOT tested directly yet.
|
|
159
|
+
|
|
160
|
+
// GOTCHA: Circular reference must be created MANUALLY by setting .parent property
|
|
161
|
+
// Normal attachChild() prevents this, so test must bypass normal safeguards:
|
|
162
|
+
const parent = new Workflow('parent');
|
|
163
|
+
const child = new Workflow('child', parent);
|
|
164
|
+
parent.parent = child; // Manual corruption - bypasses attachChild validation
|
|
165
|
+
|
|
166
|
+
// GOTCHA: isDescendantOf starts from this.parent, NOT this
|
|
167
|
+
// So workflow.isDescendantOf(workflow) returns false (not considered descendant of self)
|
|
168
|
+
|
|
169
|
+
// GOTCHA: Vitest globals are enabled - no need to import describe/it/expect
|
|
170
|
+
// But existing tests explicitly import them - follow existing pattern
|
|
171
|
+
|
|
172
|
+
// PATTERN: Use SimpleWorkflow class extension for tests requiring run() method
|
|
173
|
+
class SimpleWorkflow extends Workflow {
|
|
174
|
+
async run(): Promise<string> {
|
|
175
|
+
this.setStatus('running');
|
|
176
|
+
this.setStatus('completed');
|
|
177
|
+
return 'done';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// PATTERN: Console mocking in adversarial tests
|
|
182
|
+
beforeEach(() => {
|
|
183
|
+
vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
184
|
+
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
185
|
+
});
|
|
186
|
+
afterEach(() => {
|
|
187
|
+
vi.restoreAllMocks();
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Implementation Blueprint
|
|
192
|
+
|
|
193
|
+
### Data models and structure
|
|
194
|
+
|
|
195
|
+
No new data models needed. Testing existing `Workflow` class with signature:
|
|
196
|
+
```typescript
|
|
197
|
+
public isDescendantOf(ancestor: Workflow): boolean
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Implementation Tasks (ordered by dependencies)
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
Task 1: ANALYZE existing test coverage in workflow-isDescendantOf.test.ts
|
|
204
|
+
- READ: src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
205
|
+
- IDENTIFY: Test categories covered (21 existing tests)
|
|
206
|
+
- IDENTIFY: Missing test scenarios (circular reference error handling)
|
|
207
|
+
- DOCUMENT: Test patterns used in existing tests
|
|
208
|
+
|
|
209
|
+
Task 2: VERIFY isDescendantOf implementation error handling
|
|
210
|
+
- READ: src/core/workflow.ts:201-219
|
|
211
|
+
- UNDERSTAND: Cycle detection algorithm with visited Set
|
|
212
|
+
- CONFIRM: Error message is "Circular parent-child relationship detected"
|
|
213
|
+
- UNDERSTAND: When error is thrown (when visited.has(current) is true)
|
|
214
|
+
|
|
215
|
+
Task 3: REVIEW circular reference test patterns
|
|
216
|
+
- READ: src/__tests__/unit/workflow.test.ts:285-313
|
|
217
|
+
- READ: src/__tests__/adversarial/complex-circular-reference.test.ts
|
|
218
|
+
- EXTRACT: Pattern for creating manual circular reference
|
|
219
|
+
- EXTRACT: Pattern for testing thrown errors
|
|
220
|
+
|
|
221
|
+
Task 4: ADD new test for isDescendantOf circular reference error
|
|
222
|
+
- FILE: src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
223
|
+
- ADD: New describe block "Edge Cases: Circular Reference Detection"
|
|
224
|
+
- IMPLEMENT: Test that creates manual circular reference
|
|
225
|
+
- IMPLEMENT: Test that calls isDescendantOf() on corrupted tree
|
|
226
|
+
- ASSERT: expect(() => descendant.isDescendantOf(ancestor)).toThrow('Circular parent-child relationship detected')
|
|
227
|
+
- PLACEMENT: After existing "Edge Cases" describe block (line 157)
|
|
228
|
+
|
|
229
|
+
Task 5: RUN test suite to verify all tests pass
|
|
230
|
+
- COMMAND: npm test or uv run vitest run
|
|
231
|
+
- VERIFY: All 21 existing tests still pass
|
|
232
|
+
- VERIFY: New test passes
|
|
233
|
+
- VERIFY: No regressions in other test files
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Implementation Patterns & Key Details
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
// Pattern: Creating manual circular reference for testing
|
|
240
|
+
// FROM: src/__tests__/unit/workflow.test.ts:285-296
|
|
241
|
+
const parent = new SimpleWorkflow('Parent');
|
|
242
|
+
const child = new SimpleWorkflow('Child', parent);
|
|
243
|
+
|
|
244
|
+
// Act: Create circular reference manually
|
|
245
|
+
// This simulates a bug or malicious input that creates a cycle
|
|
246
|
+
parent.parent = child;
|
|
247
|
+
|
|
248
|
+
// Assert: isDescendantOf should throw error for circular reference
|
|
249
|
+
expect(() => parent.isDescendantOf(child)).toThrow(
|
|
250
|
+
'Circular parent-child relationship detected'
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
// Pattern: Existing test file structure
|
|
254
|
+
// FROM: src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
255
|
+
import { describe, it, expect } from 'vitest';
|
|
256
|
+
import { Workflow } from '../../core/workflow.js';
|
|
257
|
+
|
|
258
|
+
describe('Workflow.isDescendantOf() - Public API', () => {
|
|
259
|
+
describe('Existing Test Categories', () => {
|
|
260
|
+
// Tests here...
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
describe('Edge Cases: Circular Reference Detection', () => {
|
|
264
|
+
// NEW TEST GOES HERE
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Integration Points
|
|
270
|
+
|
|
271
|
+
```yaml
|
|
272
|
+
NO NEW INTEGRATIONS:
|
|
273
|
+
- This task only adds tests
|
|
274
|
+
- No changes to production code
|
|
275
|
+
- No new dependencies
|
|
276
|
+
- No configuration changes
|
|
277
|
+
|
|
278
|
+
TEST INTEGRATION:
|
|
279
|
+
- Tests run via existing vitest configuration
|
|
280
|
+
- Test file follows existing naming pattern
|
|
281
|
+
- Test structure follows existing patterns in codebase
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Validation Loop
|
|
285
|
+
|
|
286
|
+
### Level 1: Syntax & Style (Immediate Feedback)
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
# Run after adding test - TypeScript compilation check
|
|
290
|
+
npx tsc --noEmit
|
|
291
|
+
|
|
292
|
+
# Check if TypeScript compiler finds any issues with the new test
|
|
293
|
+
# Expected: No TypeScript errors
|
|
294
|
+
|
|
295
|
+
# Run linter if configured
|
|
296
|
+
npm run lint 2>/dev/null || echo "No lint script configured"
|
|
297
|
+
# Expected: No linting errors
|
|
298
|
+
|
|
299
|
+
# Format check
|
|
300
|
+
npx prettier --check src/__tests__/unit/workflow-isDescendantOf.test.ts 2>/dev/null || echo "Prettier not configured"
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Level 2: Unit Tests (Component Validation)
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# Run specific test file to verify new test
|
|
307
|
+
npm test -- workflow-isDescendantOf.test.ts
|
|
308
|
+
|
|
309
|
+
# Alternative: Using vitest directly
|
|
310
|
+
npx vitest run src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
311
|
+
|
|
312
|
+
# Expected: All tests pass, including new circular reference test
|
|
313
|
+
|
|
314
|
+
# Run full unit test suite to ensure no regressions
|
|
315
|
+
npm test -- src/__tests__/unit/
|
|
316
|
+
|
|
317
|
+
# Expected: All unit tests pass
|
|
318
|
+
|
|
319
|
+
# Check test coverage for isDescendantOf
|
|
320
|
+
npx vitest run --coverage src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
321
|
+
|
|
322
|
+
# Expected: 100% coverage for isDescendantOf method
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Level 3: Integration Testing (System Validation)
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# Run full test suite
|
|
329
|
+
npm test
|
|
330
|
+
# OR: npx vitest run
|
|
331
|
+
|
|
332
|
+
# Expected: All tests pass (unit, integration, adversarial)
|
|
333
|
+
|
|
334
|
+
# Verify specific test categories
|
|
335
|
+
npm test -- -t "isDescendantOf"
|
|
336
|
+
|
|
337
|
+
# Expected: All isDescendantOf tests pass (22 tests total)
|
|
338
|
+
|
|
339
|
+
# Verify no impact on related workflow tests
|
|
340
|
+
npm test -- workflow.test.ts
|
|
341
|
+
npm test -- workflow-detachChild.test.ts
|
|
342
|
+
|
|
343
|
+
# Expected: All related tests pass
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Level 4: Creative & Domain-Specific Validation
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# Manual verification: Check that test properly validates error case
|
|
350
|
+
# 1. Review test code to ensure it correctly creates circular reference
|
|
351
|
+
# 2. Verify error message matches implementation exactly
|
|
352
|
+
# 3. Confirm test would catch regression if cycle detection was removed
|
|
353
|
+
|
|
354
|
+
# Documentation verification
|
|
355
|
+
grep -n "Circular parent-child relationship detected" src/core/workflow.ts
|
|
356
|
+
grep -n "Circular parent-child relationship detected" src/__tests__/unit/workflow-isDescendantOf.test.ts
|
|
357
|
+
|
|
358
|
+
# Expected: Error message appears in both implementation and test
|
|
359
|
+
|
|
360
|
+
# Test coverage verification
|
|
361
|
+
npx vitest run --coverage --reporter=verbose
|
|
362
|
+
|
|
363
|
+
# Expected: isDescendantOf shows 100% coverage including error path
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Final Validation Checklist
|
|
367
|
+
|
|
368
|
+
### Technical Validation
|
|
369
|
+
|
|
370
|
+
- [ ] TypeScript compiles without errors: `npx tsc --noEmit`
|
|
371
|
+
- [ ] All existing tests pass: `npm test`
|
|
372
|
+
- [ ] New test for circular reference error handling passes
|
|
373
|
+
- [ ] Test coverage for isDescendantOf is 100%
|
|
374
|
+
- [ ] No linting errors (if linter configured)
|
|
375
|
+
|
|
376
|
+
### Feature Validation
|
|
377
|
+
|
|
378
|
+
- [ ] True positive tests: Direct descendants return true
|
|
379
|
+
- [ ] True positive tests: Nested descendants return true
|
|
380
|
+
- [ ] True negative tests: Unrelated workflows return false
|
|
381
|
+
- [ ] True negative tests: Siblings return false
|
|
382
|
+
- [ ] True negative tests: Reverse relationship (parent checking child) returns false
|
|
383
|
+
- [ ] Edge case: Self-reference returns false
|
|
384
|
+
- [ ] Edge case: Orphan workflow returns false
|
|
385
|
+
- [ ] Edge case: Circular reference throws "Circular parent-child relationship detected"
|
|
386
|
+
- [ ] Public API accessibility: No type casting required
|
|
387
|
+
|
|
388
|
+
### Code Quality Validation
|
|
389
|
+
|
|
390
|
+
- [ ] Test follows existing patterns in workflow-isDescendantOf.test.ts
|
|
391
|
+
- [ ] Test uses SimpleWorkflow class if needed (not needed for this test)
|
|
392
|
+
- [ ] Test name follows BDD-style convention: "should [do something] when [condition]"
|
|
393
|
+
- [ ] Test is in appropriate describe block (Edge Cases)
|
|
394
|
+
- [ ] Test includes clear comments explaining the scenario
|
|
395
|
+
|
|
396
|
+
### Documentation & Deployment
|
|
397
|
+
|
|
398
|
+
- [ ] Test includes explanatory comments for complex scenario (circular reference creation)
|
|
399
|
+
- [ ] Test file header documentation is accurate
|
|
400
|
+
- [ ] No changes to production code (this is a test-only task)
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Anti-Patterns to Avoid
|
|
405
|
+
|
|
406
|
+
- ❌ Don't modify the production code (this is a test-only task)
|
|
407
|
+
- ❌ Don't create circular references through attachChild() (it's designed to prevent them)
|
|
408
|
+
- ❌ Don't skip testing the error path (that's the whole point of this task)
|
|
409
|
+
- ❌ Don't use different assertion patterns than existing tests
|
|
410
|
+
- ❌ Don't forget to clean up any mocks in afterEach
|
|
411
|
+
- ❌ Don't add console output in tests (use console mocking if needed)
|
|
412
|
+
- ❌ Don't test the private implementation details - test the public API behavior
|
|
413
|
+
- ❌ Don't create unnecessary test files - add to existing workflow-isDescendantOf.test.ts
|
|
414
|
+
|
|
415
|
+
## Summary
|
|
416
|
+
|
|
417
|
+
**Current State**: `src/__tests__/unit/workflow-isDescendantOf.test.ts` contains 21 tests covering most scenarios but lacks a direct test for circular reference error handling.
|
|
418
|
+
|
|
419
|
+
**Required Change**: Add one new test that:
|
|
420
|
+
1. Creates a manual circular reference by setting `.parent` property directly
|
|
421
|
+
2. Calls `isDescendantOf()` on the corrupted tree
|
|
422
|
+
3. Asserts that it throws "Circular parent-child relationship detected"
|
|
423
|
+
|
|
424
|
+
**Implementation Effort**: Low (~10 lines of code following existing patterns)
|
|
425
|
+
|
|
426
|
+
**Confidence Score**: 10/10 for one-pass implementation success
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
**Sources:**
|
|
431
|
+
|
|
432
|
+
- [Vitest API Reference](https://vitest.dev/api/)
|
|
433
|
+
- [Vitest Assertion API](https://vitest.dev/guide/assertion.html)
|
|
434
|
+
- [Vitest Test Context](https://vitest.dev/guide/test-context.html)
|