tasker-engine 1.0.0

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 (605) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +443 -0
  4. data/Rakefile +10 -0
  5. data/app/controllers/tasker/analytics_controller.rb +179 -0
  6. data/app/controllers/tasker/application_controller.rb +45 -0
  7. data/app/controllers/tasker/graphql_controller.rb +193 -0
  8. data/app/controllers/tasker/handlers_controller.rb +217 -0
  9. data/app/controllers/tasker/health_controller.rb +229 -0
  10. data/app/controllers/tasker/metrics_controller.rb +111 -0
  11. data/app/controllers/tasker/page_sort.rb +97 -0
  12. data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
  13. data/app/controllers/tasker/tasks_controller.rb +123 -0
  14. data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
  15. data/app/graphql/examples/all_tasks.graphql +22 -0
  16. data/app/graphql/examples/pending_tasks.graphql +23 -0
  17. data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
  18. data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
  19. data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
  20. data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
  21. data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
  22. data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
  23. data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
  24. data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
  25. data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
  26. data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
  27. data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
  28. data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
  29. data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
  30. data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
  31. data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
  32. data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
  33. data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
  34. data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
  35. data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
  36. data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
  37. data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
  38. data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
  39. data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
  40. data/app/graphql/tasker/graph_ql_types.rb +42 -0
  41. data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
  42. data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
  43. data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
  44. data/app/graphql/tasker/mutations/create_task.rb +52 -0
  45. data/app/graphql/tasker/mutations/update_step.rb +36 -0
  46. data/app/graphql/tasker/mutations/update_task.rb +41 -0
  47. data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
  48. data/app/graphql/tasker/queries/all_tasks.rb +23 -0
  49. data/app/graphql/tasker/queries/base_query.rb +9 -0
  50. data/app/graphql/tasker/queries/helpers.rb +16 -0
  51. data/app/graphql/tasker/queries/one_step.rb +24 -0
  52. data/app/graphql/tasker/queries/one_task.rb +18 -0
  53. data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
  54. data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
  55. data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
  56. data/app/jobs/tasker/application_job.rb +8 -0
  57. data/app/jobs/tasker/metrics_export_job.rb +252 -0
  58. data/app/jobs/tasker/task_runner_job.rb +224 -0
  59. data/app/models/tasker/annotation_type.rb +26 -0
  60. data/app/models/tasker/application_record.rb +70 -0
  61. data/app/models/tasker/dependent_system.rb +26 -0
  62. data/app/models/tasker/dependent_system_object_map.rb +64 -0
  63. data/app/models/tasker/diagram/edge.rb +106 -0
  64. data/app/models/tasker/diagram/flowchart.rb +137 -0
  65. data/app/models/tasker/diagram/node.rb +99 -0
  66. data/app/models/tasker/named_step.rb +41 -0
  67. data/app/models/tasker/named_task.rb +121 -0
  68. data/app/models/tasker/named_tasks_named_step.rb +82 -0
  69. data/app/models/tasker/step_dag_relationship.rb +65 -0
  70. data/app/models/tasker/step_readiness_status.rb +59 -0
  71. data/app/models/tasker/task.rb +424 -0
  72. data/app/models/tasker/task_annotation.rb +36 -0
  73. data/app/models/tasker/task_diagram.rb +332 -0
  74. data/app/models/tasker/task_execution_context.rb +29 -0
  75. data/app/models/tasker/task_namespace.rb +41 -0
  76. data/app/models/tasker/task_transition.rb +235 -0
  77. data/app/models/tasker/workflow_step.rb +461 -0
  78. data/app/models/tasker/workflow_step_edge.rb +94 -0
  79. data/app/models/tasker/workflow_step_transition.rb +434 -0
  80. data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
  81. data/app/serializers/tasker/handler_serializer.rb +109 -0
  82. data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
  83. data/app/serializers/tasker/task_serializer.rb +168 -0
  84. data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
  85. data/app/services/tasker/analytics_service.rb +409 -0
  86. data/app/views/tasker/task/_diagram.html.erb +32 -0
  87. data/config/initializers/dry_struct.rb +11 -0
  88. data/config/initializers/statesman.rb +6 -0
  89. data/config/initializers/tasker_orchestration.rb +17 -0
  90. data/config/initializers/time_formats.rb +4 -0
  91. data/config/routes.rb +34 -0
  92. data/config/tasker/subscriptions/example_integrations.yml +67 -0
  93. data/config/tasker/system_events.yml +305 -0
  94. data/db/functions/calculate_dependency_levels_v01.sql +45 -0
  95. data/db/functions/get_analytics_metrics_v01.sql +137 -0
  96. data/db/functions/get_slowest_steps_v01.sql +82 -0
  97. data/db/functions/get_slowest_tasks_v01.sql +96 -0
  98. data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
  99. data/db/functions/get_step_readiness_status_v01.sql +139 -0
  100. data/db/functions/get_system_health_counts_v01.sql +108 -0
  101. data/db/functions/get_task_execution_context_v01.sql +108 -0
  102. data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
  103. data/db/init/schema.sql +2277 -0
  104. data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
  105. data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
  106. data/docs/APPLICATION_GENERATOR.md +384 -0
  107. data/docs/AUTH.md +1780 -0
  108. data/docs/CIRCUIT_BREAKER.md +224 -0
  109. data/docs/DEVELOPER_GUIDE.md +2665 -0
  110. data/docs/EVENT_SYSTEM.md +637 -0
  111. data/docs/EXECUTION_CONFIGURATION.md +341 -0
  112. data/docs/FLOW_CHART.md +149 -0
  113. data/docs/HEALTH.md +542 -0
  114. data/docs/METRICS.md +731 -0
  115. data/docs/OPTIMIZATION_PLAN.md +1479 -0
  116. data/docs/OVERVIEW.md +552 -0
  117. data/docs/QUICK_START.md +270 -0
  118. data/docs/REGISTRY_SYSTEMS.md +373 -0
  119. data/docs/REST_API.md +632 -0
  120. data/docs/ROADMAP.md +221 -0
  121. data/docs/SQL_FUNCTIONS.md +1408 -0
  122. data/docs/TASK_DIAGRAM.md +252 -0
  123. data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
  124. data/docs/TELEMETRY.md +795 -0
  125. data/docs/TROUBLESHOOTING.md +756 -0
  126. data/docs/TaskHandlerGenerator.html +255 -0
  127. data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
  128. data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
  129. data/docs/Tasker/Analysis.html +117 -0
  130. data/docs/Tasker/AnalyticsController.html +450 -0
  131. data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
  132. data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
  133. data/docs/Tasker/AnalyticsService.html +2221 -0
  134. data/docs/Tasker/AnnotationType.html +137 -0
  135. data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
  136. data/docs/Tasker/ApplicationController.html +147 -0
  137. data/docs/Tasker/ApplicationJob.html +128 -0
  138. data/docs/Tasker/ApplicationRecord.html +378 -0
  139. data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
  140. data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
  141. data/docs/Tasker/Authentication/Coordinator.html +242 -0
  142. data/docs/Tasker/Authentication/Interface.html +560 -0
  143. data/docs/Tasker/Authentication/InterfaceError.html +124 -0
  144. data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
  145. data/docs/Tasker/Authentication.html +119 -0
  146. data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
  147. data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
  148. data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
  149. data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
  150. data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
  151. data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
  152. data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
  153. data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
  154. data/docs/Tasker/Authorization.html +582 -0
  155. data/docs/Tasker/CacheCapabilities.html +167 -0
  156. data/docs/Tasker/CacheStrategy.html +1297 -0
  157. data/docs/Tasker/Concerns/Authenticatable.html +116 -0
  158. data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
  159. data/docs/Tasker/Concerns/Authorizable.html +816 -0
  160. data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
  161. data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
  162. data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
  163. data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
  164. data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
  165. data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
  166. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
  167. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
  168. data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
  169. data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
  170. data/docs/Tasker/Concerns.html +117 -0
  171. data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
  172. data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
  173. data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
  174. data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
  175. data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
  176. data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
  177. data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
  178. data/docs/Tasker/Configuration.html +1669 -0
  179. data/docs/Tasker/ConfigurationError.html +143 -0
  180. data/docs/Tasker/ConfiguredTask.html +514 -0
  181. data/docs/Tasker/Constants/EventDefinitions.html +590 -0
  182. data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
  183. data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
  184. data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
  185. data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
  186. data/docs/Tasker/Constants/RegistryEvents.html +285 -0
  187. data/docs/Tasker/Constants/StepEvents.html +177 -0
  188. data/docs/Tasker/Constants/TaskEvents.html +167 -0
  189. data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
  190. data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
  191. data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
  192. data/docs/Tasker/Constants/TaskExecution.html +126 -0
  193. data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
  194. data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
  195. data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
  196. data/docs/Tasker/Constants/TaskFinalization.html +126 -0
  197. data/docs/Tasker/Constants/TaskStatuses.html +223 -0
  198. data/docs/Tasker/Constants/TestEvents.html +163 -0
  199. data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
  200. data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
  201. data/docs/Tasker/Constants.html +561 -0
  202. data/docs/Tasker/DependentSystem.html +137 -0
  203. data/docs/Tasker/DependentSystemObjectMap.html +250 -0
  204. data/docs/Tasker/DetectorRegistry.html +598 -0
  205. data/docs/Tasker/Diagram/Edge.html +1191 -0
  206. data/docs/Tasker/Diagram/Flowchart.html +1539 -0
  207. data/docs/Tasker/Diagram/Node.html +1165 -0
  208. data/docs/Tasker/Diagram.html +117 -0
  209. data/docs/Tasker/Engine.html +215 -0
  210. data/docs/Tasker/Error.html +139 -0
  211. data/docs/Tasker/Events/Bus.html +1226 -0
  212. data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
  213. data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
  214. data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
  215. data/docs/Tasker/Events/Catalog.html +1291 -0
  216. data/docs/Tasker/Events/CustomRegistry.html +943 -0
  217. data/docs/Tasker/Events/DefinitionLoader.html +575 -0
  218. data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
  219. data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
  220. data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
  221. data/docs/Tasker/Events/Publisher.html +365 -0
  222. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
  223. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
  224. data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
  225. data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
  226. data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
  227. data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
  228. data/docs/Tasker/Events/Subscribers.html +117 -0
  229. data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
  230. data/docs/Tasker/Events.html +294 -0
  231. data/docs/Tasker/EventsGenerator.html +459 -0
  232. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
  233. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
  234. data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
  235. data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
  236. data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
  237. data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
  238. data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
  239. data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
  240. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
  241. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
  242. data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
  243. data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
  244. data/docs/Tasker/Functions.html +117 -0
  245. data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
  246. data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
  247. data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
  248. data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
  249. data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
  250. data/docs/Tasker/Generators.html +117 -0
  251. data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
  252. data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
  253. data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
  254. data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
  255. data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
  256. data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
  257. data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
  258. data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
  259. data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
  260. data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
  261. data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
  262. data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
  263. data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
  264. data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
  265. data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
  266. data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
  267. data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
  268. data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
  269. data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
  270. data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
  271. data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
  272. data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
  273. data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
  274. data/docs/Tasker/GraphQLTypes.html +130 -0
  275. data/docs/Tasker/GraphqlController.html +251 -0
  276. data/docs/Tasker/HandlerFactory.html +1518 -0
  277. data/docs/Tasker/HandlerSerializer.html +682 -0
  278. data/docs/Tasker/HandlersController.html +574 -0
  279. data/docs/Tasker/HashIdentityStrategy.html +278 -0
  280. data/docs/Tasker/Health/ReadinessChecker.html +712 -0
  281. data/docs/Tasker/Health/StatusChecker.html +653 -0
  282. data/docs/Tasker/Health.html +117 -0
  283. data/docs/Tasker/HealthController.html +523 -0
  284. data/docs/Tasker/IdentityStrategy.html +276 -0
  285. data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
  286. data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
  287. data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
  288. data/docs/Tasker/LifecycleEvents/Events.html +204 -0
  289. data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
  290. data/docs/Tasker/LifecycleEvents.html +799 -0
  291. data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
  292. data/docs/Tasker/Logging.html +115 -0
  293. data/docs/Tasker/MetricsController.html +293 -0
  294. data/docs/Tasker/MetricsExportJob.html +414 -0
  295. data/docs/Tasker/Mutations/BaseMutation.html +128 -0
  296. data/docs/Tasker/Mutations/CancelStep.html +219 -0
  297. data/docs/Tasker/Mutations/CancelTask.html +221 -0
  298. data/docs/Tasker/Mutations/CreateTask.html +243 -0
  299. data/docs/Tasker/Mutations/UpdateStep.html +243 -0
  300. data/docs/Tasker/Mutations/UpdateTask.html +243 -0
  301. data/docs/Tasker/Mutations.html +117 -0
  302. data/docs/Tasker/NamedStep.html +216 -0
  303. data/docs/Tasker/NamedTask.html +910 -0
  304. data/docs/Tasker/NamedTasksNamedStep.html +435 -0
  305. data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
  306. data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
  307. data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
  308. data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
  309. data/docs/Tasker/Orchestration/Coordinator.html +641 -0
  310. data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
  311. data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
  312. data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
  313. data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
  314. data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
  315. data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
  316. data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
  317. data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
  318. data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
  319. data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
  320. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
  321. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
  322. data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
  323. data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
  324. data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
  325. data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
  326. data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
  327. data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
  328. data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
  329. data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
  330. data/docs/Tasker/Orchestration.html +130 -0
  331. data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
  332. data/docs/Tasker/PageSort.html +247 -0
  333. data/docs/Tasker/PermanentError.html +518 -0
  334. data/docs/Tasker/ProceduralError.html +147 -0
  335. data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
  336. data/docs/Tasker/Queries/AllTasks.html +221 -0
  337. data/docs/Tasker/Queries/BaseQuery.html +128 -0
  338. data/docs/Tasker/Queries/Helpers.html +187 -0
  339. data/docs/Tasker/Queries/OneStep.html +225 -0
  340. data/docs/Tasker/Queries/OneTask.html +217 -0
  341. data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
  342. data/docs/Tasker/Queries/TasksByStatus.html +233 -0
  343. data/docs/Tasker/Queries.html +119 -0
  344. data/docs/Tasker/Railtie.html +124 -0
  345. data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
  346. data/docs/Tasker/Registry/EventPublisher.html +667 -0
  347. data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
  348. data/docs/Tasker/Registry/RegistrationError.html +132 -0
  349. data/docs/Tasker/Registry/RegistryError.html +139 -0
  350. data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
  351. data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
  352. data/docs/Tasker/Registry/ValidationError.html +132 -0
  353. data/docs/Tasker/Registry.html +119 -0
  354. data/docs/Tasker/RetryableError.html +515 -0
  355. data/docs/Tasker/StateMachine/Compatibility.html +282 -0
  356. data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
  357. data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
  358. data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
  359. data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
  360. data/docs/Tasker/StateMachine.html +602 -0
  361. data/docs/Tasker/StepDagRelationship.html +657 -0
  362. data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
  363. data/docs/Tasker/StepHandler/Api.html +884 -0
  364. data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
  365. data/docs/Tasker/StepHandler/Base.html +970 -0
  366. data/docs/Tasker/StepHandler.html +119 -0
  367. data/docs/Tasker/StepReadinessStatus.html +836 -0
  368. data/docs/Tasker/Task.html +2575 -0
  369. data/docs/Tasker/TaskAnnotation.html +137 -0
  370. data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
  371. data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
  372. data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
  373. data/docs/Tasker/TaskBuilder.html +764 -0
  374. data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
  375. data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
  376. data/docs/Tasker/TaskDiagram.html +548 -0
  377. data/docs/Tasker/TaskDiagramsController.html +240 -0
  378. data/docs/Tasker/TaskExecutionContext.html +469 -0
  379. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
  380. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
  381. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
  382. data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
  383. data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
  384. data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
  385. data/docs/Tasker/TaskHandler.html +271 -0
  386. data/docs/Tasker/TaskNamespace.html +312 -0
  387. data/docs/Tasker/TaskRunnerJob.html +406 -0
  388. data/docs/Tasker/TaskSerializer.html +474 -0
  389. data/docs/Tasker/TaskTransition.html +1517 -0
  390. data/docs/Tasker/TaskWorkflowSummary.html +988 -0
  391. data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
  392. data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
  393. data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
  394. data/docs/Tasker/TaskerRailsSchema.html +384 -0
  395. data/docs/Tasker/TasksController.html +595 -0
  396. data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
  397. data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
  398. data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
  399. data/docs/Tasker/Telemetry/Events.html +115 -0
  400. data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
  401. data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
  402. data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
  403. data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
  404. data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
  405. data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
  406. data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
  407. data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
  408. data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
  409. data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
  410. data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
  411. data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
  412. data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
  413. data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
  414. data/docs/Tasker/Telemetry/Plugins.html +117 -0
  415. data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
  416. data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
  417. data/docs/Tasker/Telemetry.html +130 -0
  418. data/docs/Tasker/Types/AuthConfig.html +886 -0
  419. data/docs/Tasker/Types/BackoffConfig.html +1063 -0
  420. data/docs/Tasker/Types/BaseConfig.html +227 -0
  421. data/docs/Tasker/Types/CacheConfig.html +1731 -0
  422. data/docs/Tasker/Types/DatabaseConfig.html +388 -0
  423. data/docs/Tasker/Types/DependencyGraph.html +526 -0
  424. data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
  425. data/docs/Tasker/Types/EngineConfig.html +1181 -0
  426. data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
  427. data/docs/Tasker/Types/GraphEdge.html +517 -0
  428. data/docs/Tasker/Types/GraphMetadata.html +781 -0
  429. data/docs/Tasker/Types/GraphNode.html +694 -0
  430. data/docs/Tasker/Types/HealthConfig.html +784 -0
  431. data/docs/Tasker/Types/StepSequence.html +353 -0
  432. data/docs/Tasker/Types/StepTemplate.html +1193 -0
  433. data/docs/Tasker/Types/TaskRequest.html +1179 -0
  434. data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
  435. data/docs/Tasker/Types.html +154 -0
  436. data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
  437. data/docs/Tasker/WorkflowStep.html +2724 -0
  438. data/docs/Tasker/WorkflowStepEdge.html +304 -0
  439. data/docs/Tasker/WorkflowStepSerializer.html +305 -0
  440. data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
  441. data/docs/Tasker/WorkflowStepTransition.html +2201 -0
  442. data/docs/Tasker/WorkflowStepsController.html +462 -0
  443. data/docs/Tasker.html +452 -0
  444. data/docs/VISION.md +584 -0
  445. data/docs/WHY.md +21 -0
  446. data/docs/_index.html +2375 -0
  447. data/docs/class_list.html +54 -0
  448. data/docs/css/common.css +1 -0
  449. data/docs/css/full_list.css +58 -0
  450. data/docs/css/style.css +503 -0
  451. data/docs/events/migration_plan_outcomes.md +80 -0
  452. data/docs/file.README.html +541 -0
  453. data/docs/file_list.html +59 -0
  454. data/docs/frames.html +22 -0
  455. data/docs/index.html +541 -0
  456. data/docs/js/app.js +344 -0
  457. data/docs/js/full_list.js +242 -0
  458. data/docs/js/jquery.js +4 -0
  459. data/docs/method_list.html +9182 -0
  460. data/docs/top-level-namespace.html +110 -0
  461. data/lib/generators/tasker/authenticator_generator.rb +301 -0
  462. data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
  463. data/lib/generators/tasker/events_generator.rb +91 -0
  464. data/lib/generators/tasker/subscriber_generator.rb +107 -0
  465. data/lib/generators/tasker/task_handler_generator.rb +138 -0
  466. data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
  467. data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
  468. data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
  469. data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
  470. data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
  471. data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
  472. data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
  473. data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
  474. data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
  475. data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
  476. data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
  477. data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
  478. data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
  479. data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
  480. data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
  481. data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
  482. data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
  483. data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
  484. data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
  485. data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
  486. data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
  487. data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
  488. data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
  489. data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
  490. data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
  491. data/lib/tasker/authentication/coordinator.rb +78 -0
  492. data/lib/tasker/authentication/errors.rb +9 -0
  493. data/lib/tasker/authentication/interface.rb +36 -0
  494. data/lib/tasker/authentication/none_authenticator.rb +26 -0
  495. data/lib/tasker/authorization/base_coordinator.rb +112 -0
  496. data/lib/tasker/authorization/errors.rb +26 -0
  497. data/lib/tasker/authorization/resource_constants.rb +74 -0
  498. data/lib/tasker/authorization/resource_registry.rb +143 -0
  499. data/lib/tasker/authorization.rb +75 -0
  500. data/lib/tasker/cache_capabilities.rb +131 -0
  501. data/lib/tasker/cache_strategy.rb +469 -0
  502. data/lib/tasker/concerns/authenticatable.rb +41 -0
  503. data/lib/tasker/concerns/authorizable.rb +204 -0
  504. data/lib/tasker/concerns/controller_authorizable.rb +124 -0
  505. data/lib/tasker/concerns/event_publisher.rb +716 -0
  506. data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
  507. data/lib/tasker/concerns/state_machine_base.rb +218 -0
  508. data/lib/tasker/concerns/structured_logging.rb +387 -0
  509. data/lib/tasker/configuration.rb +325 -0
  510. data/lib/tasker/constants/event_definitions.rb +147 -0
  511. data/lib/tasker/constants/registry_events.rb +54 -0
  512. data/lib/tasker/constants.rb +417 -0
  513. data/lib/tasker/engine.rb +90 -0
  514. data/lib/tasker/errors.rb +90 -0
  515. data/lib/tasker/events/catalog.rb +432 -0
  516. data/lib/tasker/events/custom_registry.rb +175 -0
  517. data/lib/tasker/events/definition_loader.rb +199 -0
  518. data/lib/tasker/events/event_payload_builder.rb +461 -0
  519. data/lib/tasker/events/publisher.rb +149 -0
  520. data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
  521. data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
  522. data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
  523. data/lib/tasker/events/subscription_loader.rb +161 -0
  524. data/lib/tasker/events.rb +37 -0
  525. data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
  526. data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
  527. data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
  528. data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
  529. data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
  530. data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
  531. data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
  532. data/lib/tasker/functions/function_wrapper.rb +42 -0
  533. data/lib/tasker/functions.rb +12 -0
  534. data/lib/tasker/handler_factory.rb +322 -0
  535. data/lib/tasker/health/readiness_checker.rb +186 -0
  536. data/lib/tasker/health/status_checker.rb +203 -0
  537. data/lib/tasker/identity_strategy.rb +38 -0
  538. data/lib/tasker/logging/correlation_id_generator.rb +120 -0
  539. data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
  540. data/lib/tasker/orchestration/connection_builder.rb +122 -0
  541. data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
  542. data/lib/tasker/orchestration/coordinator.rb +119 -0
  543. data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
  544. data/lib/tasker/orchestration/plugin_integration.rb +124 -0
  545. data/lib/tasker/orchestration/response_processor.rb +168 -0
  546. data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
  547. data/lib/tasker/orchestration/step_executor.rb +941 -0
  548. data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
  549. data/lib/tasker/orchestration/task_finalizer.rb +564 -0
  550. data/lib/tasker/orchestration/task_initializer.rb +140 -0
  551. data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
  552. data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
  553. data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
  554. data/lib/tasker/orchestration.rb +45 -0
  555. data/lib/tasker/railtie.rb +9 -0
  556. data/lib/tasker/registry/base_registry.rb +177 -0
  557. data/lib/tasker/registry/event_publisher.rb +91 -0
  558. data/lib/tasker/registry/interface_validator.rb +140 -0
  559. data/lib/tasker/registry/statistics_collector.rb +381 -0
  560. data/lib/tasker/registry/subscriber_registry.rb +285 -0
  561. data/lib/tasker/registry.rb +22 -0
  562. data/lib/tasker/state_machine/step_state_machine.rb +508 -0
  563. data/lib/tasker/state_machine/task_state_machine.rb +192 -0
  564. data/lib/tasker/state_machine.rb +83 -0
  565. data/lib/tasker/step_handler/api.rb +410 -0
  566. data/lib/tasker/step_handler/base.rb +206 -0
  567. data/lib/tasker/task_builder.rb +432 -0
  568. data/lib/tasker/task_handler/class_methods.rb +324 -0
  569. data/lib/tasker/task_handler/instance_methods.rb +293 -0
  570. data/lib/tasker/task_handler/step_group.rb +182 -0
  571. data/lib/tasker/task_handler.rb +43 -0
  572. data/lib/tasker/telemetry/event_mapping.rb +126 -0
  573. data/lib/tasker/telemetry/event_router.rb +318 -0
  574. data/lib/tasker/telemetry/events/export_events.rb +38 -0
  575. data/lib/tasker/telemetry/export_coordinator.rb +497 -0
  576. data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
  577. data/lib/tasker/telemetry/log_backend.rb +224 -0
  578. data/lib/tasker/telemetry/metric_types.rb +368 -0
  579. data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
  580. data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
  581. data/lib/tasker/telemetry/plugin_registry.rb +333 -0
  582. data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
  583. data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
  584. data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
  585. data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
  586. data/lib/tasker/telemetry/trace_backend.rb +186 -0
  587. data/lib/tasker/telemetry.rb +59 -0
  588. data/lib/tasker/types/auth_config.rb +81 -0
  589. data/lib/tasker/types/backoff_config.rb +142 -0
  590. data/lib/tasker/types/cache_config.rb +257 -0
  591. data/lib/tasker/types/database_config.rb +39 -0
  592. data/lib/tasker/types/dependency_graph.rb +225 -0
  593. data/lib/tasker/types/dependency_graph_config.rb +149 -0
  594. data/lib/tasker/types/engine_config.rb +131 -0
  595. data/lib/tasker/types/execution_config.rb +289 -0
  596. data/lib/tasker/types/health_config.rb +84 -0
  597. data/lib/tasker/types/step_sequence.rb +24 -0
  598. data/lib/tasker/types/step_template.rb +63 -0
  599. data/lib/tasker/types/task_request.rb +60 -0
  600. data/lib/tasker/types/telemetry_config.rb +273 -0
  601. data/lib/tasker/types.rb +64 -0
  602. data/lib/tasker/version.rb +7 -0
  603. data/lib/tasker.rb +82 -0
  604. data/lib/tasks/tasker_tasks.rake +302 -0
  605. metadata +958 -0
