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.
Files changed (242) hide show
  1. package/.claude/commands/subtask-planning/prp-base-create.md +120 -0
  2. package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
  3. package/.claude/commands/task-breakdown.md +94 -0
  4. package/.claude/system_prompts/task-breakdown.md +1 -0
  5. package/CHANGELOG.md +188 -0
  6. package/PRD.md +543 -0
  7. package/README.md +99 -5
  8. package/examples/README.md +15 -1
  9. package/examples/examples/11-reparenting-workflows.ts +269 -0
  10. package/examples/index.ts +4 -0
  11. package/package-lock.json +2398 -0
  12. package/package.json +3 -1
  13. package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
  14. package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
  15. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
  16. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
  17. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
  18. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
  19. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
  20. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
  21. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
  22. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
  23. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
  24. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
  25. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
  26. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
  27. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
  28. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
  29. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
  30. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
  31. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
  32. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
  33. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
  34. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
  35. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
  36. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
  37. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
  38. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
  39. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
  40. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
  41. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
  42. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
  43. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
  44. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
  45. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
  46. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
  47. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
  48. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
  49. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
  50. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
  51. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
  52. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
  53. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
  54. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
  55. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
  56. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
  57. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
  58. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
  59. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
  60. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
  61. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
  62. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
  63. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
  64. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
  65. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
  66. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
  67. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
  68. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
  69. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
  70. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
  71. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
  72. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
  73. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
  74. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
  75. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
  76. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
  77. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
  78. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
  79. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
  80. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
  81. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
  82. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
  83. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
  84. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
  85. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
  86. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
  87. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
  88. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
  89. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
  90. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
  91. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
  92. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
  93. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
  94. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
  95. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
  96. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
  97. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
  98. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
  99. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
  100. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
  101. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
  102. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
  103. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
  104. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
  105. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
  106. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
  107. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
  108. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
  109. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
  110. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
  111. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
  112. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
  113. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
  114. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
  115. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
  116. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
  117. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
  118. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
  119. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
  120. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
  121. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
  122. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
  123. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
  124. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
  125. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
  126. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
  127. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
  128. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
  129. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
  130. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
  131. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
  132. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
  133. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
  134. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
  135. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
  136. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
  137. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
  138. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
  139. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
  140. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
  141. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
  142. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
  143. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
  144. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
  145. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
  146. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
  147. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
  148. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
  149. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
  150. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
  151. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
  152. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
  153. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
  154. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
  155. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
  156. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
  157. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
  158. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
  159. package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
  160. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
  161. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
  162. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
  163. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
  164. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
  165. package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
  166. package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
  167. package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
  168. package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
  169. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
  170. package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
  171. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
  172. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
  173. package/src/__tests__/adversarial/edge-case.test.ts +703 -0
  174. package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
  175. package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
  176. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
  177. package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
  178. package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
  179. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
  180. package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
  181. package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
  182. package/src/__tests__/helpers/index.ts +18 -0
  183. package/src/__tests__/helpers/tree-verification.ts +257 -0
  184. package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
  185. package/src/__tests__/integration/observer-logging.test.ts +643 -0
  186. package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
  187. package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
  188. package/src/__tests__/unit/context.test.ts +79 -0
  189. package/src/__tests__/unit/logger.test.ts +293 -0
  190. package/src/__tests__/unit/observable.test.ts +321 -0
  191. package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
  192. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
  193. package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
  194. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
  195. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
  196. package/src/__tests__/unit/workflow.test.ts +277 -1
  197. package/src/core/agent.ts +21 -1
  198. package/src/core/logger.ts +27 -2
  199. package/src/core/workflow-context.ts +6 -4
  200. package/src/core/workflow.ts +252 -14
  201. package/src/debugger/tree-debugger.ts +52 -7
  202. package/src/decorators/task.ts +65 -2
  203. package/src/index.ts +4 -2
  204. package/src/types/decorators.ts +8 -1
  205. package/src/types/events.ts +1 -0
  206. package/src/utils/index.ts +1 -0
  207. package/src/utils/observable.ts +32 -3
  208. package/src/utils/workflow-error-utils.ts +56 -0
  209. package/tsconfig.json +1 -1
  210. package/llms_full.txt +0 -5890
  211. package/tasks.json +0 -0
  212. /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
  213. /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
  214. /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
  215. /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
  216. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
  217. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
  218. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
  219. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
  220. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
  221. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
  222. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
  223. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
  224. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
  225. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
  226. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
  227. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
  228. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
  229. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
  230. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
  231. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
  232. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
  233. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
  234. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
  235. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
  236. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
  237. /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
  238. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
  239. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
  240. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
  241. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
  242. /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
