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,265 @@
1
+ # External Best Practices for Workflow Name Validation
2
+
3
+ ## Industry Standards Comparison
4
+
5
+ ### 1. Kubernetes Naming Standards
6
+ **Source:** [Kubernetes Documentation - Names](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/)
7
+
8
+ | Requirement | Value |
9
+ |-------------|-------|
10
+ | Max Length | 253 characters |
11
+ | Allowed Characters | Lowercase alphanumeric, `-`, `.` |
12
+ | Must Start/End With | Alphanumeric |
13
+ | Pattern | `[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*` |
14
+ | Rule | Must be valid DNS subdomain name |
15
+
16
+ ### 2. Apache Airflow DAG Naming
17
+ **Source:** [Airflow DAG Documentation](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html)
18
+
19
+ | Requirement | Value |
20
+ |-------------|-------|
21
+ | Characters | Alphanumeric, underscores only |
22
+ | Spaces | Not allowed |
23
+ | Pattern | `^[a-zA-Z0-9_]+$` |
24
+ | Uniqueness | Required across all DAGs |
25
+ | Case | Case-sensitive |
26
+ | File Naming | Must match Python module naming (no hyphens) |
27
+
28
+ ### 3. AWS Step Functions State Machine Names
29
+ **Source:** [AWS Step Functions Documentation](https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-state-machine-structure.html)
30
+
31
+ | Requirement | Value |
32
+ |-------------|-------|
33
+ | Min Length | 1 character |
34
+ | Max Length | 80 characters |
35
+ | Allowed Characters | Alphanumeric, hyphens, underscores |
36
+ | Pattern | `^[a-zA-Z0-9_-]+$` |
37
+ | Uniqueness | Required within account/region |
38
+ | Case | Case-insensitive |
39
+
40
+ ### 4. GitHub Actions Workflow Names
41
+ **Source:** [GitHub Actions Documentation](https://docs.github.com/en/actions/using-workflows)
42
+
43
+ | Requirement | Value |
44
+ |-------------|-------|
45
+ | Characters | Most printable characters allowed |
46
+ | Purpose | Display name for UI |
47
+ | Format | String value in YAML |
48
+ | Fallback | Uses filename if name omitted |
49
+
50
+ ### 5. Temporal Workflow Names
51
+ **Source:** [Temporal TypeScript Documentation](https://docs.temporal.io/docs/typescript/workflows)
52
+
53
+ | Requirement | Value |
54
+ |-------------|-------|
55
+ | Pattern | Valid TypeScript identifier |
56
+ | Regex | `^[a-zA-Z_$][a-zA-Z0-9_$]*$` |
57
+ | Convention | PascalCase or camelCase |
58
+ | Uniqueness | Scoped to namespace/task queue |
59
+
60
+ ## Common Validation Patterns
61
+
62
+ ### Pattern 1: Strict Identifier (Kubernetes-style)
63
+ ```typescript
64
+ const STRICT_IDENTIFIER = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;
65
+
66
+ function validateStrict(name: string): boolean {
67
+ return (
68
+ name.length >= 1 &&
69
+ name.length <= 253 &&
70
+ STRICT_IDENTIFIER.test(name)
71
+ );
72
+ }
73
+ ```
74
+
75
+ ### Pattern 2: Alphanumeric with Underscores (Airflow-style)
76
+ ```typescript
77
+ const SNAKE_CASE_IDENTIFIER = /^[a-zA-Z0-9_]+$/;
78
+
79
+ function validateSnakeCase(name: string): boolean {
80
+ return name.length > 0 && SNAKE_CASE_IDENTIFIER.test(name);
81
+ }
82
+ ```
83
+
84
+ ### Pattern 3: Flexible Identifier (AWS-style)
85
+ ```typescript
86
+ const FLEXIBLE_IDENTIFIER = /^[a-zA-Z0-9_-]+$/;
87
+
88
+ function validateFlexible(name: string): boolean {
89
+ return (
90
+ name.length >= 1 &&
91
+ name.length <= 80 &&
92
+ FLEXIBLE_IDENTIFIER.test(name)
93
+ );
94
+ }
95
+ ```
96
+
97
+ ### Pattern 4: TypeScript/JavaScript Identifier
98
+ ```typescript
99
+ const JS_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
100
+
101
+ function validateJSIdentifier(name: string): boolean {
102
+ return JS_IDENTIFIER.test(name);
103
+ }
104
+ ```
105
+
106
+ ## Best Practice Summary
107
+
108
+ ### Length Limits
109
+ | System | Min | Max | Recommendation for Groundswell |
110
+ |--------|-----|-----|--------------------------------|
111
+ | Kubernetes | 1 | 253 | |
112
+ | Airflow | - | - | |
113
+ | AWS | 1 | 80 | **1-100** (reasonable balance) |
114
+ | GitHub | - | - | |
115
+
116
+ ### Character Sets
117
+ | System | Characters | Restrictiveness |
118
+ |--------|------------|-----------------|
119
+ | Kubernetes | `[a-z0-9.-]` | Most restrictive |
120
+ | Airflow | `[a-zA-Z0-9_]` | Moderate |
121
+ | AWS | `[a-zA-Z0-9_-]` | Moderate |
122
+ | GitHub | Most printable | Permissive |
123
+ | Temporal | `[a-zA-Z0-9_$]` | Language-specific |
124
+
125
+ ### Common Rules Across All Systems
126
+
127
+ 1. **Non-empty:** All systems require at least 1 character
128
+ 2. **No spaces:** Spaces are universally rejected
129
+ 3. **ASCII-only:** Unicode not typically allowed
130
+ 4. **Uniqueness:** Required within appropriate scope
131
+ 5. **No reserved words:** System keywords avoided
132
+
133
+ ## TypeScript Implementation Patterns
134
+
135
+ ### Basic Validation Function
136
+ ```typescript
137
+ interface ValidationResult {
138
+ valid: boolean;
139
+ error?: string;
140
+ }
141
+
142
+ function validateWorkflowName(name: unknown): ValidationResult {
143
+ // Type check
144
+ if (typeof name !== 'string') {
145
+ return { valid: false, error: 'Workflow name must be a string' };
146
+ }
147
+
148
+ // Empty check
149
+ if (name.length === 0) {
150
+ return { valid: false, error: 'Workflow name cannot be empty' };
151
+ }
152
+
153
+ // Whitespace check
154
+ if (name.trim().length === 0) {
155
+ return { valid: false, error: 'Workflow name cannot be whitespace only' };
156
+ }
157
+
158
+ // Length check
159
+ if (name.length > 100) {
160
+ return { valid: false, error: 'Workflow name cannot exceed 100 characters' };
161
+ }
162
+
163
+ return { valid: true };
164
+ }
165
+ ```
166
+
167
+ ### Branded Type Pattern (Type-safe)
168
+ ```typescript
169
+ // Type for validated workflow names
170
+ type WorkflowName = string & { readonly __brand: unique symbol };
171
+
172
+ function toWorkflowName(name: unknown): WorkflowName {
173
+ const result = validateWorkflowName(name);
174
+ if (!result.valid) {
175
+ throw new Error(result.error);
176
+ }
177
+ return name as WorkflowName;
178
+ }
179
+
180
+ // Usage in Workflow class
181
+ class Workflow {
182
+ constructor(name: WorkflowName | string) {
183
+ // If passed as string, validate
184
+ const validated = typeof name === 'string' ? toWorkflowName(name) : name;
185
+ this.node = { name: validated, ... };
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### Regex-based Validation
191
+ ```typescript
192
+ // Recommended pattern for Groundswell
193
+ const WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]$/;
194
+
195
+ // Or simpler: just ensure non-empty with no control characters
196
+ const SIMPLE_PATTERN = /^[^\x00-\x1F\x7F]+$/;
197
+
198
+ function validateWithPattern(name: string): boolean {
199
+ return (
200
+ name.length >= 1 &&
201
+ name.length <= 100 &&
202
+ SIMPLE_PATTERN.test(name)
203
+ );
204
+ }
205
+ ```
206
+
207
+ ## Recommendation for Groundswell
208
+
209
+ Based on industry standards and codebase patterns:
210
+
211
+ ### Option A: Minimal Validation (Recommended for initial implementation)
212
+ ```typescript
213
+ // Rules:
214
+ // 1. Must be a string
215
+ // 2. Must be non-empty after trimming
216
+ // 3. No length limit (or very generous limit)
217
+
218
+ function validateWorkflowName(name: unknown): string {
219
+ if (typeof name !== 'string') {
220
+ throw new Error('Workflow name must be a string');
221
+ }
222
+ if (name.trim().length === 0) {
223
+ throw new Error('Workflow name cannot be empty or whitespace only');
224
+ }
225
+ return name.trim();
226
+ }
227
+ ```
228
+
229
+ ### Option B: Moderate Validation (Follows AWS/Airflow style)
230
+ ```typescript
231
+ // Rules:
232
+ // 1. Non-empty string
233
+ // 2. 1-100 characters
234
+ // 3. Alphanumeric, hyphens, underscores only
235
+ // 4. Must start/end with alphanumeric
236
+
237
+ const WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]$/;
238
+
239
+ function validateWorkflowName(name: unknown): string {
240
+ if (typeof name !== 'string') {
241
+ throw new Error('Workflow name must be a string');
242
+ }
243
+ const trimmed = name.trim();
244
+ if (trimmed.length === 0 || trimmed.length > 100) {
245
+ throw new Error('Workflow name must be 1-100 characters');
246
+ }
247
+ if (!WORKFLOW_NAME_PATTERN.test(trimmed)) {
248
+ throw new Error(
249
+ 'Workflow name must contain only alphanumeric characters, hyphens, and underscores, ' +
250
+ 'and must start and end with an alphanumeric character'
251
+ );
252
+ }
253
+ return trimmed;
254
+ }
255
+ ```
256
+
257
+ ## External References
258
+
259
+ | System | Documentation URL |
260
+ |--------|-------------------|
261
+ | Kubernetes Names | https://kubernetes.io/docs/concepts/overview/working-with-objects/names/ |
262
+ | Apache Airflow DAGs | https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html |
263
+ | AWS Step Functions | https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-state-machine-structure.html |
264
+ | GitHub Actions | https://docs.github.com/en/actions/using-workflows |
265
+ | Temporal Workflows | https://docs.temporal.io/docs/typescript/workflows |
@@ -0,0 +1,273 @@
1
+ # Validation Patterns in Groundswell Codebase
2
+
3
+ ## Overview
4
+
5
+ This document catalogs validation patterns used throughout the Groundswell codebase to inform the implementation of workflow name validation.
6
+
7
+ ## Parameter Validation Patterns
8
+
9
+ ### Pattern 1: Required Context Validation
10
+ **File:** `src/context.ts:42-51`
11
+
12
+ ```typescript
13
+ export function requireExecutionContext(
14
+ operation: string
15
+ ): AgentExecutionContext {
16
+ const context = executionContext.getStore();
17
+ if (!context) {
18
+ throw new Error(
19
+ `${operation} called outside of workflow context. ` +
20
+ `Agent/Prompt operations must be executed within a workflow step.`
21
+ );
22
+ }
23
+ return context;
24
+ }
25
+ ```
26
+
27
+ **Key Characteristics:**
28
+ - Null/undefined check with `!context`
29
+ - Descriptive error message with context
30
+ - Includes operation name in error
31
+ - Suggests remedy ("must be executed within...")
32
+
33
+ ### Pattern 2: Unique Registration Validation
34
+ **File:** `src/core/mcp-handler.ts:62-67`
35
+
36
+ ```typescript
37
+ public registerServer(server: MCPServer): void {
38
+ if (this.servers.has(server.name)) {
39
+ throw new Error(`MCP server '${server.name}' is already registered`);
40
+ }
41
+ this.servers.set(server.name, server);
42
+ }
43
+ ```
44
+
45
+ **Key Characteristics:**
46
+ - Pre-operation validation check
47
+ - Uses `has()` to check existence
48
+ - Error includes the conflicting value
49
+ - Specific error message for clarity
50
+
51
+ ### Pattern 3: Circular Reference Detection
52
+ **File:** `src/core/workflow.ts:186-191`
53
+
54
+ ```typescript
55
+ if (visited.has(current)) {
56
+ throw new Error('Circular parent-child relationship detected');
57
+ }
58
+ ```
59
+
60
+ **Key Characteristics:**
61
+ - Cycle detection using Set
62
+ - Concise error message
63
+ - Uses generic error type (not custom)
64
+
65
+ ### Pattern 4: Parent Validation with Detailed Error
66
+ **File:** `src/core/workflow.ts:272-279`
67
+
68
+ ```typescript
69
+ if (child.parent !== null && child.parent !== this) {
70
+ const errorMessage =
71
+ `Child '${child.node.name}' already has a parent '${child.parent.node.name}'. ` +
72
+ `A workflow can only have one parent. ` +
73
+ `Use detachChild() on '${child.parent.node.name}' first if you need to reparent.`;
74
+ console.error(errorMessage);
75
+ throw new Error(errorMessage);
76
+ }
77
+ ```
78
+
79
+ **Key Characteristics:**
80
+ - Multi-line error message for clarity
81
+ - Includes actual values (names)
82
+ - Explains the constraint
83
+ - Provides actionable guidance
84
+ - Logs to console.error before throwing
85
+
86
+ ### Pattern 5: Input Existence Check
87
+ **File:** `src/core/workflow.ts:320-323`
88
+
89
+ ```typescript
90
+ if (!childOrName) {
91
+ throw new Error('Child workflow or name is required');
92
+ }
93
+ ```
94
+
95
+ **Key Characteristics:**
96
+ - Simple existence check
97
+ - Clear error message
98
+ - Uses negated condition
99
+
100
+ ## Test Patterns for Validation
101
+
102
+ ### Pattern 1: TDD-style Error Testing
103
+ **File:** `src/__tests__/adversarial/circular-reference.test.ts:23-29`
104
+
105
+ ```typescript
106
+ it('should throw when attaching immediate parent as child', () => {
107
+ const parent = new SimpleWorkflow('Parent');
108
+ const child = new SimpleWorkflow('Child', parent);
109
+
110
+ expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/i);
111
+ });
112
+ ```
113
+
114
+ **Key Characteristics:**
115
+ - Setup with valid state
116
+ - Test the invalid operation
117
+ - Use regex to match error message keywords
118
+ - Case-insensitive matching
119
+
120
+ ### Pattern 2: Specific Error Message Testing
121
+ **File:** `src/__tests__/unit/workflow-detachChild.test.ts:22-26`
122
+
123
+ ```typescript
124
+ it('should throw error when child is not attached to parent', () => {
125
+ const parent = new SimpleWorkflow('Parent');
126
+ const child = new SimpleWorkflow('Child');
127
+
128
+ expect(() => parent.detachChild(child)).toThrow(/not attached/i);
129
+ });
130
+ ```
131
+
132
+ **Key Characteristics:**
133
+ - Minimal setup
134
+ - Direct test of error condition
135
+ - Specific error message assertion
136
+
137
+ ### Pattern 3: Constructor Parameter Testing
138
+ **File:** `src/__tests__/unit/workflow.test.ts:20-28`
139
+
140
+ ```typescript
141
+ it('should use class name as default workflow name', () => {
142
+ const wf = new SimpleWorkflow();
143
+ expect(wf.getNode().name).toBe('SimpleWorkflow');
144
+ });
145
+
146
+ it('should use custom name when provided', () => {
147
+ const wf = new SimpleWorkflow('CustomName');
148
+ expect(wf.getNode().name).toBe('CustomName');
149
+ });
150
+ ```
151
+
152
+ **Key Characteristics:**
153
+ - Tests both default and custom behavior
154
+ - Clear expected values
155
+ - Uses getter method (`getNode()`)
156
+ - Separate tests for each case
157
+
158
+ ### Pattern 4: Edge Case Testing
159
+ **File:** `src/__tests__/adversarial/edge-case.test.ts:107-117`
160
+
161
+ ```typescript
162
+ it('should handle empty string workflow name', async () => {
163
+ const workflow = new TestWorkflow('');
164
+ expect(workflow.node.name).toBe('');
165
+ await workflow.run();
166
+ });
167
+ ```
168
+
169
+ **Key Characteristics:**
170
+ - Tests boundary condition
171
+ - Tests both property and execution
172
+ - Async test when execution is involved
173
+
174
+ ## Error Message Patterns
175
+
176
+ ### Descriptive Error Format
177
+ ```typescript
178
+ // Pattern: {What} {Why} {Context} {Guidance}
179
+ throw new Error(
180
+ `${operation} called outside of workflow context. ` +
181
+ `Agent/Prompt operations must be executed within a workflow step.`
182
+ );
183
+ ```
184
+
185
+ ### Value-Including Error Format
186
+ ```typescript
187
+ // Pattern: Include the actual invalid value in quotes
188
+ throw new Error(`MCP server '${server.name}' is already registered`);
189
+ ```
190
+
191
+ ### Multi-Line Guidance Format
192
+ ```typescript
193
+ // Pattern: Explain the constraint + provide action
194
+ const errorMessage =
195
+ `Child '${child.node.name}' already has a parent '${child.parent.node.name}'. ` +
196
+ `A workflow can only have one parent. ` +
197
+ `Use detachChild() on '${child.parent.node.name}' first if you need to reparent.`;
198
+ ```
199
+
200
+ ## Implementation Recommendations
201
+
202
+ ### Validation Function Pattern
203
+ Based on codebase patterns, workflow name validation should:
204
+
205
+ ```typescript
206
+ // Location: In Workflow constructor, after config is set
207
+ private validateName(name: unknown): string {
208
+ // Type check (Pattern from requireExecutionContext)
209
+ if (typeof name !== 'string') {
210
+ throw new Error(`Workflow name must be a string, received ${typeof name}`);
211
+ }
212
+
213
+ // Empty check (Pattern from registerServer)
214
+ if (name.trim().length === 0) {
215
+ throw new Error('Workflow name cannot be empty or whitespace only');
216
+ }
217
+
218
+ // Optional: Length check
219
+ if (name.length > 100) {
220
+ throw new Error('Workflow name cannot exceed 100 characters');
221
+ }
222
+
223
+ return name;
224
+ }
225
+ ```
226
+
227
+ ### Test Pattern to Follow
228
+ ```typescript
229
+ describe('Workflow Name Validation', () => {
230
+ // Test empty string
231
+ it('should reject empty string name', () => {
232
+ expect(() => new SimpleWorkflow(''))
233
+ .toThrow(/cannot be empty|whitespace only/i);
234
+ });
235
+
236
+ // Test whitespace only
237
+ it('should reject whitespace-only name', () => {
238
+ expect(() => new SimpleWorkflow(' '))
239
+ .toThrow(/whitespace only/i);
240
+ });
241
+
242
+ // Test valid name still works
243
+ it('should accept valid name', () => {
244
+ const wf = new SimpleWorkflow('ValidWorkflow');
245
+ expect(wf.node.name).toBe('ValidWorkflow');
246
+ });
247
+
248
+ // Test default class name still works
249
+ it('should use class name when not provided', () => {
250
+ const wf = new SimpleWorkflow();
251
+ expect(wf.node.name).toBe('SimpleWorkflow');
252
+ });
253
+ });
254
+ ```
255
+
256
+ ## Key Gotchas
257
+
258
+ 1. **No custom error classes:** Codebase uses standard `Error` - follow this pattern
259
+ 2. **Error messages include values:** Always include the invalid value in quotes
260
+ 3. **Console.error before throw:** Some places log before throwing (Pattern 4)
261
+ 4. **Regex matching in tests:** Use case-insensitive regex with keywords
262
+ 5. **Separate test files:** Validation tests go in adversarial/ or unit/ directory
263
+
264
+ ## Files to Reference for Implementation
265
+
266
+ | Purpose | File | Lines |
267
+ |---------|------|-------|
268
+ | Constructor location | src/core/workflow.ts | 83-108 |
269
+ | Validation examples | src/context.ts | 42-51 |
270
+ | Error examples | src/core/workflow.ts | 272-279 |
271
+ | Test patterns | src/__tests__/adversarial/ | Various |
272
+ | Existing name tests | src/__tests__/unit/workflow.test.ts | 20-28 |
273
+ | Current empty name test | src/__tests__/adversarial/edge-case.test.ts | 107-117 |