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
data/docs/OVERVIEW.md ADDED
@@ -0,0 +1,552 @@
1
+ # System Overview
2
+
3
+ ## 🎉 PRODUCTION-READY WORKFLOW ORCHESTRATION ENGINE
4
+
5
+ **MASSIVE BREAKTHROUGH**: Registry System Consolidation **SUCCESSFULLY COMPLETED**! Tasker now features enterprise-grade registry architecture with 100% test success (1,479/1,479 tests passing) and comprehensive thread-safe operations.
6
+
7
+ ### 🎯 Current Status: ENTERPRISE READY
8
+ - ✅ **Registry System Consolidation Complete** - Thread-safe operations with structured logging
9
+ - ✅ **100% Test Success** - 1,479/1,479 tests passing with comprehensive validation
10
+ - ✅ **Thread-Safe Architecture** - All registry systems use `Concurrent::Hash` storage
11
+ - ✅ **Structured Logging** - Correlation IDs and JSON formatting for observability
12
+ - ✅ **Interface Validation** - Fail-fast validation with detailed error messages
13
+ - ✅ **Production Resilience** - Exponential backoff and comprehensive error handling
14
+
15
+ Tasker now features:
16
+
17
+ - **Enterprise Registry Architecture** - Thread-safe registry systems with structured logging
18
+ - **Unified Event System** - Single `Events::Publisher` with standardized event payloads
19
+ - **Complete Step Error Persistence** - Atomic transactions ensuring zero data loss
20
+ - **Production-Ready OpenTelemetry Integration** - Full observability stack with safety mechanisms
21
+ - **Memory-Safe Operation** - Database connection pooling and leak prevention
22
+ - **Developer-Friendly API** - Clean `EventPublisher` concern for easy integration
23
+
24
+ ## Registry System Architecture
25
+
26
+ Tasker's registry systems have been completely modernized with enterprise-grade capabilities:
27
+
28
+ ### Thread-Safe Registry Operations
29
+
30
+ All registry systems now use `Concurrent::Hash` for thread-safe operations:
31
+
32
+ ```ruby
33
+ # HandlerFactory - Thread-safe task handler management
34
+ Tasker::HandlerFactory.instance.register(
35
+ 'payment_processor',
36
+ PaymentHandler,
37
+ namespace_name: 'payments',
38
+ version: '2.1.0',
39
+ replace: true # Graceful conflict resolution
40
+ )
41
+
42
+ # PluginRegistry - Format-based plugin discovery
43
+ Tasker::Telemetry::PluginRegistry.register(
44
+ 'custom_exporter',
45
+ CustomExporter,
46
+ format: :json,
47
+ replace: true
48
+ )
49
+
50
+ # SubscriberRegistry - Event subscriber management
51
+ Tasker::Registry::SubscriberRegistry.register(
52
+ 'notification_subscriber',
53
+ NotificationSubscriber,
54
+ events: ['task.completed', 'task.failed']
55
+ )
56
+ ```
57
+
58
+ ### Structured Logging with Correlation IDs
59
+
60
+ Every registry operation includes comprehensive structured logging:
61
+
62
+ ```json
63
+ {
64
+ "timestamp": "2024-01-15T10:30:45Z",
65
+ "correlation_id": "tsk_abc123_def456",
66
+ "component": "handler_factory",
67
+ "message": "Registry item registered",
68
+ "environment": "production",
69
+ "tasker_version": "2.4.1",
70
+ "process_id": 12345,
71
+ "thread_id": "abc123",
72
+ "entity_type": "task_handler",
73
+ "entity_id": "payments/payment_processor/2.1.0",
74
+ "entity_class": "PaymentHandler",
75
+ "registry_name": "handler_factory",
76
+ "options": {
77
+ "namespace_name": "payments",
78
+ "version": "2.1.0",
79
+ "replace": true
80
+ },
81
+ "event_type": "registered"
82
+ }
83
+ ```
84
+
85
+ ### Interface Validation & Error Handling
86
+
87
+ Comprehensive validation prevents runtime errors:
88
+
89
+ ```ruby
90
+ # Fail-fast validation with detailed error messages
91
+ begin
92
+ Tasker::HandlerFactory.instance.register('invalid_handler', InvalidClass)
93
+ rescue Tasker::Registry::ValidationError => e
94
+ # Detailed error with context and suggestions
95
+ puts e.message
96
+ # => "Handler validation failed: InvalidClass does not implement required method 'process'.
97
+ # Required methods: [process, initialize_task!].
98
+ # Suggestion: Inherit from Tasker::TaskHandler::Base"
99
+ end
100
+ ```
101
+
102
+ ### Registry Statistics & Health Monitoring
103
+
104
+ Built-in monitoring and statistics:
105
+
106
+ ```ruby
107
+ # Comprehensive registry statistics
108
+ stats = Tasker::HandlerFactory.instance.stats
109
+ # => {
110
+ # total_handlers: 45,
111
+ # namespaces: ["payments", "inventory", "notifications"],
112
+ # versions: ["1.0.0", "1.1.0", "2.0.0"],
113
+ # thread_safe: true,
114
+ # last_registration: "2024-01-15T10:30:45Z"
115
+ # }
116
+
117
+ # Health check integration
118
+ health = Tasker::HandlerFactory.instance.health_check
119
+ # => { status: "healthy", registry_size: 45, thread_safe: true }
120
+ ```
121
+
122
+ ## Event System Architecture
123
+
124
+ Tasker features a comprehensive event-driven architecture that provides both deep observability and powerful developer integration capabilities:
125
+
126
+ ### Event Categories
127
+
128
+ - **Task Events** (`Tasker::Constants::TaskEvents`) - Task lifecycle events (started, completed, failed)
129
+ - **Step Events** (`Tasker::Constants::StepEvents`) - Step execution events with error context
130
+ - **Workflow Events** (`Tasker::Constants::WorkflowEvents`) - Orchestration and dependency management
131
+ - **Observability Events** (`Tasker::Constants::ObservabilityEvents`) - Performance monitoring and metrics
132
+
133
+ ### Developer-Friendly Event Discovery
134
+
135
+ The event system includes a comprehensive catalog for discovering and understanding events:
136
+
137
+ ```ruby
138
+ # Discover all available events
139
+ Tasker::Events.catalog.keys
140
+ # => ["task.started", "task.completed", "task.failed", "step.started", ...]
141
+
142
+ # Get detailed event information
143
+ Tasker::Events.event_info('task.completed')
144
+ # => {
145
+ # name: "task.completed",
146
+ # category: "task",
147
+ # description: "Fired when a task completes successfully",
148
+ # payload_schema: { task_id: String, execution_duration: Float },
149
+ # example_payload: { task_id: "task_123", execution_duration: 45.2 },
150
+ # fired_by: ["TaskFinalizer", "TaskHandler"]
151
+ # }
152
+ ```
153
+
154
+ ### Custom Event Subscribers
155
+
156
+ Create custom integrations with external services using the subscriber generator:
157
+
158
+ ```bash
159
+ # Generate a subscriber with specific events
160
+ rails generate tasker:subscriber notification --events task.completed task.failed step.failed
161
+ ```
162
+
163
+ This creates a complete subscriber class with automatic method routing:
164
+
165
+ ```ruby
166
+ class NotificationSubscriber < Tasker::Events::Subscribers::BaseSubscriber
167
+ subscribe_to 'task.completed', 'task.failed', 'step.failed'
168
+
169
+ def handle_task_completed(event)
170
+ task_id = safe_get(event, :task_id)
171
+ NotificationService.send_success_email(task_id: task_id)
172
+ end
173
+
174
+ def handle_task_failed(event)
175
+ task_id = safe_get(event, :task_id)
176
+ error_message = safe_get(event, :error_message, 'Unknown error')
177
+ AlertService.send_failure_alert(task_id: task_id, error: error_message)
178
+ end
179
+ end
180
+ ```
181
+
182
+ ### Publishing Events
183
+
184
+ ```ruby
185
+ class MyStepHandler
186
+ include Tasker::Concerns::EventPublisher
187
+
188
+ def handle(task, sequence, step)
189
+ # Clean step started event
190
+ publish_step_started(step)
191
+
192
+ # Your business logic here
193
+ result = perform_operation(task.context)
194
+ step.results = { data: result }
195
+
196
+ # Clean completion event with additional context
197
+ publish_step_completed(step, operation_count: result.size)
198
+ end
199
+ end
200
+ ```
201
+
202
+ ### Integration Examples
203
+
204
+ The system includes comprehensive integration examples in `spec/lib/tasker/events/subscribers/examples/`:
205
+
206
+ - **SentrySubscriber** - Error tracking with intelligent fingerprinting
207
+ - **PagerDutySubscriber** - Critical alerting with business logic filtering
208
+ - **SlackSubscriber** - Rich team notifications with environment routing
209
+ - **MetricsSubscriber** - Analytics and performance tracking
210
+ - **ComprehensiveSubscriber** - Multi-service integration patterns
211
+
212
+ For complete documentation, see [EVENT_SYSTEM.md](EVENT_SYSTEM.md).
213
+
214
+ ### OpenTelemetry Integration
215
+
216
+ Full observability stack including:
217
+
218
+ - **Database Query Monitoring** - PostgreSQL instrumentation with connection safety
219
+ - **Background Job Tracking** - Sidekiq, Redis, and concurrent processing
220
+ - **API Call Tracing** - HTTP requests with proper error handling
221
+ - **State Machine Transitions** - Complete audit trail of workflow state changes
222
+
223
+ For detailed telemetry configuration, see [TELEMETRY.md](TELEMETRY.md).
224
+
225
+ ## Example of a Configured Task Handler
226
+
227
+ Here's an example YAML file for an e-commerce API integration task handler:
228
+
229
+ ```yaml
230
+ ---
231
+ name: api_task/integration_yaml_example
232
+ module_namespace: ApiTask
233
+ task_handler_class: IntegrationYamlExample
234
+
235
+ default_dependent_system: ecommerce_system
236
+
237
+ named_steps:
238
+ - fetch_cart
239
+ - fetch_products
240
+ - validate_products
241
+ - create_order
242
+ - publish_event
243
+
244
+ schema:
245
+ type: object
246
+ required:
247
+ - cart_id
248
+ properties:
249
+ cart_id:
250
+ type: integer
251
+
252
+ step_templates:
253
+ - name: fetch_cart
254
+ description: Fetch cart details from e-commerce system
255
+ handler_class: ApiTask::StepHandler::CartFetchStepHandler
256
+ handler_config:
257
+ type: api
258
+ url: https://api.ecommerce.com/cart
259
+ params:
260
+ cart_id: 1
261
+
262
+ - name: fetch_products
263
+ description: Fetch product details from product catalog
264
+ handler_class: ApiTask::StepHandler::ProductsFetchStepHandler
265
+ handler_config:
266
+ type: api
267
+ url: https://api.ecommerce.com/products
268
+
269
+ - name: validate_products
270
+ description: Validate product availability
271
+ depends_on_steps:
272
+ - fetch_products
273
+ - fetch_cart
274
+ handler_class: ApiTask::StepHandler::ProductsValidateStepHandler
275
+
276
+ - name: create_order
277
+ description: Create order from validated cart
278
+ depends_on_step: validate_products
279
+ handler_class: ApiTask::StepHandler::CreateOrderStepHandler
280
+
281
+ - name: publish_event
282
+ description: Publish order created event
283
+ depends_on_step: create_order
284
+ handler_class: ApiTask::StepHandler::PublishEventStepHandler
285
+
286
+ environments:
287
+ development:
288
+ step_templates:
289
+ - name: fetch_cart
290
+ handler_config:
291
+ url: http://localhost:3000/api/cart
292
+ params:
293
+ cart_id: 1
294
+ debug: true
295
+
296
+ - name: fetch_products
297
+ handler_config:
298
+ url: http://localhost:3000/api/products
299
+ params:
300
+ debug: true
301
+
302
+ test:
303
+ step_templates:
304
+ - name: fetch_cart
305
+ handler_config:
306
+ url: http://test-api.ecommerce.com/cart
307
+ params:
308
+ cart_id: 1
309
+ test_mode: true
310
+
311
+ - name: fetch_products
312
+ handler_config:
313
+ url: http://test-api.ecommerce.com/products
314
+ params:
315
+ test_mode: true
316
+
317
+ production:
318
+ step_templates:
319
+ - name: fetch_cart
320
+ handler_config:
321
+ url: https://api.ecommerce.com/cart
322
+ params:
323
+ cart_id: 1
324
+ api_key: ${ECOMMERCE_API_KEY}
325
+
326
+ - name: fetch_products
327
+ handler_config:
328
+ url: https://api.ecommerce.com/products
329
+ params:
330
+ api_key: ${ECOMMERCE_API_KEY}
331
+ ```
332
+
333
+ ## Environment-Specific Configuration
334
+
335
+ Tasker supports environment-specific configuration overrides in YAML files. This allows you to:
336
+
337
+ 1. Define a base configuration that works across all environments
338
+ 2. Override specific settings for each environment (development, test, production)
339
+
340
+ The configuration is merged at runtime, with environment-specific settings taking precedence over the base configuration. This is particularly useful for:
341
+
342
+ - Using different API endpoints per environment
343
+ - Enabling debug mode in development
344
+ - Using test mode in test environments
345
+
346
+ To use environment-specific configuration:
347
+
348
+ 1. Add environment-specific sections to your YAML file
349
+ 2. Override only the settings that need to change per environment
350
+ 3. The TaskBuilder will automatically merge the configurations based on the current Rails environment
351
+
352
+ ## API Task Example
353
+
354
+ See the [spec/dummy/app/tasks/api_task](./spec/dummy/app/tasks/api_task) directory for an example of a task handler that processes an e-commerce order through a series of steps, interacting with external systems, and handling errors and retries. You can read more about the example [here](./spec/dummy/app/tasks/api_task/README.md).
355
+
356
+ ### API Routes
357
+
358
+ Tasker provides a RESTful API for managing tasks. Here are the available endpoints:
359
+
360
+ #### Tasks
361
+
362
+ - `GET /tasker/tasks` - List all tasks
363
+ - `POST /tasker/tasks` - Create and enqueue a new task
364
+ - `GET /tasker/tasks/{task_id}` - Get task details
365
+ - `PATCH/PUT /tasker/tasks/{task_id}` - Update task
366
+ - `DELETE /tasker/tasks/{task_id}` - Cancel task
367
+
368
+ #### Workflow Steps
369
+
370
+ - `GET /tasker/tasks/{task_id}/workflow_steps` - List steps for a task
371
+ - `GET /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Get step details
372
+ - `PATCH/PUT /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Update step
373
+ - `DELETE /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Cancel step
374
+
375
+ #### Task Diagrams
376
+
377
+ - `GET /tasker/tasks/{task_id}/diagram` - Get a diagram for a task
378
+
379
+ ### Creating a Task via API
380
+
381
+ Example of creating a task using curl:
382
+
383
+ ```bash
384
+ curl -X POST https://www.example.com/tasker/tasks \
385
+ -H "Content-Type: application/json" \
386
+ -d '{
387
+ "name": "api_integration_task",
388
+ "context": {
389
+ "cart_id": 123
390
+ },
391
+ "initiator": "web_interface",
392
+ "reason": "Process new order",
393
+ "source_system": "ecommerce",
394
+ "tags": ["order_processing", "api_integration"]
395
+ }'
396
+ ```
397
+
398
+ The request body must include:
399
+
400
+ - `name`: The name of the task handler to use
401
+ - `context`: A JSON object containing the task's context data
402
+ - `initiator`: Who/what initiated the task
403
+ - `reason`: Why the task was created
404
+ - `source_system`: The system that created the task
405
+ - `tags`: (Optional) Array of tags for categorization
406
+
407
+ ## Workflow & Retry Mechanism
408
+
409
+ ```mermaid
410
+ graph TD
411
+ Start([Task Initialization]) --> FindRoots[Find Root Steps]
412
+ FindRoots --> QueueRoots[Queue Root Steps]
413
+ QueueRoots --> ParallelExec{Parallel Execution}
414
+
415
+ ParallelExec --> RootA[Root Step A]
416
+ ParallelExec --> RootB[Root Step B]
417
+
418
+ RootA --> |Running| A[Step Ready for Execution]
419
+ RootB --> |Running| A
420
+
421
+ A --> B{Step Succeeded?}
422
+ B -->|Yes| C[Mark Step Complete]
423
+ B -->|No| D{Retryable Error?}
424
+ D -->|No| E[Mark as Failed]
425
+ D -->|Yes| F{Attempts < Max?}
426
+ F -->|No| E
427
+ F -->|Yes| G[Calculate Backoff]
428
+
429
+ G --> H[Apply Exponential Backoff with Jitter]
430
+ H --> I[Wait for Backoff Period]
431
+ I --> J[Increment Attempt Count]
432
+ J --> A
433
+
434
+ C --> K{Find Dependent Steps}
435
+ K --> DepCheck{For Each Dependent Step}
436
+ DepCheck --> DependenciesMet{All Dependencies\nComplete?}
437
+ DependenciesMet -->|Yes| QueueStep[Queue Step for Execution]
438
+ QueueStep --> ParallelExec
439
+ DependenciesMet -->|No| Wait[Step Remains Pending]
440
+
441
+ E --> TaskCheck{Any Step\nFailed?}
442
+ TaskCheck -->|Yes| FailTask[Mark Task as Failed]
443
+
444
+ Wait -.- DepMonitor[Dependency Monitor]
445
+ DepMonitor -.- DependenciesMet
446
+
447
+ C --> CompleteCheck{All Steps\nComplete?}
448
+ CompleteCheck -->|Yes| CompleteTask[Mark Task as Complete]
449
+ CompleteCheck -->|No| Continue[Continue Processing]
450
+
451
+ subgraph DAG Traversal
452
+ FindRoots
453
+ QueueRoots
454
+ ParallelExec
455
+ RootA
456
+ RootB
457
+ K
458
+ DepCheck
459
+ DependenciesMet
460
+ QueueStep
461
+ Wait
462
+ DepMonitor
463
+ end
464
+
465
+ subgraph Exponential Backoff
466
+ G
467
+ H
468
+ I
469
+ J
470
+ end
471
+
472
+ subgraph Task Status Management
473
+ E
474
+ TaskCheck
475
+ FailTask
476
+ CompleteCheck
477
+ CompleteTask
478
+ end
479
+
480
+ %% Initialize with dark borders and light fills
481
+ style Start fill:#ffffff,stroke:#444444,stroke-width:2px
482
+ style FindRoots fill:#f6f6f6,stroke:#444444
483
+ style QueueRoots fill:#f6f6f6,stroke:#444444
484
+ style ParallelExec fill:#f6f6f6,stroke:#444444,stroke-width:2px
485
+
486
+ %% Root steps (slightly lighter gray)
487
+ style RootA fill:#e8e8e8,stroke:#666666
488
+ style RootB fill:#e8e8e8,stroke:#666666
489
+
490
+ %% Standard flow components (white with medium gray borders)
491
+ style A fill:#ffffff,stroke:#666666
492
+ style B fill:#ffffff,stroke:#666666
493
+ style C fill:#ffffff,stroke:#666666
494
+ style D fill:#ffffff,stroke:#666666
495
+ style F fill:#ffffff,stroke:#666666
496
+ style CompleteCheck fill:#ffffff,stroke:#666666
497
+ style Continue fill:#ffffff,stroke:#666666
498
+ style TaskCheck fill:#ffffff,stroke:#666666
499
+
500
+ %% Exponential backoff (light gray)
501
+ style G fill:#f0f0f0,stroke:#666666
502
+ style H fill:#f0f0f0,stroke:#666666
503
+ style I fill:#f0f0f0,stroke:#666666
504
+ style J fill:#f0f0f0,stroke:#666666
505
+
506
+ %% DAG specific components (slightly darker gray)
507
+ style K fill:#e0e0e0,stroke:#444444
508
+ style DepCheck fill:#e0e0e0,stroke:#444444
509
+ style DependenciesMet fill:#e0e0e0,stroke:#444444,stroke-width:2px
510
+ style QueueStep fill:#e0e0e0,stroke:#444444
511
+ style Wait fill:#e0e0e0,stroke:#444444,stroke-dasharray: 5 5
512
+ style DepMonitor fill:#e0e0e0,stroke:#444444,stroke-dasharray: 5 5
513
+
514
+ %% Success and failure states (dark and medium grays)
515
+ style CompleteTask fill:#d0d0d0,stroke:#222222,stroke-width:2px
516
+ style FailTask fill:#b0b0b0,stroke:#222222,stroke-width:2px
517
+ style E fill:#b0b0b0,stroke:#222222
518
+ ```
519
+
520
+ The system implements advanced workflow traversal with parallel execution, sophisticated retry logic, and production-ready error handling:
521
+
522
+ ### 📖 Detailed Orchestration Documentation
523
+
524
+ For comprehensive understanding of Tasker's sophisticated orchestration patterns, including the dual finalization strategy and execution control flow, see:
525
+
526
+ **[Task Execution Control Flow](TASK_EXECUTION_CONTROL_FLOW.md)** - Deep dive into workflow orchestration patterns, synchronous vs asynchronous finalization, and the coordination between WorkflowCoordinator and TaskFinalizer components.
527
+
528
+ - **DAG Traversal & Parallel Execution**
529
+ - Initial identification and queueing of root steps (no dependencies)
530
+ - Parallel execution of independent steps at each level
531
+ - Dynamic discovery of next executable steps as dependencies are satisfied
532
+ - Continuous monitoring of dependency status to activate pending steps
533
+ - Automatic task completion detection when all steps are finished
534
+
535
+ - **Industry Standard Exponential Backoff**
536
+ - Base delay that doubles with each attempt: `base_delay * (2^attempt)`
537
+ - Random jitter to prevent thundering herd problems
538
+ - Configurable maximum delay cap (30 seconds)
539
+ - Respects server-provided Retry-After headers when available
540
+
541
+ - **Production-Ready Error Handling & Persistence**
542
+ - **Complete Step Error Persistence** - All step failures saved with full error context, backtrace, and attempt tracking
543
+ - **Atomic Transactions** - Save-first, transition-second pattern ensures data integrity and idempotency
544
+ - **Memory-Safe Processing** - Database connection pooling and explicit cleanup prevents connection leaks
545
+ - **Comprehensive Event Publishing** - Both success and error paths publish standardized events for observability
546
+ - **Zero Data Loss** - All step executions (success/error) properly persisted with complete context
547
+
548
+ - **Task Status Management**
549
+ - Real-time monitoring of all step statuses with unified event system
550
+ - Early failure detection and propagation with comprehensive error data
551
+ - Graceful handling of unrecoverable errors with full audit trail
552
+ - OpenTelemetry integration for complete observability