@@ -0,0 +1,460 @@
1
+ name: "P1.M3.T3.S2 - Implement Workflow Name Validation in Constructor"
2
+ description: |
3
+
4
+ ---
5
+
6
+ ## Goal
7
+
8
+ **Feature Goal**: Add validation to the Workflow constructor to reject empty and whitespace-only workflow names while preserving existing behavior for undefined/null names.
9
+
10
+ **Deliverable**: Updated `src/core/workflow.ts` constructor with name validation logic that throws descriptive errors for invalid names.
11
+
12
+ **Success Definition**:
13
+ - Workflow constructor throws `Error` when name is empty string or whitespace-only
14
+ - Workflow constructor throws `Error` when name exceeds 100 characters
15
+ - Workflow constructor preserves existing fallback behavior when name is `undefined` or `null` (uses class name)
16
+ - TypeScript compiles without errors
17
+ - All tests pass including updated edge-case test
18
+
19
+ ## User Persona (if applicable)
20
+
21
+ **Target User**: Developer using the Groundswell workflow engine
22
+
23
+ **Use Case**: Creating Workflow instances with custom or default names for identification in tree debugger and logging
24
+
25
+ **User Journey**:
26
+ 1. Developer creates a `new Workflow('MyWorkflowName')` or extends Workflow class
27
+ 2. If the name is invalid (empty/whitespace), they receive immediate, clear error feedback
28
+ 3. If the name is valid or omitted, the workflow is created successfully
29
+
30
+ **Pain Points Addressed**:
31
+ - Empty workflow names appear as blank entries in tree debugger, causing confusion
32
+ - No validation feedback when developers accidentally use empty strings
33
+ - Inconsistent with industry best practices (all major workflow engines validate names)
34
+
35
+ ## Why
36
+
37
+ - **User Experience**: Empty workflow names provide no useful information and create confusion in the tree debugger
38
+ - **Bug Fix**: Issue 8 explicitly frames empty names as a bug ("should probably be non-empty")
39
+ - **Industry Alignment**: All major workflow engines (Kubernetes, Airflow, AWS Step Functions) require non-empty names
40
+ - **Consistency**: Codebase already validates other critical inputs (circular references, duplicate registrations)
41
+ - **PRD Compliance**: PRD specifies name as "Human-readable name" - empty string is not human-readable
42
+
43
+ ## What
44
+
45
+ Add validation logic to the Workflow constructor that:
46
+ 1. Rejects empty strings (`''`)
47
+ 2. Rejects whitespace-only strings (`' '`, `'\t\n'`)
48
+ 3. Rejects names exceeding 100 characters
49
+ 4. Preserves existing fallback behavior for `undefined`/`null` (uses class name)
50
+ 5. Does NOT auto-trim leading/trailing whitespace (preserves user intent)
51
+
52
+ ### Success Criteria
53
+
54
+ - [ ] Empty string names throw `Error` with message: "Workflow name cannot be empty or whitespace only"
55
+ - [ ] Whitespace-only names throw `Error` with message: "Workflow name cannot be empty or whitespace only"
56
+ - [ ] Names exceeding 100 characters throw `Error` with message: "Workflow name cannot exceed 100 characters"
57
+ - [ ] `undefined`/`null` names still use class name (existing behavior preserved)
58
+ - [ ] Valid names with leading/trailing whitespace are accepted as-is
59
+ - [ ] Both constructor patterns (class-based and functional) are validated
60
+
61
+ ## All Needed Context
62
+
63
+ ### Context Completeness Check
64
+
65
+ _Before writing this PRP, validate: "If someone knew nothing about this codebase, would they have everything needed to implement this successfully?"_
66
+
67
+ ✅ **YES** - This PRP includes:
68
+ - Exact file path and line numbers for the modification
69
+ - Complete validation rules from S1 decision document
70
+ - Existing constructor code patterns to follow
71
+ - Error handling patterns used throughout codebase
72
+ - Test file that needs updating with specific line numbers
73
+ - Both constructor patterns that must be validated
74
+ - TypeScript compilation validation steps
75
+
76
+ ### Documentation & References
77
+
78
+ ```yaml
79
+ # MUST READ - Include these in your context window
80
+ - url: file:///home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md
81
+ why: Contains complete validation rules decided in S1 (5 rules with examples)
82
+ critical: Implementation location specified as line ~98, after config normalization, before node creation
83
+
84
+ - file: src/core/workflow.ts
85
+ why: Contains the Workflow class constructor that needs modification
86
+ pattern: Constructor uses overloaded parameters (class-based: name, parent | functional: config, executor)
87
+ gotcha: Validation MUST apply to both constructor patterns - name comes from different sources
88
+
89
+ - file: src/core/workflow.ts:94
90
+ why: Line where `this.config = { name: name ?? this.constructor.name }` is set (class-based pattern)
91
+ pattern: Nullish coalescing preserves undefined fallback - must NOT break this
92
+
93
+ - file: src/core/workflow.ts:98-117
94
+ why: Constructor body - validation must be added AFTER line 94 (config set), BEFORE line 101 (node created)
95
+ pattern: Existing validation patterns in codebase use standard `Error` with descriptive messages
96
+
97
+ - file: src/__tests__/adversarial/edge-case.test.ts:107-117
98
+ why: This test currently EXPECTS empty names to work - must be updated to expect error thrown
99
+ pattern: Uses `expect(workflow.node.name).toBe('')` - needs `expect(() => new TestWorkflow('')).toThrow()`
100
+
101
+ - file: src/__tests__/unit/workflow.test.ts
102
+ why: Contains existing constructor test patterns to follow for new validation tests
103
+ pattern: Uses SimpleWorkflow class, `expect().toThrow()` for error testing
104
+
105
+ - docfile: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md
106
+ why: Complete validation rules with examples and anti-patterns to avoid
107
+ section: Rules 1-5 specify exact validation behavior required
108
+ ```
109
+
110
+ ### Current Codebase tree (run `tree` in the root of the project) to get an overview of the codebase
111
+
112
+ ```bash
113
+ /home/dustin/projects/groundswell
114
+ ├── src/
115
+ │ ├── core/
116
+ │ │ ├── workflow.ts # MODIFICATION TARGET (constructor at lines 83-117)
117
+ │ │ ├── agent.ts
118
+ │ │ ├── context.ts
119
+ │ │ └── ...
120
+ │ ├── types/
121
+ │ │ ├── workflow.ts # WorkflowConfig interface (name?: string)
122
+ │ │ └── ...
123
+ │ └── __tests__/
124
+ │ ├── adversarial/
125
+ │ │ └── edge-case.test.ts # UPDATE REQUIRED (line 107-117)
126
+ │ └── unit/
127
+ │ └── workflow.test.ts # REFERENCE for test patterns
128
+ ```
129
+
130
+ ### Desired Codebase tree with files to be added and responsibility of file
131
+
132
+ ```bash
133
+ # No new files to be added
134
+ # Modifications only:
135
+ ├── src/
136
+ │ ├── core/
137
+ │ │ └── workflow.ts # MODIFY: Add validation to constructor (~line 98-100)
138
+ └── __tests__/
139
+ ├── adversarial/
140
+ │ └── edge-case.test.ts # MODIFY: Update test at lines 107-117 to expect error
141
+ └── unit/
142
+ └── workflow.test.ts # MODIFY: Add new validation test suite
143
+ ```
144
+
145
+ ### Known Gotchas of our codebase & Library Quirks
146
+
147
+ ```typescript
148
+ // CRITICAL: The Workflow constructor has TWO patterns - validation must work for both
149
+ // Pattern 1: Class-based - new Workflow(name?, parent?)
150
+ // Pattern 2: Functional - new Workflow(config, executor)
151
+ // The name parameter comes from different sources in each pattern!
152
+
153
+ // Pattern 1 (lines 88-94):
154
+ // this.config = { name: name ?? this.constructor.name };
155
+ // If name is string, use it. If undefined/null, use class name.
156
+
157
+ // Pattern 2 (lines 96-101):
158
+ // if (typeof name === 'object') { this.config = name; } else { ... }
159
+ // name is actually a WorkflowConfig object with name property
160
+
161
+ // GOTCHA: The parameter named "name" in the constructor signature
162
+ // can be either: string | WorkflowConfig | undefined
163
+ // After config normalization, always check: this.config.name
164
+
165
+ // VALIDATION LOCATION: After line 94, this.config.name is always defined
166
+ // Check if it's a string and validate. If undefined, class name was used (valid).
167
+
168
+ // GOTCHA: Don't use custom error classes - codebase uses standard Error throughout
169
+ // Examples from codebase:
170
+ // throw new Error('Circular parent-child relationship detected');
171
+ // throw new Error('Child already attached to this workflow');
172
+
173
+ // GOTCHA: The test at edge-case.test.ts:107-117 expects empty names to work
174
+ // This test MUST be updated or it will fail after implementation
175
+
176
+ // GOTCHA: TypeScript compilation is a validation gate - code must compile without errors
177
+ // Run: npx tsc --noEmit
178
+ ```
179
+
180
+ ## Implementation Blueprint
181
+
182
+ ### Data models and structure
183
+
184
+ No new data models needed. This is a pure validation enhancement to existing constructor.
185
+
186
+ ```typescript
187
+ // Existing models (no changes needed):
188
+ // - WorkflowConfig interface: { name?: string; ... }
189
+ // - Workflow class extends WorkflowNodeBase
190
+ ```
191
+
192
+ ### Implementation Tasks (ordered by dependencies)
193
+
194
+ ```yaml
195
+ Task 1: MODIFY src/core/workflow.ts constructor
196
+ - LOCATION: After line 94 (this.config assignment), before line 98 (conditional logic)
197
+ - IMPLEMENT: Name validation using this.config.name
198
+ - VALIDATION RULE 1 (Empty/Whitespace): if (typeof this.config.name === 'string' && this.config.name.trim().length === 0) throw new Error('Workflow name cannot be empty or whitespace only')
199
+ - VALIDATION RULE 2 (Max Length): if (typeof this.config.name === 'string' && this.config.name.length > 100) throw new Error('Workflow name cannot exceed 100 characters')
200
+ - PRESERVE: undefined/null fallback to class name (don't validate if this.config.name is undefined)
201
+ - PATTERN: Follow existing error throwing pattern in codebase (standard Error, descriptive message)
202
+ - GOTCHA: Only validate when this.config.name is explicitly a string - undefined means class name was used (valid)
203
+
204
+ Task 2: UPDATE src/__tests__/adversarial/edge-case.test.ts
205
+ - LOCATION: Lines 107-117 (test "should handle empty string workflow name")
206
+ - CHANGE: Modify test to expect error to be thrown
207
+ - PATTERN: expect(() => new TestWorkflow('')).toThrow('Workflow name cannot be empty or whitespace only')
208
+ - PRESERVE: Test structure and description, only change expectation
209
+
210
+ Task 3: CREATE new test suite in src/__tests__/unit/workflow.test.ts
211
+ - LOCATION: Add new describe block: 'Workflow Name Validation'
212
+ - IMPLEMENT: Comprehensive tests for all validation rules
213
+ - TEST CASES:
214
+ - Empty string should throw
215
+ - Whitespace-only (spaces) should throw
216
+ - Whitespace-only (tabs/newlines) should throw
217
+ - Name exceeding 100 characters should throw
218
+ - Exactly 100 characters should work
219
+ - Valid names should work
220
+ - Undefined should use class name (existing behavior)
221
+ - Null should use class name (existing behavior)
222
+ - Name with leading/trailing whitespace should be accepted as-is
223
+ - Both constructor patterns should be validated
224
+ - PATTERN: Follow existing test patterns in workflow.test.ts (SimpleWorkflow class, expect().toThrow())
225
+
226
+ Task 4: VERIFY TypeScript compilation
227
+ - RUN: npx tsc --noEmit
228
+ - EXPECT: Zero type errors
229
+ - FIX: Any type errors that arise from validation logic
230
+
231
+ Task 5: RUN full test suite
232
+ - RUN: npm test
233
+ - EXPECT: All tests pass
234
+ - FIX: Any failing tests (should only be the updated edge-case test now passing)
235
+ ```
236
+
237
+ ### Implementation Patterns & Key Details
238
+
239
+ ```typescript
240
+ // EXACT CODE TO INSERT at src/core/workflow.ts after line 94:
241
+
242
+ // Location: src/core/workflow.ts:94 (after this.config = { name: name ?? this.constructor.name })
243
+ // PATTERN: Only validate when name is explicitly provided as a string
244
+ // CRITICAL: undefined means class name was used - this is valid behavior
245
+
246
+ // Validate workflow name (after config is normalized)
247
+ if (typeof this.config.name === 'string') {
248
+ const trimmedName = this.config.name.trim();
249
+ if (trimmedName.length === 0) {
250
+ throw new Error('Workflow name cannot be empty or whitespace only');
251
+ }
252
+ if (this.config.name.length > 100) {
253
+ throw new Error('Workflow name cannot exceed 100 characters');
254
+ }
255
+ }
256
+
257
+ // GOTCHA: We check this.config.name.length (not trimmed) for max length
258
+ // This matches the decision document Rule 2 exactly
259
+
260
+ // GOTCHA: We check trimmedName.length === 0 for whitespace-only detection
261
+ // This matches the decision document Rule 1 exactly
262
+
263
+ // GOTCHA: We DON'T auto-trim - we only reject if entirely whitespace
264
+ // This matches the decision document Rule 4 exactly
265
+
266
+ // Existing constructor structure for reference (lines 83-101):
267
+ constructor(name?: string | WorkflowConfig, parentOrExecutor?: Workflow | WorkflowExecutor<T>) {
268
+ this.id = generateId();
269
+ this.status = 'idle';
270
+ this.observers = [];
271
+ this.children = [];
272
+ this.parent = null;
273
+
274
+ // Class-based pattern: new Workflow(name?, parent?)
275
+ if (typeof name !== 'object' || name === null) {
276
+ this.config = { name: name ?? this.constructor.name };
277
+ this.parent = parentOrExecutor as Workflow | null;
278
+ }
279
+ // Functional pattern: new Workflow(config, executor)
280
+ else {
281
+ this.config = name;
282
+ this.executor = parentOrExecutor as WorkflowExecutor<T>;
283
+ }
284
+
285
+ // *** INSERT VALIDATION HERE *** (after line 94, before line 98)
286
+ // After this point, this.config.name is set for both patterns
287
+
288
+ this.node = new WorkflowNode({
289
+ id: this.id,
290
+ name: this.config.name ?? this.constructor.name,
291
+ // ... rest of node creation
292
+ });
293
+ }
294
+ ```
295
+
296
+ ### Integration Points
297
+
298
+ ```yaml
299
+ VALIDATION:
300
+ - location: "src/core/workflow.ts constructor"
301
+ - line: "~94-97 (after config assignment, before node creation)"
302
+ - pattern: "Standard Error throwing with descriptive messages"
303
+
304
+ TESTS:
305
+ - update: "src/__tests__/adversarial/edge-case.test.ts:107-117"
306
+ - add: "src/__tests__/unit/workflow.test.ts (new describe block)"
307
+ - pattern: "expect(() => new Workflow('')).toThrow()"
308
+
309
+ COMPATIBILITY:
310
+ - breaking: "Yes - empty names will now throw errors"
311
+ - rationale: "Empty names provide no value and are bugs (Issue 8)"
312
+ - migration: "Provide meaningful names instead of empty strings"
313
+ ```
314
+
315
+ ## Validation Loop
316
+
317
+ ### Level 1: Syntax & Style (Immediate Feedback)
318
+
319
+ ```bash
320
+ # Run after file modification - fix before proceeding
321
+ npx tsc --noEmit # TypeScript type checking
322
+ npm run lint # ESLint checking (if configured)
323
+ npm run format # Prettier formatting (if configured)
324
+
325
+ # Expected: Zero errors. If errors exist, READ output and fix before proceeding.
326
+ ```
327
+
328
+ ### Level 2: Unit Tests (Component Validation)
329
+
330
+ ```bash
331
+ # Test the specific validation functionality
332
+ npm test -- workflow.test.ts # Run workflow unit tests
333
+ npm test -- edge-case.test.ts # Run adversarial edge case tests
334
+
335
+ # Full test suite for affected areas
336
+ npm test # Run all tests
337
+
338
+ # Expected: All tests pass. The edge-case test should now pass with the updated expectation.
339
+ ```
340
+
341
+ ### Level 3: Integration Testing (System Validation)
342
+
343
+ ```bash
344
+ # Verify workflow creation still works for valid names
345
+ node -e "
346
+ const { Workflow } = require('./dist/index.js');
347
+ class TestWF extends Workflow { async run() { return 'done'; } }
348
+
349
+ // Valid names should work
350
+ const wf1 = new TestWF('ValidName');
351
+ console.log('Valid name:', wf1.node.name);
352
+
353
+ // Undefined should use class name
354
+ const wf2 = new TestWF();
355
+ console.log('Undefined uses class name:', wf2.node.name);
356
+
357
+ // Empty should throw
358
+ try {
359
+ new TestWF('');
360
+ console.log('ERROR: Empty name should have thrown!');
361
+ } catch (e) {
362
+ console.log('Empty name correctly throws:', e.message);
363
+ }
364
+ "
365
+
366
+ # Expected: Valid names work, empty names throw with correct error message
367
+ ```
368
+
369
+ ### Level 4: Creative & Domain-Specific Validation
370
+
371
+ ```bash
372
+ # Test both constructor patterns
373
+ node -e "
374
+ const { Workflow } = require('./dist/index.js');
375
+
376
+ // Pattern 1: Class-based
377
+ try {
378
+ const wf1 = new Workflow(' '); // Whitespace only
379
+ console.log('ERROR: Whitespace should have thrown!');
380
+ } catch (e) {
381
+ console.log('Class-based pattern validation:', e.message);
382
+ }
383
+
384
+ // Pattern 2: Functional
385
+ try {
386
+ const wf2 = new Workflow({ name: '' }, async () => {});
387
+ console.log('ERROR: Empty should have thrown!');
388
+ } catch (e) {
389
+ console.log('Functional pattern validation:', e.message);
390
+ }
391
+ "
392
+
393
+ # Test max length validation
394
+ node -e "
395
+ const { Workflow } = require('./dist/index.js');
396
+ class TestWF extends Workflow { async run() { return 'done'; } }
397
+
398
+ const longName = 'a'.repeat(101);
399
+ try {
400
+ new TestWF(longName);
401
+ console.log('ERROR: 101 chars should have thrown!');
402
+ } catch (e) {
403
+ console.log('Max length validation:', e.message);
404
+ }
405
+
406
+ const exactly100 = 'a'.repeat(100);
407
+ const wf3 = new TestWF(exactly100);
408
+ console.log('Exactly 100 chars works:', wf3.node.name.length === 100);
409
+ "
410
+
411
+ # Expected: All validation rules work correctly for both constructor patterns
412
+ ```
413
+
414
+ ## Final Validation Checklist
415
+
416
+ ### Technical Validation
417
+
418
+ - [ ] TypeScript compiles without errors: `npx tsc --noEmit`
419
+ - [ ] All tests pass: `npm test`
420
+ - [ ] Empty string names throw error with correct message
421
+ - [ ] Whitespace-only names throw error with correct message
422
+ - [ ] Names > 100 chars throw error with correct message
423
+ - [ ] Exactly 100 chars works
424
+ - [ ] Undefined/null names use class name (existing behavior)
425
+ - [ ] Both constructor patterns are validated
426
+
427
+ ### Feature Validation
428
+
429
+ - [ ] Validation location: after config assignment, before node creation
430
+ - [ ] Error messages match decision document exactly
431
+ - [ ] No auto-trimming of whitespace (user intent preserved)
432
+ - [ ] Edge-case test updated and passing
433
+ - [ ] New validation tests added and passing
434
+
435
+ ### Code Quality Validation
436
+
437
+ - [ ] Follows existing error throwing patterns (standard Error, descriptive messages)
438
+ - [ ] No custom error classes created
439
+ - [ ] Code is self-documenting with clear variable names
440
+ - [ ] Breaking change is documented (test expectations updated)
441
+
442
+ ### Documentation & Deployment
443
+
444
+ - [ ] Code changes are minimal and focused
445
+ - [ ] No new dependencies added
446
+ - [ ] No new files created (modifications only)
447
+ - [ ] Backward compatibility handled (undefined preserved)
448
+
449
+ ---
450
+
451
+ ## Anti-Patterns to Avoid
452
+
453
+ - ❌ Don't auto-trim names - preserve user intent, only reject whitespace-only
454
+ - ❌ Don't use custom error classes - codebase uses standard `Error`
455
+ - ❌ Don't forget both constructor patterns - validation must work for class-based AND functional
456
+ - ❌ Don't break the undefined fallback - preserve class name default behavior
457
+ - ❌ Don't validate when this.config.name is undefined - this means class name was used (valid)
458
+ - ❌ Don't check trimmed length for max length - check original length per decision document
459
+ - ❌ Don't update the edge-case test description - only change the expectation
460
+ - ❌ Don't skip testing both constructor patterns - they handle name differently