@@ -0,0 +1,756 @@
1
+ # Tasker Troubleshooting Guide
2
+
3
+ ## Overview
4
+
5
+ This guide covers common issues and solutions you may encounter when developing with Tasker and deploying Tasker-based workflows to production. It's organized into development-time issues and deployment-time issues for easy navigation.
6
+
7
+ ## Development Troubleshooting
8
+
9
+ ### Task Handler Issues
10
+
11
+ #### "Task handler not found" or "NameError: uninitialized constant"
12
+
13
+ **Symptoms:**
14
+ ```ruby
15
+ # Error when trying to create or execute tasks
16
+ NameError: uninitialized constant OrderProcess
17
+ # or
18
+ Tasker::TaskHandler::NotFoundError: Task handler 'order_process' not found
19
+ ```
20
+
21
+ **Common Causes & Solutions:**
22
+
23
+ 1. **File naming mismatch**
24
+ ```bash
25
+ # Ensure file name matches class name
26
+ app/tasks/order_process.rb # File name should be snake_case
27
+ class OrderProcess # Class name should be CamelCase
28
+ ```
29
+
30
+ 2. **YAML configuration mismatch**
31
+ ```yaml
32
+ # config/tasker/tasks/order_process.yaml
33
+ name: order_process # Must match file name
34
+ task_handler_class: OrderProcess # Must match class name exactly
35
+ ```
36
+
37
+ 3. **Module namespace issues**
38
+ ```ruby
39
+ # If using module namespaces, ensure they're consistent
40
+ # YAML: module_namespace: ECommerce
41
+ # File: app/tasks/e_commerce/order_process.rb
42
+ module ECommerce
43
+ class OrderProcess < Tasker::TaskHandler::Base
44
+ ```
45
+
46
+ 4. **Rails autoloading not picking up changes**
47
+ ```bash
48
+ # Restart Rails server to reload task handlers
49
+ bundle exec rails server
50
+
51
+ # Or in development, force reload
52
+ Rails.application.reloader.reload!
53
+ ```
54
+
55
+ #### "Step handler not found" or Step execution failures
56
+
57
+ **Symptoms:**
58
+ ```ruby
59
+ # Step fails to execute or shows class loading errors
60
+ LoadError: unable to autoload constant WelcomeUser::StepHandler::ValidateUserHandler
61
+ ```
62
+
63
+ **Solutions:**
64
+
65
+ 1. **Check file structure and naming**
66
+ ```bash
67
+ # Correct structure
68
+ app/tasks/welcome_user/step_handler/validate_user_handler.rb
69
+
70
+ # Class should be properly namespaced
71
+ module WelcomeUser
72
+ module StepHandler
73
+ class ValidateUserHandler < Tasker::StepHandler::Base
74
+ ```
75
+
76
+ 2. **Verify YAML step configuration**
77
+ ```yaml
78
+ step_templates:
79
+ - name: validate_user
80
+ handler_class: WelcomeUser::StepHandler::ValidateUserHandler # Full namespace
81
+ ```
82
+
83
+ 3. **Check inheritance**
84
+ ```ruby
85
+ # Step handlers must inherit from appropriate base class
86
+ class MyStepHandler < Tasker::StepHandler::Base # For general steps
87
+ class MyApiHandler < Tasker::StepHandler::Api # For API steps
88
+ ```
89
+
90
+ ### Step Dependency Issues
91
+
92
+ #### Steps not executing in expected order
93
+
94
+ **Symptoms:**
95
+ - Steps run simultaneously when they should be sequential
96
+ - Steps wait indefinitely for dependencies
97
+ - Circular dependency errors
98
+
99
+ **Diagnosis & Solutions:**
100
+
101
+ 1. **Check dependency configuration**
102
+ ```yaml
103
+ # Correct single dependency
104
+ - name: step_two
105
+ depends_on_step: step_one
106
+
107
+ # Correct multiple dependencies
108
+ - name: step_three
109
+ depends_on_steps:
110
+ - step_one
111
+ - step_two
112
+ ```
113
+
114
+ 2. **Verify step names match exactly**
115
+ ```yaml
116
+ # Names must match exactly (case-sensitive)
117
+ - name: validate_order # Step name
118
+ - name: process_payment
119
+ depends_on_step: validate_order # Must match exactly
120
+ ```
121
+
122
+ 3. **Check for circular dependencies**
123
+ ```ruby
124
+ # In Rails console, use the new dependency_graph method
125
+ handler = Tasker::HandlerFactory.instance.get('your_task')
126
+ graph = handler.dependency_graph
127
+
128
+ # Check for cycles
129
+ if graph[:cycles].any?
130
+ puts "Circular dependencies detected:"
131
+ graph[:cycles].each do |cycle|
132
+ puts " Cycle: #{cycle.join(' -> ')}"
133
+ end
134
+ else
135
+ puts "No circular dependencies found"
136
+ end
137
+
138
+ # Show topology and dependency structure
139
+ puts "\nExecution order: #{graph[:topology].join(' -> ')}"
140
+ puts "Root steps (no dependencies): #{graph[:roots].join(', ')}"
141
+ puts "Leaf steps (no dependents): #{graph[:leaves].join(', ')}"
142
+ puts "Max parallel branches: #{graph[:summary][:parallel_branches]}"
143
+ ```
144
+
145
+ 4. **Debug dependency resolution**
146
+ ```ruby
147
+ # In Rails console, use runtime dependency analysis
148
+ task = Tasker::Task.find(your_task_id)
149
+ graph = task.dependency_graph
150
+
151
+ # Overall task status
152
+ puts "Task Status: #{graph[:summary][:task_state]}"
153
+ puts "Completion: #{graph[:summary][:completion_percentage]}%"
154
+ puts "Ready steps: #{graph[:ready_steps].join(', ')}"
155
+ puts "Blocked steps: #{graph[:blocked_steps].join(', ')}"
156
+
157
+ # Check for error chains
158
+ if graph[:error_chains].any?
159
+ puts "\nError Impact Analysis:"
160
+ graph[:error_chains].each do |chain|
161
+ puts " Error step '#{chain[:root_error]}' blocking #{chain[:impact_count]} steps:"
162
+ puts " Blocked: #{chain[:blocked_steps].join(', ')}"
163
+ end
164
+ end
165
+
166
+ # Detailed step analysis
167
+ puts "\nDetailed Step Status:"
168
+ graph[:nodes].each do |node|
169
+ puts "#{node[:name]}: #{node[:state]} (#{node[:attempts]}/#{node[:retry_limit]} attempts)"
170
+ puts " Dependencies: #{node[:dependencies].join(', ')}" if node[:dependencies].any?
171
+ puts " Ready: #{node[:ready_for_execution]}"
172
+ end
173
+ ```
174
+
175
+ #### Diamond pattern dependency issues
176
+
177
+ **Problem:** Steps with multiple dependency paths not executing correctly
178
+
179
+ **Solution:**
180
+ ```yaml
181
+ # Correct diamond pattern
182
+ - name: start_step # No dependencies
183
+ - name: branch_a
184
+ depends_on_step: start_step
185
+ - name: branch_b
186
+ depends_on_step: start_step
187
+ - name: merge_step
188
+ depends_on_steps: # Waits for BOTH branches
189
+ - branch_a
190
+ - branch_b
191
+ ```
192
+
193
+ ### Step Implementation Issues
194
+
195
+ #### Steps marked as failed when they should succeed
196
+
197
+ **Symptoms:**
198
+ - Step completes successfully but shows as "error" state
199
+ - Expected return values not stored in step.results
200
+
201
+ **Common Causes & Solutions:**
202
+
203
+ 1. **Exception handling masking success**
204
+ ```ruby
205
+ # WRONG - Catches exception but doesn't re-raise
206
+ def process(task, sequence, step)
207
+ begin
208
+ result = perform_operation()
209
+ { success: true, data: result }
210
+ rescue => e
211
+ # This makes the step appear successful to the framework
212
+ { success: false, error: e.message }
213
+ end
214
+ end
215
+
216
+ # CORRECT - Let exceptions propagate for framework handling
217
+ def process(task, sequence, step)
218
+ result = perform_operation()
219
+ { success: true, data: result }
220
+ # Framework automatically handles exceptions
221
+ end
222
+
223
+ # OR - Re-raise after logging custom error context
224
+ def process(task, sequence, step)
225
+ begin
226
+ result = perform_operation()
227
+ { success: true, data: result }
228
+ rescue => e
229
+ step.results = { error_context: "Additional details" }
230
+ raise # Re-raise so framework knows step failed
231
+ end
232
+ end
233
+ ```
234
+
235
+ 2. **Incorrect return values**
236
+ ```ruby
237
+ # WRONG - Not returning anything
238
+ def process(task, sequence, step)
239
+ step.results = { data: "some value" }
240
+ # No return value - framework gets nil
241
+ end
242
+
243
+ # CORRECT - Return the results
244
+ def process(task, sequence, step)
245
+ { data: "some value" }
246
+ end
247
+ ```
248
+
249
+ #### Data not passed between steps correctly
250
+
251
+ **Symptoms:**
252
+ - Dependent steps can't access previous step results
253
+ - nil or empty results from previous steps
254
+
255
+ **Solutions:**
256
+
257
+ 1. **Check step name references**
258
+ ```ruby
259
+ # Make sure step names match exactly
260
+ previous_step = sequence.find_step_by_name('validate_user') # Exact name
261
+ user_data = previous_step.results['user_data']
262
+ ```
263
+
264
+ 2. **Verify previous step completed successfully**
265
+ ```ruby
266
+ def process(task, sequence, step)
267
+ previous_step = sequence.find_step_by_name('previous_step')
268
+
269
+ unless previous_step.current_state == 'complete'
270
+ raise "Previous step not completed: #{previous_step.current_state}"
271
+ end
272
+
273
+ data = previous_step.results
274
+ end
275
+ ```
276
+
277
+ 3. **Handle missing or malformed results**
278
+ ```ruby
279
+ def process(task, sequence, step)
280
+ previous_step = sequence.find_step_by_name('fetch_data')
281
+
282
+ unless previous_step&.results&.key?('required_field')
283
+ raise "Previous step missing required data: #{previous_step&.results}"
284
+ end
285
+
286
+ required_data = previous_step.results['required_field']
287
+ end
288
+ ```
289
+
290
+ ### Retry Logic Issues
291
+
292
+ #### Steps not retrying when they should
293
+
294
+ **Symptoms:**
295
+ - Failed steps go directly to error state instead of retrying
296
+ - Retry count not incrementing
297
+
298
+ **Solutions:**
299
+
300
+ 1. **Check retry configuration**
301
+ ```yaml
302
+ # In YAML configuration
303
+ - name: unreliable_step
304
+ handler_class: MyHandler
305
+ default_retryable: true # Must be true for retries
306
+ default_retry_limit: 3 # Set appropriate limit
307
+ ```
308
+
309
+ 2. **Verify exception types**
310
+ ```ruby
311
+ # Some exceptions may not be retryable by default
312
+ def process(task, sequence, step)
313
+ # For custom retry logic, use specific exceptions
314
+ raise Tasker::RetryableError, "Temporary failure" # Will retry
315
+ # vs
316
+ raise ArgumentError, "Invalid input" # Won't retry
317
+ end
318
+ ```
319
+
320
+ 3. **Check retry state in database**
321
+ ```ruby
322
+ # In Rails console
323
+ step = Tasker::WorkflowStep.find(step_id)
324
+ puts "Attempts: #{step.attempts}"
325
+ puts "Retry limit: #{step.retry_limit}"
326
+ puts "Retryable: #{step.retryable}"
327
+ puts "State: #{step.current_state}"
328
+ ```
329
+
330
+ #### Infinite retry loops
331
+
332
+ **Symptoms:**
333
+ - Steps retry indefinitely
334
+ - High CPU usage from constant retrying
335
+
336
+ **Solutions:**
337
+
338
+ 1. **Check retry limits**
339
+ ```yaml
340
+ # Always set reasonable retry limits
341
+ default_retry_limit: 3 # Don't use overly high values
342
+ ```
343
+
344
+ 2. **Implement exponential backoff awareness**
345
+ ```ruby
346
+ def process(task, sequence, step)
347
+ # Check attempt count to adjust behavior
348
+ if step.attempts > 2
349
+ # Use more conservative approach on later attempts
350
+ timeout = 30 * (step.attempts ** 2) # Exponential timeout
351
+ end
352
+ end
353
+ ```
354
+
355
+ ### JSON Schema Validation Issues
356
+
357
+ #### Task requests failing validation
358
+
359
+ **Symptoms:**
360
+ ```ruby
361
+ Tasker::Types::ValidationError: Invalid task context
362
+ ```
363
+
364
+ **Solutions:**
365
+
366
+ 1. **Check schema definition in YAML**
367
+ ```yaml
368
+ schema:
369
+ type: object
370
+ required:
371
+ - user_id
372
+ - order_id # Make sure required fields are provided
373
+ properties:
374
+ user_id:
375
+ type: integer
376
+ minimum: 1 # Add appropriate constraints
377
+ order_id:
378
+ type: integer
379
+ ```
380
+
381
+ 2. **Validate context before task creation**
382
+ ```ruby
383
+ # Validate your context matches the schema
384
+ context = { user_id: 123, order_id: 456 }
385
+
386
+ task_request = Tasker::Types::TaskRequest.new(
387
+ name: 'order_process',
388
+ context: context
389
+ )
390
+ ```
391
+
392
+ ## Deployment Troubleshooting
393
+
394
+ ### Observability & Monitoring
395
+
396
+ #### Tasks stuck in pending state
397
+
398
+ **Symptoms:**
399
+ - Tasks created but never progress beyond 'pending'
400
+ - No step execution occurring
401
+
402
+ **Diagnosis Steps:**
403
+
404
+ 1. **Check ActiveJob backend**
405
+ ```bash
406
+ # Ensure your job processor is running
407
+ bundle exec sidekiq # For Sidekiq
408
+ # or check other ActiveJob backends
409
+ ```
410
+
411
+ 2. **Verify database connectivity**
412
+ ```ruby
413
+ # In Rails console
414
+ Tasker::Task.connection.execute("SELECT 1") # Should not raise error
415
+ ```
416
+
417
+ 3. **Check SQL function availability**
418
+ ```ruby
419
+ # Verify SQL functions are installed
420
+ result = Tasker::Task.connection.execute(
421
+ "SELECT get_task_execution_context_v01($1)", [task_id]
422
+ )
423
+ ```
424
+
425
+ 4. **Monitor workflow coordination**
426
+ ```ruby
427
+ # Check if coordinator is processing tasks
428
+ Tasker::Orchestration::Coordinator.new.coordinate_workflow_execution
429
+ ```
430
+
431
+ #### No step execution events
432
+
433
+ **Symptoms:**
434
+ - Tasks and steps exist but no lifecycle events
435
+ - Missing telemetry data
436
+
437
+ **Solutions:**
438
+
439
+ 1. **Verify event system configuration**
440
+ ```ruby
441
+ # Check if events are being published
442
+ Tasker::Events.catalog.keys # Should show available events
443
+ ```
444
+
445
+ 2. **Check event subscribers**
446
+ ```ruby
447
+ # Verify subscribers are registered
448
+ Tasker::Events::Publisher.instance.subscribers
449
+ ```
450
+
451
+ 3. **Enable telemetry**
452
+ ```ruby
453
+ # config/initializers/tasker.rb
454
+ Tasker.configuration do |config|
455
+ config.telemetry do |tel|
456
+ tel.enabled = true
457
+ tel.service_name = 'your-app'
458
+ end
459
+ end
460
+ ```
461
+
462
+ ### Performance Issues
463
+
464
+ #### Slow step readiness calculations
465
+
466
+ **Symptoms:**
467
+ - Long delays between step completions and dependent step execution
468
+ - High database CPU usage
469
+
470
+ **Solutions:**
471
+
472
+ 1. **Check SQL function performance**
473
+ ```sql
474
+ -- Monitor SQL function execution time
475
+ EXPLAIN ANALYZE SELECT get_task_execution_context_v01(123);
476
+ ```
477
+
478
+ 2. **Verify database indexes**
479
+ ```sql
480
+ -- Ensure proper indexes exist
481
+ \d tasker_workflow_steps; -- Check indexes on workflow_steps table
482
+ ```
483
+
484
+ 3. **Monitor function call frequency**
485
+ ```ruby
486
+ # Check if functions are being called too frequently
487
+ # Consider caching execution context for very active tasks
488
+ ```
489
+
490
+ #### Memory leaks in long-running tasks
491
+
492
+ **Symptoms:**
493
+ - Memory usage grows over time
494
+ - Application becomes unresponsive
495
+
496
+ **Solutions:**
497
+
498
+ 1. **Check step result sizes**
499
+ ```ruby
500
+ # Monitor step result sizes
501
+ task.workflow_steps.each do |step|
502
+ puts "#{step.name}: #{step.results.to_s.bytesize} bytes"
503
+ end
504
+ ```
505
+
506
+ 2. **Implement result cleanup**
507
+ ```ruby
508
+ def process(task, sequence, step)
509
+ result = large_operation()
510
+
511
+ # Return only essential data
512
+ {
513
+ status: 'completed',
514
+ record_count: result.size,
515
+ # Don't return the entire large dataset
516
+ }
517
+ end
518
+ ```
519
+
520
+ ### Error Analysis
521
+
522
+ #### Analyzing step failure patterns
523
+
524
+ **Diagnostic Queries:**
525
+
526
+ ```ruby
527
+ # Find frequently failing steps
528
+ failing_steps = Tasker::WorkflowStep
529
+ .where(current_state: 'error')
530
+ .group(:name)
531
+ .count
532
+ .sort_by { |_, count| -count }
533
+
534
+ # Analyze retry patterns
535
+ retry_analysis = Tasker::WorkflowStep
536
+ .where('attempts > 1')
537
+ .group(:name)
538
+ .average(:attempts)
539
+
540
+ # Check error types
541
+ error_patterns = Tasker::WorkflowStep
542
+ .where(current_state: 'error')
543
+ .where.not(results: {})
544
+ .map { |step| step.results['error'] }
545
+ .compact
546
+ .tally
547
+ ```
548
+
549
+ #### Debugging specific task execution
550
+
551
+ ```ruby
552
+ # Deep dive into specific task
553
+ task = Tasker::Task.find(task_id)
554
+
555
+ puts "Task: #{task.name} (#{task.state})"
556
+ puts "Created: #{task.created_at}"
557
+ puts "Context: #{task.context}"
558
+
559
+ task.workflow_steps.order(:created_at).each do |step|
560
+ puts "\nStep: #{step.name}"
561
+ puts " State: #{step.current_state}"
562
+ puts " Attempts: #{step.attempts}/#{step.retry_limit}"
563
+ puts " Duration: #{step.execution_duration}s" if step.execution_duration
564
+ puts " Results: #{step.results}"
565
+
566
+ if step.current_state == 'error'
567
+ puts " Error: #{step.results['error']}"
568
+ puts " Backtrace: #{step.results['backtrace']&.first(3)&.join("\n ")}"
569
+ end
570
+ end
571
+ ```
572
+
573
+ ### Logging & Observability Setup
574
+
575
+ #### Structured logging configuration
576
+
577
+ ```ruby
578
+ # config/initializers/tasker.rb
579
+ Tasker.configuration do |config|
580
+ config.telemetry do |tel|
581
+ tel.enabled = true
582
+ tel.service_name = 'your-application'
583
+ tel.service_version = ENV['APP_VERSION'] || '1.0.0'
584
+ tel.environment = Rails.env
585
+ end
586
+ end
587
+ ```
588
+
589
+ #### Custom event subscribers for monitoring
590
+
591
+ ```ruby
592
+ # app/subscribers/monitoring_subscriber.rb
593
+ class MonitoringSubscriber < Tasker::Events::Subscribers::BaseSubscriber
594
+ subscribe_to 'task.failed', 'step.failed', 'step.max_retries_reached'
595
+
596
+ def handle_task_failed(event)
597
+ task_id = safe_get(event, :task_id)
598
+ error = safe_get(event, :error_message)
599
+
600
+ # Send to your monitoring system
601
+ Rails.logger.error("Task failed: #{task_id} - #{error}")
602
+ AlertingService.notify_task_failure(task_id, error)
603
+ end
604
+
605
+ def handle_step_max_retries_reached(event)
606
+ step_id = safe_get(event, :step_id)
607
+ step_name = safe_get(event, :step_name)
608
+
609
+ # Alert on retry exhaustion
610
+ AlertingService.notify_step_retry_exhaustion(step_id, step_name)
611
+ end
612
+ end
613
+ ```
614
+
615
+ #### Production health checks
616
+
617
+ ```ruby
618
+ # Check system health
619
+ def tasker_health_check
620
+ checks = {
621
+ database: database_connectivity_check,
622
+ sql_functions: sql_functions_check,
623
+ pending_tasks: pending_tasks_check,
624
+ failed_tasks: failed_tasks_check
625
+ }
626
+
627
+ overall_health = checks.values.all? { |check| check[:status] == 'ok' }
628
+
629
+ {
630
+ status: overall_health ? 'healthy' : 'unhealthy',
631
+ timestamp: Time.current.iso8601,
632
+ checks: checks
633
+ }
634
+ end
635
+
636
+ private
637
+
638
+ def database_connectivity_check
639
+ Tasker::Task.connection.execute("SELECT 1")
640
+ { status: 'ok', message: 'Database connected' }
641
+ rescue => e
642
+ { status: 'error', message: e.message }
643
+ end
644
+
645
+ def sql_functions_check
646
+ Tasker::Task.connection.execute("SELECT get_task_execution_context_v01(1)")
647
+ { status: 'ok', message: 'SQL functions available' }
648
+ rescue => e
649
+ { status: 'error', message: "SQL functions unavailable: #{e.message}" }
650
+ end
651
+
652
+ def pending_tasks_check
653
+ count = Tasker::Task.where(state: 'pending').where('created_at < ?', 10.minutes.ago).count
654
+
655
+ if count > 100
656
+ { status: 'warning', message: "#{count} old pending tasks" }
657
+ else
658
+ { status: 'ok', message: "#{count} pending tasks" }
659
+ end
660
+ end
661
+ ```
662
+
663
+ ## Diagnostic Tools & Commands
664
+
665
+ ### Useful Rails Console Commands
666
+
667
+ ```ruby
668
+ # Task status overview
669
+ def task_summary
670
+ states = Tasker::Task.group(:state).count
671
+ puts "Task States:"
672
+ states.each { |state, count| puts " #{state}: #{count}" }
673
+ end
674
+
675
+ # Step failure analysis
676
+ def step_failure_summary
677
+ failures = Tasker::WorkflowStep
678
+ .where(current_state: 'error')
679
+ .group(:name)
680
+ .count
681
+
682
+ puts "Failed Steps:"
683
+ failures.each { |name, count| puts " #{name}: #{count}" }
684
+ end
685
+
686
+ # Recent task activity
687
+ def recent_activity(hours = 24)
688
+ since = hours.hours.ago
689
+
690
+ puts "Activity since #{since}:"
691
+ puts " Tasks created: #{Tasker::Task.where('created_at > ?', since).count}"
692
+ puts " Tasks completed: #{Tasker::Task.where('updated_at > ? AND state = ?', since, 'complete').count}"
693
+ puts " Tasks failed: #{Tasker::Task.where('updated_at > ? AND state = ?', since, 'error').count}"
694
+ end
695
+ ```
696
+
697
+ ### Database Queries for Analysis
698
+
699
+ ```sql
700
+ -- Find long-running tasks
701
+ SELECT id, name, state, created_at, updated_at,
702
+ EXTRACT(EPOCH FROM (NOW() - created_at))/3600 as hours_running
703
+ FROM tasker_tasks
704
+ WHERE state IN ('pending', 'processing')
705
+ AND created_at < NOW() - INTERVAL '1 hour'
706
+ ORDER BY created_at;
707
+
708
+ -- Find steps with high retry rates
709
+ SELECT name,
710
+ COUNT(*) as total_attempts,
711
+ AVG(attempts) as avg_attempts,
712
+ MAX(attempts) as max_attempts
713
+ FROM tasker_workflow_steps
714
+ WHERE attempts > 1
715
+ GROUP BY name
716
+ ORDER BY avg_attempts DESC;
717
+
718
+ -- Find tasks with many failed steps
719
+ SELECT t.id, t.name,
720
+ COUNT(ws.id) as total_steps,
721
+ COUNT(CASE WHEN ws.current_state = 'error' THEN 1 END) as failed_steps
722
+ FROM tasker_tasks t
723
+ JOIN tasker_workflow_steps ws ON ws.task_id = t.id
724
+ GROUP BY t.id, t.name
725
+ HAVING COUNT(CASE WHEN ws.current_state = 'error' THEN 1 END) > 0
726
+ ORDER BY failed_steps DESC;
727
+ ```
728
+
729
+ ## Getting Help
730
+
731
+ ### Documentation Resources
732
+ - **[Quick Start Guide](QUICK_START.md)** - Basic workflow creation
733
+ - **[Developer Guide](DEVELOPER_GUIDE.md)** - Comprehensive implementation guide
734
+ - **[Event System](EVENT_SYSTEM.md)** - Observability and monitoring setup
735
+ - **[Authentication](AUTH.md)** - Security configuration
736
+ - **[System Overview](OVERVIEW.md)** - Architecture and advanced configuration
737
+
738
+ ### Community & Support
739
+ - Check the GitHub issues for similar problems
740
+ - Review test examples in the `spec/` directory
741
+ - Examine example implementations in `spec/examples/`
742
+
743
+ ### Debug Mode
744
+ Enable verbose logging for deeper insight:
745
+
746
+ ```ruby
747
+ # config/environments/development.rb
748
+ Rails.application.configure do
749
+ config.log_level = :debug
750
+
751
+ # Enable SQL logging
752
+ ActiveRecord::Base.logger = Logger.new(STDOUT) if defined?(Rails::Console)
753
+ end
754
+ ```
755
+
756
+ Remember: Tasker is designed to be resilient and self-healing. Many transient issues will resolve themselves through the retry mechanism. Focus on patterns of persistent failures rather than isolated incidents.