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,637 @@
1
+ # Tasker Event System
2
+
3
+ ## Overview
4
+
5
+ Tasker features a comprehensive event-driven architecture that provides deep insights into task execution, workflow orchestration, and system behavior. The event system supports both **system events** (built-in workflow events) and **custom events** (business logic events), designed to be production-ready for observability and developer-friendly for building custom integrations.
6
+
7
+ ## Architecture
8
+
9
+ The Tasker event system consists of several key components working together:
10
+
11
+ ### Core Components
12
+
13
+ 1. **Events::Publisher** - Centralized event publishing using dry-events
14
+ 2. **EventPublisher Concern** - Clean interface for business logic (`publish_step_completed`, `publish_custom_event`)
15
+ 3. **EventPayloadBuilder** - Standardized payload creation for consistent data structures
16
+ 4. **Event Catalog** - Complete event discovery and documentation system (system + custom events)
17
+ 5. **BaseSubscriber** - Foundation for creating custom event subscribers
18
+ 6. **TelemetrySubscriber** - Production OpenTelemetry integration
19
+ 7. **CustomRegistry** - Registration and management of custom business events
20
+
21
+ ### Event Flow Architecture
22
+
23
+ ```mermaid
24
+ flowchart LR
25
+ subgraph Business["Business Logic"]
26
+ TaskHandler["Task Handler"]
27
+ StepLogic["Step Logic"]
28
+ Orchestration["Orchestration"]
29
+ StateMachine["State Machines"]
30
+ end
31
+
32
+ subgraph EventSystem["Event System"]
33
+ Publisher["Events::Publisher"]
34
+ PayloadBuilder["EventPayloadBuilder"]
35
+ Catalog["Event Catalog"]
36
+ CustomRegistry["CustomRegistry"]
37
+ end
38
+
39
+ subgraph Subscribers["Event Subscribers"]
40
+ Telemetry["TelemetrySubscriber"]
41
+ Custom["Custom Subscribers"]
42
+ Generated["Generated Subscribers"]
43
+ end
44
+
45
+ subgraph Tools["Developer Tools"]
46
+ Generator["Subscriber Generator"]
47
+ Examples["Integration Examples"]
48
+ Discovery["Event Discovery"]
49
+ end
50
+
51
+ TaskHandler -->|publish_step_completed| Publisher
52
+ TaskHandler -->|publish_custom_event| Publisher
53
+ StepLogic -->|publish_step_failed| Publisher
54
+ Orchestration -->|publish_workflow_event| Publisher
55
+ StateMachine -->|publish_task_event| Publisher
56
+
57
+ Publisher --> PayloadBuilder
58
+ Publisher --> Catalog
59
+ Publisher --> CustomRegistry
60
+ Publisher --> Telemetry
61
+ Publisher --> Custom
62
+ Publisher --> Generated
63
+
64
+ Generator --> Custom
65
+ Examples --> Custom
66
+ Discovery --> Catalog
67
+ ```
68
+
69
+ ---
70
+
71
+ ## System Events
72
+
73
+ System events are built-in events that track the core workflow execution lifecycle. These events are automatically published by Tasker as tasks and steps execute.
74
+
75
+ ### Task Events (`Tasker::Constants::TaskEvents`)
76
+
77
+ Task lifecycle events track the overall progress of workflow execution:
78
+
79
+ | Event | Description | Typical Payload |
80
+ |-------|-------------|-----------------|
81
+ | `INITIALIZE_REQUESTED` | Task creation and setup | `task_id`, `task_name`, `context` |
82
+ | `START_REQUESTED` | Task processing begins | `task_id`, `started_at` |
83
+ | `COMPLETED` | Task finished successfully | `task_id`, `execution_duration`, `step_count` |
84
+ | `FAILED` | Task encountered fatal error | `task_id`, `error_message`, `failed_step_id` |
85
+ | `RETRY_REQUESTED` | Task being retried | `task_id`, `retry_count`, `reason` |
86
+ | `CANCELLED` | Task manually cancelled | `task_id`, `cancelled_by`, `reason` |
87
+
88
+ ### Step Events (`Tasker::Constants::StepEvents`)
89
+
90
+ Step-level events provide detailed execution tracking:
91
+
92
+ | Event | Description | Typical Payload |
93
+ |-------|-------------|-----------------|
94
+ | `EXECUTION_REQUESTED` | Step queued for processing | `task_id`, `step_id`, `step_name` |
95
+ | `BEFORE_HANDLE` | Step about to execute | `task_id`, `step_id`, `attempt_number` |
96
+ | `HANDLE` | Step currently executing | `task_id`, `step_id`, `started_at` |
97
+ | `COMPLETED` | Step finished successfully | `task_id`, `step_id`, `execution_duration`, `results` |
98
+ | `FAILED` | Step encountered error | `task_id`, `step_id`, `error_message`, `exception_class`, `backtrace` |
99
+ | `RETRY_REQUESTED` | Step being retried | `task_id`, `step_id`, `attempt_number`, `retry_delay` |
100
+ | `MAX_RETRIES_REACHED` | Step exceeded retry limit | `task_id`, `step_id`, `final_error` |
101
+
102
+ ### Workflow Events (`Tasker::Constants::WorkflowEvents`)
103
+
104
+ Orchestration events track workflow coordination:
105
+
106
+ | Event | Description | Typical Payload |
107
+ |-------|-------------|-----------------|
108
+ | `TASK_STARTED` | Workflow orchestration begins | `task_id`, `total_steps` |
109
+ | `STEP_COMPLETED` | Individual step in workflow completed | `task_id`, `step_id`, `remaining_steps` |
110
+ | `VIABLE_STEPS_DISCOVERED` | Steps ready for execution identified | `task_id`, `step_ids`, `batch_size` |
111
+ | `NO_VIABLE_STEPS` | No executable steps found | `task_id`, `reason`, `blocked_steps` |
112
+ | `TASK_COMPLETED` | Entire workflow finished | `task_id`, `total_duration`, `success_rate` |
113
+
114
+ ### Observability Events (`Tasker::Constants::ObservabilityEvents`)
115
+
116
+ System-level monitoring events:
117
+
118
+ | Event | Description | Typical Payload |
119
+ |-------|-------------|-----------------|
120
+ | `Task::ENQUEUE` | Task queued for background processing | `task_id`, `queue_name`, `enqueued_at` |
121
+ | `Task::START` | Task processing started by worker | `task_id`, `worker_id`, `started_at` |
122
+ | `Step::PROCESSING` | Step processing metrics | `task_id`, `step_id`, `processing_time`, `memory_usage` |
123
+
124
+ ---
125
+
126
+ ## Custom Events
127
+
128
+ Custom events allow you to define and publish business logic events from your step handlers that can be consumed by subscribers for monitoring, alerting, and notifications. Unlike system events, custom events are declaratively defined by developers and automatically registered.
129
+
130
+ ### Creating Custom Events
131
+
132
+ Tasker provides multiple ways to define custom events with **automatic registration**:
133
+
134
+ #### 1. Class-Based Event Configuration (Recommended)
135
+
136
+ ```ruby
137
+ class OrderFulfillmentStep < Tasker::StepHandler::Base
138
+ # Define custom events - these are automatically registered when the handler loads
139
+ def self.custom_event_configuration
140
+ [
141
+ {
142
+ name: 'order.fulfilled',
143
+ description: 'Order has been fulfilled and shipped'
144
+ },
145
+ {
146
+ name: 'order.shipment_delayed',
147
+ description: 'Order shipment has been delayed'
148
+ }
149
+ ]
150
+ end
151
+
152
+ def process(task, sequence, step)
153
+ order = find_order(step.inputs['order_id'])
154
+
155
+ # ... fulfillment logic ...
156
+
157
+ # Publish custom event for subscribers (PagerDuty, Sentry, Slack, etc.)
158
+ publish_custom_event('order.fulfilled', {
159
+ order_id: order.id,
160
+ customer_id: order.customer_id,
161
+ total_amount: order.total,
162
+ priority: order.priority_level,
163
+ fulfillment_center: order.fulfillment_center,
164
+ shipping_method: order.shipping_method
165
+ })
166
+ end
167
+ end
168
+ ```
169
+
170
+ #### 2. YAML-Based Event Configuration
171
+
172
+ You can also define custom events in your step template YAML files:
173
+
174
+ ```yaml
175
+ # config/step_templates/order_fulfillment.yml
176
+ name: "Order Fulfillment Step"
177
+ description: "Processes and fulfills customer orders"
178
+ handler_class: "OrderFulfillmentStep"
179
+ custom_events:
180
+ - name: "order.fulfilled"
181
+ description: "Order has been fulfilled and shipped"
182
+ - name: "order.shipment_delayed"
183
+ description: "Order shipment has been delayed"
184
+ ```
185
+
186
+ #### Key Features
187
+
188
+ - **Automatic Registration**: Events are registered when step handlers load - no manual registration required
189
+ - **Namespace Validation**: Events must be namespaced (e.g., `order.fulfilled`)
190
+ - **Conflict Prevention**: Cannot conflict with system events
191
+ - **Reserved Namespaces**: `task.*`, `step.*`, `workflow.*`, `observability.*`, `test.*` are reserved
192
+ - **Complete Integration**: Custom events appear in all discovery methods
193
+ - **Subscriber Compatibility**: Work seamlessly with existing subscriber patterns
194
+
195
+ ### Publishing Custom Events
196
+
197
+ From within your step handlers, use the `publish_custom_event` method:
198
+
199
+ ```ruby
200
+ class PaymentRiskAssessmentStep < Tasker::StepHandler::Base
201
+ def self.custom_event_configuration
202
+ [
203
+ {
204
+ name: 'payment.risk_flagged',
205
+ description: 'Payment flagged for manual review due to risk factors'
206
+ }
207
+ ]
208
+ end
209
+
210
+ def process(task, sequence, step)
211
+ risk_assessment = assess_payment_risk(step.inputs)
212
+
213
+ if risk_assessment.flagged?
214
+ # Publish the pre-declared custom event
215
+ publish_custom_event('payment.risk_flagged', {
216
+ payment_id: risk_assessment.payment_id,
217
+ risk_score: risk_assessment.score,
218
+ flagged_reasons: risk_assessment.reasons,
219
+ requires_manual_review: true,
220
+ customer_tier: risk_assessment.customer_tier
221
+ })
222
+ end
223
+ end
224
+ end
225
+ ```
226
+
227
+ ### Custom Event Best Practices
228
+
229
+ #### Event Naming
230
+ - Use namespace.action format: `order.fulfilled`, `payment.processed`
231
+ - Choose descriptive, business-focused names
232
+ - Avoid technical implementation details in names
233
+
234
+ #### Event Payloads
235
+ Include relevant business context:
236
+
237
+ ```ruby
238
+ # Good: Business context
239
+ publish_custom_event('order.cancelled', {
240
+ order_id: order.id,
241
+ customer_id: order.customer_id,
242
+ cancellation_reason: 'customer_request',
243
+ refund_amount: order.refundable_amount,
244
+ cancelled_at: Time.current,
245
+ order_status_before_cancellation: order.previous_status
246
+ })
247
+
248
+ # Avoid: Too technical or sparse
249
+ publish_custom_event('order.cancelled', {
250
+ id: 123,
251
+ status: 'cancelled'
252
+ })
253
+ ```
254
+
255
+ ---
256
+
257
+ ## Event Discovery
258
+
259
+ The event catalog provides comprehensive discovery for both system and custom events:
260
+
261
+ ### Using the Event Catalog
262
+
263
+ ```ruby
264
+ # Discover all available events
265
+ puts Tasker::Events.catalog.keys # System events only
266
+ puts Tasker::Events.complete_catalog.keys # System + custom events
267
+ puts Tasker::Events.custom_events.keys # Custom events only
268
+
269
+ # Search and filter events
270
+ puts Tasker::Events.search_events('payment') # Search by name/description
271
+ puts Tasker::Events.events_by_namespace('order') # Get events by namespace
272
+
273
+ # Get detailed event information
274
+ event_info = Tasker::Events.event_info('task.completed')
275
+ puts event_info
276
+ # => {
277
+ # name: "task.completed",
278
+ # category: "task",
279
+ # description: "Fired when a task completes successfully",
280
+ # payload_schema: { task_id: String, execution_duration: Float },
281
+ # example_payload: { task_id: "task_123", execution_duration: 45.2 },
282
+ # fired_by: ["TaskFinalizer", "TaskHandler"]
283
+ # }
284
+
285
+ # Browse events by category
286
+ puts Tasker::Events.task_events.keys # System task events
287
+ puts Tasker::Events.step_events.keys # System step events
288
+ puts Tasker::Events.workflow_events.keys # System workflow events
289
+ puts Tasker::Events.custom_events.keys # Custom business events
290
+ ```
291
+
292
+ ### Event Documentation Structure
293
+
294
+ Each event in the catalog includes:
295
+
296
+ - **Name**: Standard event identifier
297
+ - **Category**: Event classification (task, step, workflow, observability, custom)
298
+ - **Description**: Human-readable explanation of when the event fires
299
+ - **Payload Schema**: Expected data structure with types
300
+ - **Example Payload**: Real example of event data
301
+ - **Fired By**: Components that publish this event
302
+
303
+ ### Print Complete Catalog
304
+
305
+ ```ruby
306
+ # Print complete catalog (includes custom events)
307
+ Tasker::Events::Catalog.print_catalog
308
+
309
+ # Or in Rails console:
310
+ pp Tasker::Events.custom_events
311
+ ```
312
+
313
+ ---
314
+
315
+ ## Architectural Distinction: Event Subscribers vs Workflow Steps
316
+
317
+ **Critical Design Principle**: Event subscribers should handle **"collateral" or "secondary" logic** - operations that support observability, monitoring, and alerting but are not core business requirements.
318
+
319
+ ### Use Event Subscribers For:
320
+ - **Operational Observability**: Logging, metrics, telemetry, traces
321
+ - **Alerting & Monitoring**: Sentry errors, PagerDuty alerts, operational notifications
322
+ - **Analytics**: Business intelligence, usage tracking, performance monitoring
323
+ - **External Integrations**: Non-critical third-party service notifications
324
+
325
+ ### Use Workflow Steps For:
326
+ - **Business-Critical Operations**: Actions that must succeed for the workflow to be considered complete
327
+ - **Operations Requiring**:
328
+ - **Idempotency**: Can be safely retried without side effects
329
+ - **Retryability**: Built-in retry logic with exponential backoff
330
+ - **Explicit Lifecycle Tracking**: Success/failure states that matter to the business
331
+ - **Transactional Integrity**: Operations that need to be rolled back on failure
332
+
333
+ ### Examples of Proper Usage
334
+
335
+ **✅ Event Subscriber (Collateral Concerns)**:
336
+ ```ruby
337
+ class ObservabilitySubscriber < Tasker::Events::Subscribers::BaseSubscriber
338
+ subscribe_to 'order.fulfilled'
339
+
340
+ def handle_order_fulfilled(event)
341
+ # Operational logging and analytics - if these fail, the order is still fulfilled
342
+ AnalyticsService.track_fulfillment(order_id: safe_get(event, :order_id))
343
+ Rails.logger.info "Order #{safe_get(event, :order_id)} fulfilled"
344
+ end
345
+ end
346
+ ```
347
+
348
+ **✅ Workflow Step (Business Logic)**:
349
+ ```yaml
350
+ # config/tasker/tasks/order_process.yaml
351
+ - name: send_confirmation_email
352
+ description: Send order confirmation email to customer
353
+ depends_on_step: process_payment
354
+ handler_class: OrderProcess::StepHandler::SendConfirmationEmailHandler
355
+ default_retryable: true
356
+ default_retry_limit: 3
357
+ ```
358
+
359
+ **❌ Wrong - Business Logic in Event Subscriber**:
360
+ ```ruby
361
+ # DON'T DO THIS - Critical email sending belongs in a workflow step
362
+ def handle_order_fulfilled(event)
363
+ CustomerService.send_confirmation_email(safe_get(event, :order_id)) # Critical business action!
364
+ end
365
+ ```
366
+
367
+ **Rule of Thumb**: If the operation must succeed for the workflow to be considered complete, it should be a workflow step. If it's supporting infrastructure (logging, monitoring, analytics), it should be an event subscriber.
368
+
369
+ ## Creating Custom Subscribers
370
+
371
+ ### Using the Subscriber Generator
372
+
373
+ The easiest way to create custom event subscribers is using the built-in generator:
374
+
375
+ ```bash
376
+ # Generate a subscriber with specific events (works for both system and custom events)
377
+ rails generate tasker:subscriber notification --events task.completed task.failed order.fulfilled
378
+
379
+ # Generate a basic subscriber (add events manually)
380
+ rails generate tasker:subscriber sentry
381
+ ```
382
+
383
+ This creates:
384
+ - A subscriber class extending `Tasker::Events::Subscribers::BaseSubscriber`
385
+ - Automatic method routing based on event names
386
+ - Complete RSpec test file with realistic patterns
387
+ - Clear usage instructions and documentation
388
+
389
+ ### Manual Subscriber Creation
390
+
391
+ You can also create subscribers manually to handle both system and custom events:
392
+
393
+ ```ruby
394
+ class ObservabilitySubscriber < Tasker::Events::Subscribers::BaseSubscriber
395
+ # Subscribe to system and custom events for operational monitoring
396
+ subscribe_to 'task.completed', 'task.failed', 'order.fulfilled', 'payment.risk_flagged'
397
+
398
+ # Handle system events - operational monitoring only
399
+ def handle_task_completed(event)
400
+ task_id = safe_get(event, :task_id)
401
+ task_name = safe_get(event, :task_name, 'unknown')
402
+ execution_duration = safe_get(event, :execution_duration, 0)
403
+
404
+ # Operational logging and metrics (collateral concerns)
405
+ Rails.logger.info "Task completed: #{task_name} (#{task_id}) in #{execution_duration}s"
406
+ StatsD.histogram('tasker.task.duration', execution_duration, tags: ["task:#{task_name}"])
407
+ end
408
+
409
+ def handle_task_failed(event)
410
+ task_id = safe_get(event, :task_id)
411
+ error_message = safe_get(event, :error_message, 'Unknown error')
412
+
413
+ # Operational alerting (collateral concerns)
414
+ Sentry.capture_message("Task failed: #{task_id}", level: 'error', extra: { error: error_message })
415
+ PagerDutyService.trigger_alert(
416
+ summary: "Tasker workflow failed",
417
+ severity: 'error',
418
+ details: { task_id: task_id, error: error_message }
419
+ )
420
+ end
421
+
422
+ # Handle custom business events - monitoring and analytics only
423
+ def handle_order_fulfilled(event)
424
+ order_id = safe_get(event, :order_id)
425
+ customer_id = safe_get(event, :customer_id)
426
+
427
+ # Analytics and operational monitoring (collateral concerns)
428
+ AnalyticsService.track_order_fulfillment(order_id, customer_id)
429
+ Rails.logger.info "Order fulfilled: #{order_id} for customer #{customer_id}"
430
+ end
431
+
432
+ def handle_payment_risk_flagged(event)
433
+ risk_score = safe_get(event, :risk_score, 0)
434
+
435
+ # Operational alerting for high-risk scenarios (collateral concern)
436
+ if risk_score > 0.8
437
+ PagerDutyService.trigger_alert(
438
+ summary: "High-risk payment detected",
439
+ severity: 'warning',
440
+ details: event
441
+ )
442
+ end
443
+
444
+ # Analytics tracking (collateral concern)
445
+ AnalyticsService.track_payment_risk(safe_get(event, :payment_id), risk_score)
446
+ end
447
+ end
448
+ ```
449
+
450
+ ### BaseSubscriber Features
451
+
452
+ The `BaseSubscriber` class provides:
453
+
454
+ - **Automatic Method Routing**: `task.completed` → `handle_task_completed`, `order.fulfilled` → `handle_order_fulfilled`
455
+ - **Safe Data Access**: `safe_get(event, :key, default)` with type checking
456
+ - **Error Handling**: Graceful handling of malformed events
457
+ - **Logging**: Automatic debug logging for event processing
458
+ - **Flexible Subscription**: Subscribe to specific events or event patterns
459
+
460
+ ### Subscriber Integration Examples
461
+
462
+ Your subscribers can handle both system and custom events seamlessly:
463
+
464
+ ```ruby
465
+ class PagerDutySubscriber < Tasker::Events::BaseSubscriber
466
+ # Listen to both system failures and custom high-priority events
467
+ subscribe_to 'task.failed', 'step.failed', 'payment.risk_flagged', 'inventory.restock_needed'
468
+
469
+ def handle_task_failed(event)
470
+ # Handle system event
471
+ trigger_pagerduty_alert(
472
+ summary: "Tasker task failed: #{safe_get(event, :task_id)}",
473
+ severity: 'error',
474
+ details: event
475
+ )
476
+ end
477
+
478
+ def handle_payment_risk_flagged(event)
479
+ # Handle custom business logic event
480
+ if safe_get(event, :risk_score, 0) > 80
481
+ trigger_pagerduty_alert(
482
+ summary: "High-risk payment requires review",
483
+ severity: 'error',
484
+ details: event
485
+ )
486
+ end
487
+ end
488
+ end
489
+ ```
490
+
491
+ ```ruby
492
+ class SlackSubscriber < Tasker::Events::BaseSubscriber
493
+ subscribe_to 'task.completed', 'order.fulfilled'
494
+
495
+ def handle_task_completed(event)
496
+ # Handle system event
497
+ send_slack_message(
498
+ channel: '#ops',
499
+ text: "✅ Task #{safe_get(event, :task_id)} completed in #{safe_get(event, :execution_duration)}s"
500
+ )
501
+ end
502
+
503
+ def handle_order_fulfilled(event)
504
+ # Handle custom business event
505
+ send_slack_message(
506
+ channel: '#fulfillment',
507
+ text: "🎉 Order #{safe_get(event, :order_id)} fulfilled!",
508
+ attachments: [{
509
+ color: 'good',
510
+ fields: [
511
+ { title: 'Customer', value: safe_get(event, :customer_id), short: true },
512
+ { title: 'Amount', value: "$#{safe_get(event, :total_amount)}", short: true },
513
+ { title: 'Priority', value: safe_get(event, :priority), short: true }
514
+ ]
515
+ }]
516
+ )
517
+ end
518
+ end
519
+ ```
520
+
521
+ ---
522
+
523
+ ## Development & Testing
524
+
525
+ ### Viewing Events
526
+
527
+ ```ruby
528
+ # Print complete catalog (includes custom events)
529
+ Tasker::Events::Catalog.print_catalog
530
+
531
+ # Or in Rails console:
532
+ pp Tasker::Events.custom_events
533
+ pp Tasker::Events.complete_catalog
534
+ ```
535
+
536
+ ### Testing Both System and Custom Events
537
+
538
+ ```ruby
539
+ RSpec.describe OrderFulfillmentStep do
540
+ it 'publishes custom order fulfilled event' do
541
+ step = create_step_with_inputs(order_id: 'ORDER123')
542
+
543
+ expect(subject).to receive(:publish_custom_event).with(
544
+ 'order.fulfilled',
545
+ hash_including(
546
+ order_id: 'ORDER123',
547
+ customer_id: be_present
548
+ )
549
+ )
550
+
551
+ subject.process(task, sequence, step)
552
+ end
553
+ end
554
+
555
+ RSpec.describe ObservabilitySubscriber do
556
+ it 'handles both system and custom events for monitoring' do
557
+ # Test system event handling - operational logging and metrics
558
+ system_event = { task_id: 'TASK123', task_name: 'order_process', execution_duration: 45.2 }
559
+ expect(Rails.logger).to receive(:info).with(/Task completed/)
560
+ expect(StatsD).to receive(:histogram).with('tasker.task.duration', 45.2, anything)
561
+ subject.handle_task_completed(system_event)
562
+
563
+ # Test custom event handling - analytics and operational monitoring
564
+ custom_event = { order_id: 'ORDER123', customer_id: 'CUSTOMER456' }
565
+ expect(AnalyticsService).to receive(:track_order_fulfillment).with('ORDER123', 'CUSTOMER456')
566
+ expect(Rails.logger).to receive(:info).with(/Order fulfilled/)
567
+ subject.handle_order_fulfilled(custom_event)
568
+ end
569
+ end
570
+ ```
571
+
572
+ ---
573
+
574
+ ## Integration Examples
575
+
576
+ Tasker includes comprehensive integration examples demonstrating real-world usage patterns for both system and custom events. These examples are located in `spec/lib/tasker/events/subscribers/examples/` and serve as both documentation and implementation templates.
577
+
578
+ ### Available Examples
579
+
580
+ #### SentrySubscriber - Error Tracking Integration
581
+ ```ruby
582
+ class SentrySubscriber < Tasker::Events::Subscribers::BaseSubscriber
583
+ subscribe_to 'task.failed', 'step.failed', 'payment.risk_flagged'
584
+
585
+ def handle_task_failed(event)
586
+ # Handle system event
587
+ task_id = safe_get(event, :task_id)
588
+ error_message = safe_get(event, :error_message, 'Unknown error')
589
+
590
+ sentry_data = {
591
+ level: 'error',
592
+ fingerprint: ['tasker', 'task_failed', task_id],
593
+ tags: {
594
+ task_id: task_id,
595
+ component: 'tasker',
596
+ environment: Rails.env
597
+ },
598
+ extra: {
599
+ error_message: error_message,
600
+ timestamp: Time.current.iso8601
601
+ }
602
+ }
603
+
604
+ Rails.logger.info "Would report to Sentry: #{sentry_data}"
605
+ end
606
+
607
+ def handle_payment_risk_flagged(event)
608
+ # Handle custom business event
609
+ payment_id = safe_get(event, :payment_id)
610
+ risk_score = safe_get(event, :risk_score, 0)
611
+
612
+ sentry_data = {
613
+ level: 'warning',
614
+ fingerprint: ['payment', 'risk_flagged', payment_id],
615
+ tags: {
616
+ payment_id: payment_id,
617
+ risk_score: risk_score,
618
+ component: 'payment_system'
619
+ }
620
+ }
621
+
622
+ Rails.logger.info "Would report payment risk to Sentry: #{sentry_data}"
623
+ end
624
+ end
625
+ ```
626
+
627
+ ### Summary
628
+
629
+ The Tasker Event System provides a unified approach to handling both system workflow events and custom business logic events:
630
+
631
+ - **System Events**: Automatically published by Tasker for observability and monitoring
632
+ - **Custom Events**: Declaratively defined by developers for business logic integration
633
+ - **Unified Discovery**: Single catalog and search interface for all events
634
+ - **Seamless Subscribers**: Same subscriber patterns work for both event types
635
+ - **Production Ready**: Built for real-world monitoring, alerting, and notification scenarios
636
+
637
+ This comprehensive event system enables you to build robust, observable, and well-integrated workflows that provide visibility into both technical execution and business processes.