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,581 @@
|
|
|
1
|
+
# Product Requirement Prompt (PRP): Update WorkflowLogger.child() to accept Partial<LogEntry>
|
|
2
|
+
|
|
3
|
+
**Work Item**: P1.M1.T1.S2 - Update WorkflowLogger.child() to accept Partial<LogEntry>
|
|
4
|
+
**PRD Reference**: Section 12.1 - WorkflowLogger Skeleton
|
|
5
|
+
**Implementation Target**: src/core/logger.ts:84
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
**Feature Goal**: Update the `WorkflowLogger.child()` method signature from `child(parentLogId: string)` to `child(meta: Partial<LogEntry>)` while maintaining backward compatibility with existing string-based calls.
|
|
12
|
+
|
|
13
|
+
**Deliverable**: Modified `src/core/logger.ts:84` child() method that:
|
|
14
|
+
1. Accepts either `string` (legacy) or `Partial<LogEntry>` (new) via function overloads
|
|
15
|
+
2. Extracts `parentLogId` from the parameter
|
|
16
|
+
3. Maintains 100% backward compatibility with existing test files
|
|
17
|
+
4. Follows TypeScript best practices for method overloading
|
|
18
|
+
|
|
19
|
+
**Success Definition**:
|
|
20
|
+
- All existing tests pass without modification
|
|
21
|
+
- New functionality allows `logger.child({ parentLogId: 'id', data: {...} })`
|
|
22
|
+
- TypeScript compilation succeeds with no type errors
|
|
23
|
+
- Method signature matches PRD specification `child(meta: Partial<LogEntry>)`
|
|
24
|
+
|
|
25
|
+
## User Persona
|
|
26
|
+
|
|
27
|
+
**Target User**: Developer implementing hierarchical logging in workflow applications
|
|
28
|
+
|
|
29
|
+
**Use Case**: Creating child loggers that include parent log references and optional metadata
|
|
30
|
+
|
|
31
|
+
**User Journey**:
|
|
32
|
+
1. Developer calls `this.logger.child('parent-id')` for simple parent reference (existing pattern)
|
|
33
|
+
2. Developer calls `this.logger.child({ parentLogId: 'parent-id', data: { userId: '123' } })` for extended metadata (new pattern)
|
|
34
|
+
3. Child logger inherits parentLogId and attaches to all log entries
|
|
35
|
+
|
|
36
|
+
**Pain Points Addressed**:
|
|
37
|
+
- **PRD Compliance**: Current implementation doesn't match PRD specification
|
|
38
|
+
- **Extensibility**: Cannot pass additional metadata when creating child loggers
|
|
39
|
+
- **Type Safety**: String parameter doesn't convey intent as clearly as object parameter
|
|
40
|
+
|
|
41
|
+
## Why
|
|
42
|
+
|
|
43
|
+
- **PRD Compliance**: Section 12.1 specifies `child(meta: Partial<LogEntry>)` but implementation uses `child(parentLogId: string)`
|
|
44
|
+
- **API Consistency**: Aligns implementation with architectural design documented in PRD
|
|
45
|
+
- **Future Extensibility**: `Partial<LogEntry>` signature allows passing additional metadata (data, level, etc.) without future breaking changes
|
|
46
|
+
- **Minimal Breaking Change**: Only 2 test files affected; can maintain backward compatibility via overloads
|
|
47
|
+
|
|
48
|
+
## What
|
|
49
|
+
|
|
50
|
+
### Success Criteria
|
|
51
|
+
|
|
52
|
+
- [ ] child() method updated in src/core/logger.ts:84
|
|
53
|
+
- [ ] Function overloads support both `string` and `Partial<LogEntry>` parameters
|
|
54
|
+
- [ ] Existing tests at src/__tests__/adversarial/deep-analysis.test.ts:61 pass
|
|
55
|
+
- [ ] Existing tests at src/__tests__/adversarial/edge-case.test.ts:96 pass
|
|
56
|
+
- [ ] TypeScript compilation succeeds with no type errors
|
|
57
|
+
- [ ] Method signature matches PRD specification for Partial<LogEntry> parameter
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## All Needed Context
|
|
62
|
+
|
|
63
|
+
### Context Completeness Check
|
|
64
|
+
|
|
65
|
+
_This PRP passes the "No Prior Knowledge" test - someone unfamiliar with the codebase would have everything needed to implement this successfully._
|
|
66
|
+
|
|
67
|
+
### Documentation & References
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
# MUST READ - PRD Specification
|
|
71
|
+
- file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md
|
|
72
|
+
why: Complete analysis of signature mismatch with implementation recommendation
|
|
73
|
+
section: Section 1 - PRD Specification, Section 6 - Recommended Implementation Approach
|
|
74
|
+
critical: Confirms Option 2 (backward compatible overload) is recommended
|
|
75
|
+
|
|
76
|
+
# MUST READ - TypeScript Function Overloads Documentation
|
|
77
|
+
- url: https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads
|
|
78
|
+
why: Official documentation on function overload syntax and best practices
|
|
79
|
+
critical: Implementation must follow overload ordering rules (specific to general)
|
|
80
|
+
|
|
81
|
+
# MUST READ - TypeScript Partial<T> Documentation
|
|
82
|
+
- url: https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype
|
|
83
|
+
why: Official documentation on Partial<T> utility type behavior
|
|
84
|
+
critical: Partial<T> makes ALL properties optional, including required ones
|
|
85
|
+
|
|
86
|
+
# CRITICAL - Current Implementation
|
|
87
|
+
- file: src/core/logger.ts
|
|
88
|
+
why: Current WorkflowLogger.child() implementation at line 84-86
|
|
89
|
+
pattern: Hierarchical logging with parentLogId passed to constructor
|
|
90
|
+
gotcha: Current signature `child(parentLogId: string)` is incompatible with object parameter
|
|
91
|
+
|
|
92
|
+
# CRITICAL - Type Definitions
|
|
93
|
+
- file: src/types/logging.ts
|
|
94
|
+
why: LogEntry interface definition required to understand Partial<LogEntry>
|
|
95
|
+
section: Lines 9-24 define complete LogEntry interface with 7 fields
|
|
96
|
+
gotcha: parentLogId is optional (parentLogId?: string), other fields are required
|
|
97
|
+
|
|
98
|
+
# CRITICAL - Existing Usage Sites (must remain compatible)
|
|
99
|
+
- file: src/__tests__/adversarial/deep-analysis.test.ts
|
|
100
|
+
why: Test file using child() with empty string at line 61
|
|
101
|
+
pattern: `const childLogger = this.logger.child('');`
|
|
102
|
+
gotcha: Empty string test expects parentLogId to be undefined in resulting log
|
|
103
|
+
|
|
104
|
+
- file: src/__tests__/adversarial/edge-case.test.ts
|
|
105
|
+
why: Test file using child() with parent ID at line 96
|
|
106
|
+
pattern: `const childLogger = this.logger.child('parent-id-123');`
|
|
107
|
+
gotcha: Test verifies child logger is created and parentLogId is set correctly
|
|
108
|
+
|
|
109
|
+
# REFERENCE - Partial<T> Usage Pattern in Codebase
|
|
110
|
+
- file: src/types/reflection.ts
|
|
111
|
+
why: Example of how Partial<T> is used elsewhere in the codebase
|
|
112
|
+
pattern: createReflectionConfig() with spread operator merging
|
|
113
|
+
section: Lines 110-117 show { ...defaults, ...partial } pattern
|
|
114
|
+
|
|
115
|
+
# REFERENCE - Testing Patterns
|
|
116
|
+
- file: src/__tests__/adversarial/deep-analysis.test.ts
|
|
117
|
+
why: Test patterns for union types and method overloads
|
|
118
|
+
pattern: Tests at lines 186-284 show @Task decorator testing multiple return types
|
|
119
|
+
|
|
120
|
+
# REFERENCE - Research Document
|
|
121
|
+
- docfile: plan/001_d3bb02af4886/research_typescript_partial_and_overloads.md
|
|
122
|
+
why: Comprehensive research on Partial<T>, overloads, and backward compatibility
|
|
123
|
+
section: Section 3 - Backward-Compatible Method Signature Evolution, Section 8 - Recommended Approach
|
|
124
|
+
|
|
125
|
+
# REFERENCE - Codebase Structure
|
|
126
|
+
- docfile: plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md
|
|
127
|
+
why: Architecture documentation showing logger location and observer patterns
|
|
128
|
+
section: Section 7 - Logger Architecture
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Current Codebase Tree
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
src/
|
|
135
|
+
├── core/
|
|
136
|
+
│ ├── logger.ts # TARGET FILE - child() at line 84
|
|
137
|
+
│ ├── workflow.ts # Creates root logger at line 111
|
|
138
|
+
│ └── index.ts # Public API exports
|
|
139
|
+
├── types/
|
|
140
|
+
│ ├── logging.ts # LogEntry, LogLevel definitions
|
|
141
|
+
│ ├── observer.ts # WorkflowObserver interface
|
|
142
|
+
│ └── index.ts # Type exports
|
|
143
|
+
├── utils/
|
|
144
|
+
│ └── id.ts # generateId() utility
|
|
145
|
+
└── __tests__/
|
|
146
|
+
└── adversarial/
|
|
147
|
+
├── deep-analysis.test.ts # Uses child('') at line 61
|
|
148
|
+
└── edge-case.test.ts # Uses child('parent-id-123') at line 96
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Desired Codebase Tree with Files to be Modified
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# MODIFY: src/core/logger.ts
|
|
155
|
+
# Responsibility: Update child() method signature with overloads
|
|
156
|
+
#
|
|
157
|
+
# Changes:
|
|
158
|
+
# Line 84-86: Replace current child() implementation with:
|
|
159
|
+
# - Overload 1: child(parentLogId: string): WorkflowLogger;
|
|
160
|
+
# - Overload 2: child(meta: Partial<LogEntry>): WorkflowLogger;
|
|
161
|
+
# - Implementation: child(input: string | Partial<LogEntry>): WorkflowLogger
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Known Gotchas & Library Quirks
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// CRITICAL: Function overloads must be ordered from most specific to most general
|
|
168
|
+
// Incorrect order will cause TypeScript to never match the specific overload
|
|
169
|
+
|
|
170
|
+
// CRITICAL: Implementation signature must be compatible with ALL overloads
|
|
171
|
+
// Implementation parameter type must be a union of all overload parameter types
|
|
172
|
+
|
|
173
|
+
// CRITICAL: Partial<LogEntry> makes ALL properties optional, including required ones
|
|
174
|
+
// Partial<LogEntry> allows: {}, { parentLogId: 'x' }, { id: 'x', parentLogId: 'y' }
|
|
175
|
+
|
|
176
|
+
// GOTCHA: typeof value === 'string' type guard is required for narrowing
|
|
177
|
+
// TypeScript cannot automatically narrow string | Partial<LogEntry>
|
|
178
|
+
|
|
179
|
+
// GOTCHA: Empty string '' in current test expects parentLogId to be undefined
|
|
180
|
+
// Test verifies: workflow.node.logs[0].parentLogId).toBeUndefined()
|
|
181
|
+
// Implementation should treat empty string as falsy (existing behavior)
|
|
182
|
+
|
|
183
|
+
// PATTERN: Codebase uses spread operator for merging Partial objects:
|
|
184
|
+
// { ...DEFAULT_CONFIG, ...partial } // From reflection.ts lines 110-117
|
|
185
|
+
|
|
186
|
+
// GOTCHA: The @Step decorator only uses logger.info(), not child()
|
|
187
|
+
// Logger interface in step.ts line 10-12 is minimal: { info(message, data?) }
|
|
188
|
+
|
|
189
|
+
// CRITICAL: Observer errors are caught with console.error (line 27 in logger.ts)
|
|
190
|
+
// This is P1.M3.T1 - separate bug fix, do not modify in this task
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Implementation Blueprint
|
|
196
|
+
|
|
197
|
+
### Data Models and Structure
|
|
198
|
+
|
|
199
|
+
The `LogEntry` interface is already defined and must remain unchanged:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// From src/types/logging.ts lines 9-24
|
|
203
|
+
export interface LogEntry {
|
|
204
|
+
id: string; // Unique identifier
|
|
205
|
+
workflowId: string; // Workflow that created log
|
|
206
|
+
timestamp: number; // Unix timestamp in ms
|
|
207
|
+
level: LogLevel; // 'debug' | 'info' | 'warn' | 'error'
|
|
208
|
+
message: string; // Log message
|
|
209
|
+
data?: unknown; // Optional structured data
|
|
210
|
+
parentLogId?: string; // Parent log ID for hierarchy
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
214
|
+
|
|
215
|
+
// Partial<LogEntry> makes ALL 7 properties optional:
|
|
216
|
+
type PartialLogEntry = Partial<LogEntry>;
|
|
217
|
+
// Equivalent to:
|
|
218
|
+
// {
|
|
219
|
+
// id?: string;
|
|
220
|
+
// workflowId?: string;
|
|
221
|
+
// timestamp?: number;
|
|
222
|
+
// level?: LogLevel;
|
|
223
|
+
// message?: string;
|
|
224
|
+
// data?: unknown;
|
|
225
|
+
// parentLogId?: string;
|
|
226
|
+
// }
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Implementation Tasks (ordered by dependencies)
|
|
230
|
+
|
|
231
|
+
```yaml
|
|
232
|
+
Task 1: READ current implementation and understand constructor
|
|
233
|
+
- EXAMINE: src/core/logger.ts lines 8-16 (constructor)
|
|
234
|
+
- EXAMINE: src/core/logger.ts lines 84-86 (current child() method)
|
|
235
|
+
- UNDERSTAND: Constructor accepts optional parentLogId parameter
|
|
236
|
+
- UNDERSTAND: child() passes parentLogId to constructor
|
|
237
|
+
- NO CHANGES: This is research/understanding only
|
|
238
|
+
|
|
239
|
+
Task 2: MODIFY src/core/logger.ts:84 - Add function overload signatures
|
|
240
|
+
- ADD: Overload signature for backward compatibility
|
|
241
|
+
child(parentLogId: string): WorkflowLogger;
|
|
242
|
+
- ADD: Overload signature for PRD compliance
|
|
243
|
+
child(meta: Partial<LogEntry>): WorkflowLogger;
|
|
244
|
+
- PLACEMENT: Immediately before the existing child() method (line 84)
|
|
245
|
+
- ORDER: String overload first (more specific), then object overload
|
|
246
|
+
|
|
247
|
+
Task 3: MODIFY src/core/logger.ts:86 - Update implementation signature
|
|
248
|
+
- CHANGE: From child(parentLogId: string): WorkflowLogger
|
|
249
|
+
- TO: child(input: string | Partial<LogEntry>): WorkflowLogger
|
|
250
|
+
- IMPLEMENT: Type guard to narrow input type
|
|
251
|
+
const parentLogId = typeof input === 'string' ? input : input.parentLogId;
|
|
252
|
+
- PRESERVE: Existing constructor call return new WorkflowLogger(...)
|
|
253
|
+
|
|
254
|
+
Task 4: VERIFY existing tests pass without modification
|
|
255
|
+
- RUN: npm test -- src/__tests__/adversarial/deep-analysis.test.ts
|
|
256
|
+
- RUN: npm test -- src/__tests__/adversarial/edge-case.test.ts
|
|
257
|
+
- VERIFY: Test at line 61 (empty string) passes
|
|
258
|
+
- VERIFY: Test at line 96 (normal parent ID) passes
|
|
259
|
+
- NO CHANGES: Test files should NOT require modification
|
|
260
|
+
|
|
261
|
+
Task 5: RUN TypeScript compilation check
|
|
262
|
+
- RUN: npx tsc --noEmit
|
|
263
|
+
- VERIFY: No type errors related to child() method
|
|
264
|
+
- VERIFY: Overload signatures are correctly ordered
|
|
265
|
+
- VERIFY: Implementation signature is compatible with all overloads
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Implementation Patterns & Key Details
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// PATTERN: Function overload structure from TypeScript documentation
|
|
272
|
+
// MUST be in this order: specific overloads first, general implementation last
|
|
273
|
+
|
|
274
|
+
// ============================================
|
|
275
|
+
// OVERLOAD SIGNATURES (declaration only, no body)
|
|
276
|
+
// ============================================
|
|
277
|
+
|
|
278
|
+
// Overload 1: Backward compatible with existing string parameter
|
|
279
|
+
child(parentLogId: string): WorkflowLogger;
|
|
280
|
+
|
|
281
|
+
// Overload 2: New PRD-compliant signature with Partial<LogEntry>
|
|
282
|
+
child(meta: Partial<LogEntry>): WorkflowLogger;
|
|
283
|
+
|
|
284
|
+
// ============================================
|
|
285
|
+
// IMPLEMENTATION (must accept all overload types)
|
|
286
|
+
// ============================================
|
|
287
|
+
|
|
288
|
+
child(input: string | Partial<LogEntry>): WorkflowLogger {
|
|
289
|
+
// PATTERN: Type guard for narrowing union type
|
|
290
|
+
const parentLogId = typeof input === 'string'
|
|
291
|
+
? input
|
|
292
|
+
: input.parentLogId;
|
|
293
|
+
|
|
294
|
+
// PRESERVE: Existing constructor call pattern
|
|
295
|
+
return new WorkflowLogger(this.node, this.observers, parentLogId);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ============================================
|
|
299
|
+
// USAGE EXAMPLES (both work after implementation)
|
|
300
|
+
// ============================================
|
|
301
|
+
|
|
302
|
+
// Legacy string usage (existing test files)
|
|
303
|
+
const child1 = logger.child('parent-id-123');
|
|
304
|
+
const child2 = logger.child(''); // Empty string - parentLogId will be undefined
|
|
305
|
+
|
|
306
|
+
// New object usage (PRD compliant)
|
|
307
|
+
const child3 = logger.child({ parentLogId: 'parent-id-456' });
|
|
308
|
+
const child4 = logger.child({}); // No parentLogId
|
|
309
|
+
const child5 = logger.child({
|
|
310
|
+
parentLogId: 'parent-id-789',
|
|
311
|
+
data: { userId: 'user-123', requestId: 'req-456' }
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
// GOTCHA: Additional fields in Partial<LogEntry> are accepted but not used
|
|
315
|
+
// The PRD skeleton shows meta is accepted but NOT USED in implementation
|
|
316
|
+
// Future enhancement could store and use additional metadata fields
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Integration Points
|
|
320
|
+
|
|
321
|
+
```yaml
|
|
322
|
+
NO NEW FILES: This task modifies only src/core/logger.ts
|
|
323
|
+
|
|
324
|
+
NO CONFIG CHANGES: No configuration files modified
|
|
325
|
+
|
|
326
|
+
NO ROUTE CHANGES: No routing or API changes
|
|
327
|
+
|
|
328
|
+
DEPENDENCIES:
|
|
329
|
+
- type: Type definition import
|
|
330
|
+
- from: src/types/logging.ts
|
|
331
|
+
- import: LogEntry type
|
|
332
|
+
- existing: true
|
|
333
|
+
|
|
334
|
+
AFFECTED FILES:
|
|
335
|
+
- modify: src/core/logger.ts (lines 84-86)
|
|
336
|
+
- no_changes: src/__tests__/adversarial/deep-analysis.test.ts
|
|
337
|
+
- no_changes: src/__tests__/adversarial/edge-case.test.ts
|
|
338
|
+
- no_changes: src/types/logging.ts
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Validation Loop
|
|
344
|
+
|
|
345
|
+
### Level 1: Syntax & Style (Immediate Feedback)
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Run after modification - fix before proceeding
|
|
349
|
+
npm run build # Verify TypeScript compilation succeeds
|
|
350
|
+
npx tsc --noEmit # Type checking with no output
|
|
351
|
+
npm run lint # Run ESLint if configured
|
|
352
|
+
|
|
353
|
+
# Expected: Zero errors. If errors exist, READ output and fix before proceeding.
|
|
354
|
+
|
|
355
|
+
# Common TypeScript errors and fixes:
|
|
356
|
+
# Error: "Overload signatures must all be optional or all necessary"
|
|
357
|
+
# Fix: Ensure all overload signatures have no default values (implementation can have default)
|
|
358
|
+
|
|
359
|
+
# Error: "This overload signature is not compatible with its implementation signature"
|
|
360
|
+
# Fix: Ensure implementation signature accepts all overload parameter types (union type)
|
|
361
|
+
|
|
362
|
+
# Error: "Function implementation name must be 'child'"
|
|
363
|
+
# Fix: Ensure implementation function name matches overload signatures
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Level 2: Unit Tests (Component Validation)
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
# Test each affected test file
|
|
370
|
+
npm test -- src/__tests__/adversarial/deep-analysis.test.ts
|
|
371
|
+
npm test -- src/__tests__/adversarial/edge-case.test.ts
|
|
372
|
+
|
|
373
|
+
# Test broader logging functionality
|
|
374
|
+
npm test -- --grep "WorkflowLogger"
|
|
375
|
+
npm test -- --grep "logger"
|
|
376
|
+
|
|
377
|
+
# Full test suite for affected area
|
|
378
|
+
npm test
|
|
379
|
+
|
|
380
|
+
# Expected: All tests pass. If failing, debug root cause and fix implementation.
|
|
381
|
+
|
|
382
|
+
# Specific test verification:
|
|
383
|
+
# 1. deep-analysis.test.ts:61 - "should handle logger.child() with empty parentLogId"
|
|
384
|
+
# Expects: workflow.node.logs[0].parentLogId).toBeUndefined()
|
|
385
|
+
#
|
|
386
|
+
# 2. edge-case.test.ts:96 - Normal parentLogId test
|
|
387
|
+
# Expects: childLogger is defined and parentLogId is set correctly
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### Level 3: Integration Testing (System Validation)
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
# Test that logger still works in full workflow context
|
|
394
|
+
npm test -- src/__tests__/integration/
|
|
395
|
+
|
|
396
|
+
# Test workflow creation with root logger
|
|
397
|
+
npm test -- src/__tests__/unit/workflow.test.ts
|
|
398
|
+
|
|
399
|
+
# Verify logger integration with observers
|
|
400
|
+
npm test -- --grep "observer"
|
|
401
|
+
|
|
402
|
+
# Expected: All integrations working, proper log entries created, parentLogId correctly set
|
|
403
|
+
|
|
404
|
+
# Manual verification (if needed):
|
|
405
|
+
# 1. Create a workflow
|
|
406
|
+
# 2. Get root logger
|
|
407
|
+
# 3. Create child logger with string: logger.child('test-parent')
|
|
408
|
+
# 4. Create child logger with object: logger.child({ parentLogId: 'test-parent-2' })
|
|
409
|
+
# 5. Log messages with both child loggers
|
|
410
|
+
# 6. Verify workflow.node.logs has correct parentLogId values
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Level 4: Type Safety Validation
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
# TypeScript type checking
|
|
417
|
+
npx tsc --noEmit --strict
|
|
418
|
+
|
|
419
|
+
# Verify overload type inference works correctly
|
|
420
|
+
# Create temporary test file to verify type behavior:
|
|
421
|
+
cat > type-check-test.ts << 'EOF'
|
|
422
|
+
import { WorkflowLogger } from './src/core/logger.js';
|
|
423
|
+
import type { LogEntry } from './src/types/logging.js';
|
|
424
|
+
|
|
425
|
+
declare const logger: WorkflowLogger;
|
|
426
|
+
|
|
427
|
+
// These should all type-check correctly
|
|
428
|
+
const child1 = logger.child('string-parent'); // string overload
|
|
429
|
+
const child2 = logger.child({ parentLogId: 'obj' }); // Partial<LogEntry> overload
|
|
430
|
+
const child3 = logger.child({}); // Empty Partial<LogEntry>
|
|
431
|
+
|
|
432
|
+
// This should cause type error
|
|
433
|
+
// const child4 = logger.child(123); // ERROR: number not assignable
|
|
434
|
+
// const child5 = logger.child(true); // ERROR: boolean not assignable
|
|
435
|
+
|
|
436
|
+
console.log('Type check passed');
|
|
437
|
+
EOF
|
|
438
|
+
|
|
439
|
+
npx tsc --noEmit type-check-test.ts
|
|
440
|
+
rm type-check-test.ts
|
|
441
|
+
|
|
442
|
+
# Expected: No type errors for valid usage, type errors for invalid usage
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## Final Validation Checklist
|
|
448
|
+
|
|
449
|
+
### Technical Validation
|
|
450
|
+
|
|
451
|
+
- [ ] All 4 validation levels completed successfully
|
|
452
|
+
- [ ] All tests pass: `npm test`
|
|
453
|
+
- [ ] No TypeScript errors: `npx tsc --noEmit`
|
|
454
|
+
- [ ] Build succeeds: `npm run build`
|
|
455
|
+
- [ ] No linting errors: `npm run lint` (if configured)
|
|
456
|
+
|
|
457
|
+
### Feature Validation
|
|
458
|
+
|
|
459
|
+
- [ ] Function overload signatures added before implementation
|
|
460
|
+
- [ ] Overload order is correct (specific to general)
|
|
461
|
+
- [ ] Implementation signature accepts `string | Partial<LogEntry>`
|
|
462
|
+
- [ ] Type guard correctly narrows input type
|
|
463
|
+
- [ ] Existing tests pass without modification
|
|
464
|
+
- [ ] Test at deep-analysis.test.ts:61 passes (empty string)
|
|
465
|
+
- [ ] Test at edge-case.test.ts:96 passes (normal parent ID)
|
|
466
|
+
|
|
467
|
+
### Code Quality Validation
|
|
468
|
+
|
|
469
|
+
- [ ] Follows existing codebase patterns (constructor call preserved)
|
|
470
|
+
- [ ] File placement unchanged (src/core/logger.ts)
|
|
471
|
+
- [ ] No new files created
|
|
472
|
+
- [ ] No unnecessary complexity added
|
|
473
|
+
- [ ] Backward compatibility maintained (string calls still work)
|
|
474
|
+
|
|
475
|
+
### Documentation & Deployment
|
|
476
|
+
|
|
477
|
+
- [ ] JSDoc comment updated if present
|
|
478
|
+
- [ ] No environment changes required
|
|
479
|
+
- [ ] No configuration changes required
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Anti-Patterns to Avoid
|
|
484
|
+
|
|
485
|
+
- ❌ Don't modify existing test files - they should pass unchanged
|
|
486
|
+
- ❌ Don't change the constructor or other methods in WorkflowLogger
|
|
487
|
+
- ❌ Don't use `any` type - use proper union type `string | Partial<LogEntry>`
|
|
488
|
+
- ❌ Don't forget type guard - use `typeof input === 'string'` for narrowing
|
|
489
|
+
- ❌ Don't reverse overload order - specific signatures must come first
|
|
490
|
+
- ❌ Don't make implementation parameter type narrower than overload union
|
|
491
|
+
- ❌ Don't add default values to overload signatures (only implementation can have defaults)
|
|
492
|
+
- ❌ Don't modify observer error handling (separate bug P1.M3.T1)
|
|
493
|
+
- ❌ Don't add new functionality beyond accepting Partial<LogEntry>
|
|
494
|
+
- ❌ Don't break the dual tree architecture (workflow/node trees)
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## Appendix: Quick Reference
|
|
499
|
+
|
|
500
|
+
### Key File Locations
|
|
501
|
+
|
|
502
|
+
| File | Lines | Purpose |
|
|
503
|
+
|------|-------|---------|
|
|
504
|
+
| src/core/logger.ts | 84-86 | child() method implementation target |
|
|
505
|
+
| src/types/logging.ts | 9-24 | LogEntry interface definition |
|
|
506
|
+
| src/__tests__/adversarial/deep-analysis.test.ts | 61 | Empty string test site |
|
|
507
|
+
| src/__tests__/adversarial/edge-case.test.ts | 96 | Normal parent ID test site |
|
|
508
|
+
| plan/.../logger_child_signature_analysis.md | All | Complete signature analysis |
|
|
509
|
+
|
|
510
|
+
### Signature Comparison
|
|
511
|
+
|
|
512
|
+
```typescript
|
|
513
|
+
// BEFORE (current implementation)
|
|
514
|
+
child(parentLogId: string): WorkflowLogger {
|
|
515
|
+
return new WorkflowLogger(this.node, this.observers, parentLogId);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// AFTER (with backward compatible overloads)
|
|
519
|
+
child(parentLogId: string): WorkflowLogger; // Overload 1
|
|
520
|
+
child(meta: Partial<LogEntry>): WorkflowLogger; // Overload 2
|
|
521
|
+
child(input: string | Partial<LogEntry>): WorkflowLogger { // Implementation
|
|
522
|
+
const parentLogId = typeof input === 'string' ? input : input.parentLogId;
|
|
523
|
+
return new WorkflowLogger(this.node, this.observers, parentLogId);
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### Existing Usage Patterns (Must Preserve)
|
|
528
|
+
|
|
529
|
+
```typescript
|
|
530
|
+
// Pattern 1: Empty string (deep-analysis.test.ts:61)
|
|
531
|
+
this.logger.child('');
|
|
532
|
+
// After change: Works via string overload, parentLogId = '' → falsy → undefined
|
|
533
|
+
|
|
534
|
+
// Pattern 2: Parent ID string (edge-case.test.ts:96)
|
|
535
|
+
this.logger.child('parent-id-123');
|
|
536
|
+
// After change: Works via string overload, parentLogId = 'parent-id-123'
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### New Usage Patterns (Enabled by This Change)
|
|
540
|
+
|
|
541
|
+
```typescript
|
|
542
|
+
// New Pattern 1: Object with parentLogId
|
|
543
|
+
this.logger.child({ parentLogId: 'parent-id-456' });
|
|
544
|
+
|
|
545
|
+
// New Pattern 2: Object with additional metadata (future extensibility)
|
|
546
|
+
this.logger.child({
|
|
547
|
+
parentLogId: 'parent-id-789',
|
|
548
|
+
data: { userId: 'user-123', action: 'process' }
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
// New Pattern 3: Empty object (no parentLogId)
|
|
552
|
+
this.logger.child({});
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
### Confidence Score
|
|
556
|
+
|
|
557
|
+
**8/10** for one-pass implementation success likelihood
|
|
558
|
+
|
|
559
|
+
**Rationale**:
|
|
560
|
+
- Clear implementation target (single method, 3 lines)
|
|
561
|
+
- Comprehensive research and context provided
|
|
562
|
+
- Backward compatibility approach minimizes risk
|
|
563
|
+
- Only 2 test files to validate
|
|
564
|
+
- Well-documented TypeScript patterns to follow
|
|
565
|
+
|
|
566
|
+
**Risk Factors**:
|
|
567
|
+
- Function overload syntax can be tricky (order matters)
|
|
568
|
+
- Type guard implementation must be correct
|
|
569
|
+
- TypeScript compiler strictness may reveal edge cases
|
|
570
|
+
|
|
571
|
+
**Mitigation**:
|
|
572
|
+
- Follow TypeScript documentation exactly
|
|
573
|
+
- Use proven patterns from research document
|
|
574
|
+
- Validate with TypeScript compiler before testing
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
**PRP Version**: 1.0
|
|
579
|
+
**Created**: 2026-01-12
|
|
580
|
+
**For**: P1.M1.T1.S2 - Update WorkflowLogger.child() to accept Partial<LogEntry>
|
|
581
|
+
**Next Task**: P1.M1.T1.S3 - Add tests for new child() signature with Partial<LogEntry>
|