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,339 @@
|
|
|
1
|
+
# Quick Reference: Bidirectional Tree Consistency Testing
|
|
2
|
+
|
|
3
|
+
**For immediate use in writing tests**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The Golden Rule
|
|
8
|
+
|
|
9
|
+
> **Every tree operation MUST update BOTH trees (Workflow + WorkflowNode) atomically**
|
|
10
|
+
|
|
11
|
+
If you attach a child to a parent, you must update:
|
|
12
|
+
1. `child.parent` (workflow tree)
|
|
13
|
+
2. `parent.children` (workflow tree)
|
|
14
|
+
3. `child.node.parent` (node tree)
|
|
15
|
+
4. `parent.node.children` (node tree)
|
|
16
|
+
|
|
17
|
+
All four must happen, or trees become inconsistent.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Essential Helper Functions
|
|
22
|
+
|
|
23
|
+
### verifyBidirectionalLink(parent, child)
|
|
24
|
+
Use after every `attachChild()` and after reparenting
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { verifyBidirectionalLink } from '../helpers/tree-verification';
|
|
28
|
+
|
|
29
|
+
// After attaching
|
|
30
|
+
parent.attachChild(child);
|
|
31
|
+
verifyBidirectionalLink(parent, child); // ✅ Checks both trees
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### verifyTreeMirror(root)
|
|
35
|
+
Use to ensure 1:1 correspondence between trees
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { verifyTreeMirror } from '../helpers/tree-verification';
|
|
39
|
+
|
|
40
|
+
// After tree mutations
|
|
41
|
+
parent.detachChild(child);
|
|
42
|
+
newParent.attachChild(child);
|
|
43
|
+
verifyTreeMirror(newParent); // ✅ Validates entire tree
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### validateTreeConsistency(root)
|
|
47
|
+
Returns array of inconsistency descriptions
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { validateTreeConsistency } from '../helpers/tree-verification';
|
|
51
|
+
|
|
52
|
+
const errors = validateTreeConsistency(root);
|
|
53
|
+
expect(errors).toEqual([]); // ✅ Empty = valid tree
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Test Template (Copy-Paste)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { describe, it, expect } from 'vitest';
|
|
62
|
+
import { Workflow } from '../../index.js';
|
|
63
|
+
import { verifyBidirectionalLink, verifyTreeMirror, validateTreeConsistency } from '../helpers/tree-verification';
|
|
64
|
+
|
|
65
|
+
class TestWorkflow extends Workflow {
|
|
66
|
+
async run(): Promise<string> {
|
|
67
|
+
return 'done';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
describe('Tree Consistency', () => {
|
|
72
|
+
it('should maintain consistency after [OPERATION]', () => {
|
|
73
|
+
// ARRANGE
|
|
74
|
+
const parent = new TestWorkflow('Parent');
|
|
75
|
+
const child = new TestWorkflow('Child');
|
|
76
|
+
|
|
77
|
+
// ACT
|
|
78
|
+
parent.attachChild(child);
|
|
79
|
+
|
|
80
|
+
// ASSERT - Always check both trees!
|
|
81
|
+
verifyBidirectionalLink(parent, child);
|
|
82
|
+
verifyTreeMirror(parent);
|
|
83
|
+
expect(validateTreeConsistency(parent)).toEqual([]);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Critical Invariants
|
|
91
|
+
|
|
92
|
+
### 1. Tree Mirror Invariant
|
|
93
|
+
**If A is B's parent in workflow tree, A must be B's parent in node tree**
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// ✅ CORRECT
|
|
97
|
+
expect(child.parent).toBe(parent); // Workflow tree
|
|
98
|
+
expect(child.node.parent).toBe(parent.node); // Node tree (MUST match)
|
|
99
|
+
|
|
100
|
+
// ❌ WRONG - Only checks one tree
|
|
101
|
+
expect(child.parent).toBe(parent);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 2. Bidirectional Link Invariant
|
|
105
|
+
**If A is B's parent, B must be in A's children array (in BOTH trees)**
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// ✅ CORRECT - Checks both directions
|
|
109
|
+
expect(child.parent).toBe(parent);
|
|
110
|
+
expect(parent.children).toContain(child);
|
|
111
|
+
expect(child.node.parent).toBe(parent.node);
|
|
112
|
+
expect(parent.node.children).toContain(child.node);
|
|
113
|
+
|
|
114
|
+
// ❌ WRONG - Only checks forward direction
|
|
115
|
+
expect(parent.children).toContain(child);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 3. No Orphaned Nodes Invariant
|
|
119
|
+
**Every non-root node must have exactly one parent who claims it**
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// ✅ CORRECT
|
|
123
|
+
// child has parent
|
|
124
|
+
expect(child.parent).toBe(parent);
|
|
125
|
+
// parent knows about child
|
|
126
|
+
expect(parent.children).toContain(child);
|
|
127
|
+
// No other parent claims this child
|
|
128
|
+
const otherClaimants = allNodes.filter(n => n !== parent && n.children.includes(child));
|
|
129
|
+
expect(otherClaimants).toEqual([]);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Common Test Scenarios
|
|
135
|
+
|
|
136
|
+
### Scenario 1: Test attachChild()
|
|
137
|
+
```typescript
|
|
138
|
+
it('should maintain consistency after attach', () => {
|
|
139
|
+
const parent = new TestWorkflow('Parent');
|
|
140
|
+
const child = new TestWorkflow('Child');
|
|
141
|
+
|
|
142
|
+
parent.attachChild(child);
|
|
143
|
+
|
|
144
|
+
// Verify bidirectional links
|
|
145
|
+
verifyBidirectionalLink(parent, child);
|
|
146
|
+
|
|
147
|
+
// Verify tree mirror
|
|
148
|
+
verifyTreeMirror(parent);
|
|
149
|
+
|
|
150
|
+
// Verify no inconsistencies
|
|
151
|
+
expect(validateTreeConsistency(parent)).toEqual([]);
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Scenario 2: Test detachChild()
|
|
156
|
+
```typescript
|
|
157
|
+
it('should maintain consistency after detach', () => {
|
|
158
|
+
const parent = new TestWorkflow('Parent');
|
|
159
|
+
const child = new TestWorkflow('Child', parent);
|
|
160
|
+
|
|
161
|
+
parent.detachChild(child);
|
|
162
|
+
|
|
163
|
+
// Verify complete detachment
|
|
164
|
+
expect(child.parent).toBeNull();
|
|
165
|
+
expect(parent.children).not.toContain(child);
|
|
166
|
+
expect(child.node.parent).toBeNull();
|
|
167
|
+
expect(parent.node.children).not.toContain(child.node);
|
|
168
|
+
|
|
169
|
+
verifyTreeMirror(parent);
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Scenario 3: Test Reparenting
|
|
174
|
+
```typescript
|
|
175
|
+
it('should maintain consistency during reparenting', () => {
|
|
176
|
+
const parent1 = new TestWorkflow('Parent1');
|
|
177
|
+
const parent2 = new TestWorkflow('Parent2');
|
|
178
|
+
const child = new TestWorkflow('Child', parent1);
|
|
179
|
+
|
|
180
|
+
// Verify initial state
|
|
181
|
+
verifyBidirectionalLink(parent1, child);
|
|
182
|
+
|
|
183
|
+
// Reparent
|
|
184
|
+
parent1.detachChild(child);
|
|
185
|
+
parent2.attachChild(child);
|
|
186
|
+
|
|
187
|
+
// Verify new state
|
|
188
|
+
verifyBidirectionalLink(parent2, child);
|
|
189
|
+
|
|
190
|
+
// Verify old parent no longer has child
|
|
191
|
+
expect(parent1.children).not.toContain(child);
|
|
192
|
+
expect(parent1.node.children).not.toContain(child.node);
|
|
193
|
+
|
|
194
|
+
// Verify both trees are valid
|
|
195
|
+
verifyTreeMirror(parent1);
|
|
196
|
+
verifyTreeMirror(parent2);
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Scenario 4: Test Error Handling
|
|
201
|
+
```typescript
|
|
202
|
+
it('should not corrupt state on duplicate attach', () => {
|
|
203
|
+
const parent = new TestWorkflow('Parent');
|
|
204
|
+
const child = new TestWorkflow('Child', parent);
|
|
205
|
+
|
|
206
|
+
// Should throw
|
|
207
|
+
expect(() => parent.attachChild(child)).toThrow();
|
|
208
|
+
|
|
209
|
+
// Verify state unchanged
|
|
210
|
+
verifyBidirectionalLink(parent, child);
|
|
211
|
+
verifyTreeMirror(parent);
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Anti-Patterns to Avoid
|
|
218
|
+
|
|
219
|
+
### ❌ Don't check only workflow tree
|
|
220
|
+
```typescript
|
|
221
|
+
// BAD: Only checks workflow tree
|
|
222
|
+
expect(child.parent).toBe(parent);
|
|
223
|
+
expect(parent.children).toContain(child);
|
|
224
|
+
// ❌ Missing node tree checks!
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### ❌ Don't check only one direction
|
|
228
|
+
```typescript
|
|
229
|
+
// BAD: Only checks parent→child
|
|
230
|
+
expect(parent.children).toContain(child);
|
|
231
|
+
// ❌ Missing child→parent check!
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### ❌ Don't forget to verify both trees after errors
|
|
235
|
+
```typescript
|
|
236
|
+
// BAD: Error case not validated
|
|
237
|
+
expect(() => parent2.attachChild(child)).toThrow();
|
|
238
|
+
// ❌ Should verify no corruption occurred!
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### ❌ Don't manually mutate tree properties
|
|
242
|
+
```typescript
|
|
243
|
+
// BAD: Bypasses attachChild validation
|
|
244
|
+
(child as any).parent = newParent;
|
|
245
|
+
// ❌ Creates inconsistency!
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Quick Checklist
|
|
251
|
+
|
|
252
|
+
When writing tree operation tests, ensure you:
|
|
253
|
+
|
|
254
|
+
- [ ] Test both workflow tree AND node tree
|
|
255
|
+
- [ ] Test parent→child AND child→parent directions
|
|
256
|
+
- [ ] Use helper functions (verifyBidirectionalLink, verifyTreeMirror)
|
|
257
|
+
- [ ] Run validateTreeConsistency to check for hidden issues
|
|
258
|
+
- [ ] Test error cases don't corrupt state
|
|
259
|
+
- [ ] Verify state after attach, detach, and reparenting
|
|
260
|
+
- [ ] Test with multiple children
|
|
261
|
+
- [ ] Test with deep hierarchies
|
|
262
|
+
- [ ] Test edge cases (null parent, duplicate attach, circular refs)
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Common Patterns
|
|
267
|
+
|
|
268
|
+
### Pattern: Verify After Every Operation
|
|
269
|
+
```typescript
|
|
270
|
+
operation();
|
|
271
|
+
verifyTreeMirror(root);
|
|
272
|
+
expect(validateTreeConsistency(root)).toEqual([]);
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Pattern: Test Error Cases Don't Corrupt
|
|
276
|
+
```typescript
|
|
277
|
+
expect(() => invalidOperation()).toThrow();
|
|
278
|
+
verifyTreeMirror(root); // State still valid
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Pattern: Test Both Trees Explicitly
|
|
282
|
+
```typescript
|
|
283
|
+
// Workflow tree
|
|
284
|
+
expect(child.parent).toBe(parent);
|
|
285
|
+
expect(parent.children).toContain(child);
|
|
286
|
+
|
|
287
|
+
// Node tree (must match!)
|
|
288
|
+
expect(child.node.parent).toBe(parent.node);
|
|
289
|
+
expect(parent.node.children).toContain(child.node);
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## External References
|
|
295
|
+
|
|
296
|
+
For deeper understanding, see:
|
|
297
|
+
|
|
298
|
+
1. **Full Research Document**
|
|
299
|
+
- `/home/dustin/projects/groundswell/plan/bugfix/P1M3T1S4/research/bidirectional-tree-consistency-testing.md`
|
|
300
|
+
|
|
301
|
+
2. **Test Pattern Examples**
|
|
302
|
+
- `/home/dustin/projects/groundswell/plan/bugfix/P1M3T1S4/research/test-pattern-examples.md`
|
|
303
|
+
|
|
304
|
+
3. **Research Summary**
|
|
305
|
+
- `/home/dustin/projects/groundswell/plan/bugfix/P1M3T1S4/research/SUMMARY.md`
|
|
306
|
+
|
|
307
|
+
4. **Existing Test Examples**
|
|
308
|
+
- `/home/dustin/projects/groundswell/src/__tests__/integration/workflow-reparenting.test.ts`
|
|
309
|
+
- `/home/dustin/projects/groundswell/src/__tests__/adversarial/prd-compliance.test.ts`
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Need Help?
|
|
314
|
+
|
|
315
|
+
### For quick questions:
|
|
316
|
+
- Check the "Test Pattern Examples" document for copy-paste templates
|
|
317
|
+
- Look at existing tests in the codebase
|
|
318
|
+
- Use the helper functions - they handle the complexity
|
|
319
|
+
|
|
320
|
+
### For deep understanding:
|
|
321
|
+
- Read the full research document
|
|
322
|
+
- Study the existing test patterns
|
|
323
|
+
- Review DOM and React Fiber patterns
|
|
324
|
+
|
|
325
|
+
### For implementation:
|
|
326
|
+
1. Create helper functions first
|
|
327
|
+
2. Write tests using helpers
|
|
328
|
+
3. Run tests, fix issues
|
|
329
|
+
4. Iterate and refine
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
**Remember**: The 1:1 tree mirror invariant is CRITICAL. If workflow tree and node tree don't match perfectly, bugs will occur. Always test both trees!
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
**Quick Reference Version:** 1.0
|
|
338
|
+
**Last Updated:** 2026-01-12
|
|
339
|
+
**Maintainer:** P1M3T1S4 Research Team
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Research: Testing Bidirectional Consistency Between Dual Tree Structures
|
|
2
|
+
|
|
3
|
+
**Task:** P1M3T1S4
|
|
4
|
+
**Research Date:** 2026-01-12
|
|
5
|
+
**Status:** ✅ COMPLETE
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Document Index
|
|
10
|
+
|
|
11
|
+
This research package contains comprehensive documentation on testing patterns for bidirectional consistency between Workflow instance tree and WorkflowNode tree.
|
|
12
|
+
|
|
13
|
+
### 📚 Documentation Files
|
|
14
|
+
|
|
15
|
+
#### 1. QUICK_REFERENCE.md ⭐ **START HERE**
|
|
16
|
+
**Best for:** Immediate use in writing tests
|
|
17
|
+
**Contents:**
|
|
18
|
+
- The golden rule of bidirectional consistency
|
|
19
|
+
- Essential helper functions
|
|
20
|
+
- Copy-paste test template
|
|
21
|
+
- Critical invariants
|
|
22
|
+
- Common test scenarios
|
|
23
|
+
- Anti-patterns to avoid
|
|
24
|
+
- Quick checklist
|
|
25
|
+
|
|
26
|
+
**Read time:** 5 minutes
|
|
27
|
+
**Use when:** Writing tests right now
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
#### 2. test-pattern-examples.md
|
|
32
|
+
**Best for:** Implementation with ready-to-use code
|
|
33
|
+
**Contents:**
|
|
34
|
+
- Complete helper functions implementation (600+ lines)
|
|
35
|
+
- 6 complete test patterns with full code:
|
|
36
|
+
- Basic bidirectional consistency tests
|
|
37
|
+
- Reparenting consistency tests
|
|
38
|
+
- Invariant testing patterns
|
|
39
|
+
- Adversarial testing patterns
|
|
40
|
+
- Property-based testing patterns
|
|
41
|
+
- WorkflowTreeDebugger integration patterns
|
|
42
|
+
- Test file template
|
|
43
|
+
- Usage guidelines
|
|
44
|
+
|
|
45
|
+
**Read time:** 15 minutes
|
|
46
|
+
**Use when:** Implementing test suite
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
#### 3. bidirectional-tree-consistency-testing.md
|
|
51
|
+
**Best for:** Comprehensive understanding of patterns
|
|
52
|
+
**Contents:**
|
|
53
|
+
- Core testing patterns (AAA, naming conventions)
|
|
54
|
+
- Bidirectional consistency validation methods
|
|
55
|
+
- Tree operation testing (attach, detach, reparenting)
|
|
56
|
+
- Invariant testing patterns (structural, counting, depth)
|
|
57
|
+
- Adversarial testing approaches
|
|
58
|
+
- External best practices (DOM, React Fiber, academic research)
|
|
59
|
+
- Test pattern catalog
|
|
60
|
+
- Implementation checklist
|
|
61
|
+
|
|
62
|
+
**Read time:** 30 minutes
|
|
63
|
+
**Use when:** Learning patterns deeply
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
#### 4. SUMMARY.md
|
|
68
|
+
**Best for:** Executive overview and roadmap
|
|
69
|
+
**Contents:**
|
|
70
|
+
- Executive summary
|
|
71
|
+
- Key findings from codebase analysis
|
|
72
|
+
- Actionable recommendations (prioritized)
|
|
73
|
+
- URLs to all resources (internal and external)
|
|
74
|
+
- Implementation roadmap (4-week plan)
|
|
75
|
+
- Success metrics
|
|
76
|
+
- Risk assessment
|
|
77
|
+
|
|
78
|
+
**Read time:** 10 minutes
|
|
79
|
+
**Use when:** Planning implementation strategy
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Quick Start Guide
|
|
84
|
+
|
|
85
|
+
### I Need to Write Tests Right Now 🚀
|
|
86
|
+
1. Open **QUICK_REFERENCE.md**
|
|
87
|
+
2. Copy the test template
|
|
88
|
+
3. Use helper functions (verifyBidirectionalLink, verifyTreeMirror)
|
|
89
|
+
4. Run tests
|
|
90
|
+
|
|
91
|
+
### I Need to Implement Test Suite 🛠️
|
|
92
|
+
1. Open **test-pattern-examples.md**
|
|
93
|
+
2. Copy helper functions to `src/__tests__/helpers/tree-verification.ts`
|
|
94
|
+
3. Copy test patterns to new test file
|
|
95
|
+
4. Run and iterate
|
|
96
|
+
|
|
97
|
+
### I Need to Understand the Patterns 📖
|
|
98
|
+
1. Open **bidirectional-tree-consistency-testing.md**
|
|
99
|
+
2. Read relevant sections
|
|
100
|
+
3. Study code examples
|
|
101
|
+
4. Apply to your tests
|
|
102
|
+
|
|
103
|
+
### I Need to Plan Implementation 📋
|
|
104
|
+
1. Open **SUMMARY.md**
|
|
105
|
+
2. Review key findings
|
|
106
|
+
3. Follow implementation roadmap
|
|
107
|
+
4. Track progress with checklist
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Key Takeaways
|
|
112
|
+
|
|
113
|
+
### The Core Problem
|
|
114
|
+
The codebase maintains TWO tree representations:
|
|
115
|
+
1. **Workflow instance tree**: `workflow.parent`, `workflow.children`
|
|
116
|
+
2. **WorkflowNode tree**: `node.parent`, `node.children`
|
|
117
|
+
|
|
118
|
+
Both trees MUST stay perfectly synchronized (1:1 mirror invariant).
|
|
119
|
+
|
|
120
|
+
### The Solution
|
|
121
|
+
Test that every tree operation updates BOTH trees correctly:
|
|
122
|
+
- Test parent→child AND child→parent directions
|
|
123
|
+
- Test workflow tree AND node tree
|
|
124
|
+
- Verify consistency after every operation
|
|
125
|
+
|
|
126
|
+
### The Tools
|
|
127
|
+
Helper functions make it easy:
|
|
128
|
+
- `verifyBidirectionalLink(parent, child)` - Verify one link
|
|
129
|
+
- `verifyTreeMirror(root)` - Verify entire tree
|
|
130
|
+
- `validateTreeConsistency(root)` - Find all inconsistencies
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Research Findings
|
|
135
|
+
|
|
136
|
+
### ✅ What We Found
|
|
137
|
+
|
|
138
|
+
1. **Strong Existing Patterns**
|
|
139
|
+
- Codebase already has excellent testing patterns
|
|
140
|
+
- Extracted and documented for reuse
|
|
141
|
+
- Example: `workflow-reparenting.test.ts:280-302`
|
|
142
|
+
|
|
143
|
+
2. **Critical Invariant Identified**
|
|
144
|
+
- 1:1 tree mirror invariant is key to system correctness
|
|
145
|
+
- Must be verified after every tree mutation
|
|
146
|
+
- Both trees must perfectly correspond
|
|
147
|
+
|
|
148
|
+
3. **External Validation**
|
|
149
|
+
- DOM API patterns align with our approach
|
|
150
|
+
- React Fiber dual tree pattern validates our design
|
|
151
|
+
- Academic research supports invariant testing methods
|
|
152
|
+
|
|
153
|
+
4. **Actionable Patterns**
|
|
154
|
+
- 6+ test patterns documented with full code
|
|
155
|
+
- Helper functions ready to use
|
|
156
|
+
- Templates for quick implementation
|
|
157
|
+
|
|
158
|
+
### 📊 Statistics
|
|
159
|
+
|
|
160
|
+
- **Files Analyzed:** 7 test files + documentation
|
|
161
|
+
- **Patterns Extracted:** 15+ distinct testing patterns
|
|
162
|
+
- **Helper Functions:** 7 reusable utilities
|
|
163
|
+
- **Code Examples:** 600+ lines of ready-to-use code
|
|
164
|
+
- **Documentation:** 2,000+ lines of comprehensive guides
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Implementation Roadmap
|
|
169
|
+
|
|
170
|
+
### Phase 1: Foundation (Week 1) ⭐
|
|
171
|
+
- [ ] Create helper functions library
|
|
172
|
+
- [ ] Add helpers to existing tests
|
|
173
|
+
- [ ] Verify no regressions
|
|
174
|
+
|
|
175
|
+
**File to create:** `src/__tests__/helpers/tree-verification.ts`
|
|
176
|
+
|
|
177
|
+
### Phase 2: Coverage (Week 2)
|
|
178
|
+
- [ ] Create bidirectional consistency test suite
|
|
179
|
+
- [ ] Add invariant tests
|
|
180
|
+
- [ ] Achieve 95%+ coverage
|
|
181
|
+
|
|
182
|
+
**File to create:** `src/__tests__/integration/bidirectional-consistency.test.ts`
|
|
183
|
+
|
|
184
|
+
### Phase 3: Robustness (Week 3)
|
|
185
|
+
- [ ] Create adversarial test suite
|
|
186
|
+
- [ ] Add stress tests
|
|
187
|
+
- [ ] Add property-based tests
|
|
188
|
+
|
|
189
|
+
**File to create:** `src/__tests__/adversarial/tree-invariants.test.ts`
|
|
190
|
+
|
|
191
|
+
### Phase 4: Integration (Week 4)
|
|
192
|
+
- [ ] Add consistency checks to teardown
|
|
193
|
+
- [ ] Integrate with CI/CD
|
|
194
|
+
- [ ] Document patterns
|
|
195
|
+
- [ ] Train team
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## URLs and References
|
|
200
|
+
|
|
201
|
+
### Internal Resources
|
|
202
|
+
- **Reparenting Tests:** `/home/dustin/projects/groundswell/src/__tests__/integration/workflow-reparenting.test.ts`
|
|
203
|
+
- **Tree Mirroring Tests:** `/home/dustin/projects/groundswell/src/__tests__/integration/tree-mirroring.test.ts`
|
|
204
|
+
- **PRD Compliance Tests:** `/home/dustin/projects/groundswell/src/__tests__/adversarial/prd-compliance.test.ts`
|
|
205
|
+
- **Edge Case Tests:** `/home/dustin/projects/groundswell/src/__tests__/adversarial/edge-case.test.ts`
|
|
206
|
+
- **Tree Debugger:** `/home/dustin/projects/groundswell/src/debugger/tree-debugger.ts`
|
|
207
|
+
- **Implementation Patterns:** `/home/dustin/projects/groundswell/plan/docs/bugfix-architecture/implementation_patterns.md`
|
|
208
|
+
|
|
209
|
+
### External Resources
|
|
210
|
+
- **DOM Tree Spec:** https://dom.spec.whatwg.org/#concept-tree-parent
|
|
211
|
+
- **React Fiber:** https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiber.js
|
|
212
|
+
- **QuickCheck Paper:** https://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/quick.pdf
|
|
213
|
+
- **Princeton CS226:** https://www.cs.princeton.edu/courses/archive/fall09/cos226/lectures/22BalancedTrees.pdf
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Success Criteria
|
|
218
|
+
|
|
219
|
+
### Quantitative
|
|
220
|
+
- ✅ 50+ new bidirectional consistency tests
|
|
221
|
+
- ✅ 95%+ coverage of tree manipulation code
|
|
222
|
+
- ✅ Test suite completes in <5 minutes
|
|
223
|
+
- ✅ 5+ potential issues caught by adversarial tests
|
|
224
|
+
|
|
225
|
+
### Qualitative
|
|
226
|
+
- ✅ High confidence in tree operation correctness
|
|
227
|
+
- ✅ Easy to add new consistency tests
|
|
228
|
+
- ✅ Clear patterns documented
|
|
229
|
+
- ✅ Team trained on testing approach
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## FAQ
|
|
234
|
+
|
|
235
|
+
**Q: Why do we need two trees?**
|
|
236
|
+
A: Workflow instance tree provides runtime behavior, WorkflowNode tree provides introspection and debugging. Both must stay in sync.
|
|
237
|
+
|
|
238
|
+
**Q: What happens if trees get out of sync?**
|
|
239
|
+
A: Bugs occur. Events may not propagate correctly, debugging shows wrong structure, observers receive incorrect data.
|
|
240
|
+
|
|
241
|
+
**Q: How do I know if my tests are good enough?**
|
|
242
|
+
A: Use the helper functions! `verifyBidirectionalLink()` and `verifyTreeMirror()` catch most issues.
|
|
243
|
+
|
|
244
|
+
**Q: Can I skip testing node tree if I test workflow tree?**
|
|
245
|
+
A: NO! Both trees must be tested. The whole point is they must stay synchronized.
|
|
246
|
+
|
|
247
|
+
**Q: Where do I start?**
|
|
248
|
+
A: Start with QUICK_REFERENCE.md. It has everything you need to write tests immediately.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Support
|
|
253
|
+
|
|
254
|
+
### Questions?
|
|
255
|
+
- Check QUICK_REFERENCE.md for immediate answers
|
|
256
|
+
- Review test-pattern-examples.md for code samples
|
|
257
|
+
- Read bidirectional-tree-consistency-testing.md for deep understanding
|
|
258
|
+
|
|
259
|
+
### Issues?
|
|
260
|
+
- Verify you're testing both trees
|
|
261
|
+
- Use helper functions consistently
|
|
262
|
+
- Check existing test patterns for examples
|
|
263
|
+
|
|
264
|
+
### Contributions?
|
|
265
|
+
- Follow the patterns in this research
|
|
266
|
+
- Use helper functions in new tests
|
|
267
|
+
- Document new patterns as you discover them
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Document Metadata
|
|
272
|
+
|
|
273
|
+
**Research Task:** P1M3T1S4
|
|
274
|
+
**Completion Date:** 2026-01-12
|
|
275
|
+
**Status:** ✅ COMPLETE
|
|
276
|
+
**Version:** 1.0
|
|
277
|
+
|
|
278
|
+
**Documents:**
|
|
279
|
+
1. QUICK_REFERENCE.md (5 min read)
|
|
280
|
+
2. test-pattern-examples.md (15 min read)
|
|
281
|
+
3. bidirectional-tree-consistency-testing.md (30 min read)
|
|
282
|
+
4. SUMMARY.md (10 min read)
|
|
283
|
+
5. README.md (this file)
|
|
284
|
+
|
|
285
|
+
**Total Documentation:** 2,000+ lines
|
|
286
|
+
**Total Code Examples:** 600+ lines
|
|
287
|
+
**Helper Functions:** 7 reusable utilities
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Next Steps
|
|
292
|
+
|
|
293
|
+
1. **Read** QUICK_REFERENCE.md (5 minutes)
|
|
294
|
+
2. **Create** helper functions library (1 hour)
|
|
295
|
+
3. **Write** tests using patterns (2-4 hours)
|
|
296
|
+
4. **Run** tests and verify (30 minutes)
|
|
297
|
+
5. **Iterate** and refine (ongoing)
|
|
298
|
+
|
|
299
|
+
**Ready to start? Open QUICK_REFERENCE.md!** →
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
**Research Team:** P1M3T1S4
|
|
304
|
+
**Last Updated:** 2026-01-12
|
|
305
|
+
**Contact:** See project documentation for team contacts
|