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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +443 -0
- data/Rakefile +10 -0
- data/app/controllers/tasker/analytics_controller.rb +179 -0
- data/app/controllers/tasker/application_controller.rb +45 -0
- data/app/controllers/tasker/graphql_controller.rb +193 -0
- data/app/controllers/tasker/handlers_controller.rb +217 -0
- data/app/controllers/tasker/health_controller.rb +229 -0
- data/app/controllers/tasker/metrics_controller.rb +111 -0
- data/app/controllers/tasker/page_sort.rb +97 -0
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/controllers/tasker/tasks_controller.rb +123 -0
- data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
- data/app/graphql/examples/all_tasks.graphql +22 -0
- data/app/graphql/examples/pending_tasks.graphql +23 -0
- data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
- data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
- data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
- data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
- data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
- data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
- data/app/graphql/tasker/graph_ql_types.rb +42 -0
- data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
- data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
- data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
- data/app/graphql/tasker/mutations/create_task.rb +52 -0
- data/app/graphql/tasker/mutations/update_step.rb +36 -0
- data/app/graphql/tasker/mutations/update_task.rb +41 -0
- data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
- data/app/graphql/tasker/queries/all_tasks.rb +23 -0
- data/app/graphql/tasker/queries/base_query.rb +9 -0
- data/app/graphql/tasker/queries/helpers.rb +16 -0
- data/app/graphql/tasker/queries/one_step.rb +24 -0
- data/app/graphql/tasker/queries/one_task.rb +18 -0
- data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
- data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
- data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
- data/app/jobs/tasker/application_job.rb +8 -0
- data/app/jobs/tasker/metrics_export_job.rb +252 -0
- data/app/jobs/tasker/task_runner_job.rb +224 -0
- data/app/models/tasker/annotation_type.rb +26 -0
- data/app/models/tasker/application_record.rb +70 -0
- data/app/models/tasker/dependent_system.rb +26 -0
- data/app/models/tasker/dependent_system_object_map.rb +64 -0
- data/app/models/tasker/diagram/edge.rb +106 -0
- data/app/models/tasker/diagram/flowchart.rb +137 -0
- data/app/models/tasker/diagram/node.rb +99 -0
- data/app/models/tasker/named_step.rb +41 -0
- data/app/models/tasker/named_task.rb +121 -0
- data/app/models/tasker/named_tasks_named_step.rb +82 -0
- data/app/models/tasker/step_dag_relationship.rb +65 -0
- data/app/models/tasker/step_readiness_status.rb +59 -0
- data/app/models/tasker/task.rb +424 -0
- data/app/models/tasker/task_annotation.rb +36 -0
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/task_execution_context.rb +29 -0
- data/app/models/tasker/task_namespace.rb +41 -0
- data/app/models/tasker/task_transition.rb +235 -0
- data/app/models/tasker/workflow_step.rb +461 -0
- data/app/models/tasker/workflow_step_edge.rb +94 -0
- data/app/models/tasker/workflow_step_transition.rb +434 -0
- data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
- data/app/serializers/tasker/handler_serializer.rb +109 -0
- data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
- data/app/serializers/tasker/task_serializer.rb +168 -0
- data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
- data/app/services/tasker/analytics_service.rb +409 -0
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/initializers/dry_struct.rb +11 -0
- data/config/initializers/statesman.rb +6 -0
- data/config/initializers/tasker_orchestration.rb +17 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +34 -0
- data/config/tasker/subscriptions/example_integrations.yml +67 -0
- data/config/tasker/system_events.yml +305 -0
- data/db/functions/calculate_dependency_levels_v01.sql +45 -0
- data/db/functions/get_analytics_metrics_v01.sql +137 -0
- data/db/functions/get_slowest_steps_v01.sql +82 -0
- data/db/functions/get_slowest_tasks_v01.sql +96 -0
- data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
- data/db/functions/get_step_readiness_status_v01.sql +139 -0
- data/db/functions/get_system_health_counts_v01.sql +108 -0
- data/db/functions/get_task_execution_context_v01.sql +108 -0
- data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
- data/db/init/schema.sql +2277 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1780 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2665 -0
- data/docs/EVENT_SYSTEM.md +637 -0
- data/docs/EXECUTION_CONFIGURATION.md +341 -0
- data/docs/FLOW_CHART.md +149 -0
- data/docs/HEALTH.md +542 -0
- data/docs/METRICS.md +731 -0
- data/docs/OPTIMIZATION_PLAN.md +1479 -0
- data/docs/OVERVIEW.md +552 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -0
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
- data/docs/TELEMETRY.md +795 -0
- data/docs/TROUBLESHOOTING.md +756 -0
- data/docs/TaskHandlerGenerator.html +255 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
- data/docs/Tasker/Analysis.html +117 -0
- data/docs/Tasker/AnalyticsController.html +450 -0
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
- data/docs/Tasker/AnalyticsService.html +2221 -0
- data/docs/Tasker/AnnotationType.html +137 -0
- data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
- data/docs/Tasker/ApplicationController.html +147 -0
- data/docs/Tasker/ApplicationJob.html +128 -0
- data/docs/Tasker/ApplicationRecord.html +378 -0
- data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
- data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
- data/docs/Tasker/Authentication/Coordinator.html +242 -0
- data/docs/Tasker/Authentication/Interface.html +560 -0
- data/docs/Tasker/Authentication/InterfaceError.html +124 -0
- data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
- data/docs/Tasker/Authentication.html +119 -0
- data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
- data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
- data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
- data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
- data/docs/Tasker/Authorization.html +582 -0
- data/docs/Tasker/CacheCapabilities.html +167 -0
- data/docs/Tasker/CacheStrategy.html +1297 -0
- data/docs/Tasker/Concerns/Authenticatable.html +116 -0
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
- data/docs/Tasker/Concerns/Authorizable.html +816 -0
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
- data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
- data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
- data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
- data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
- data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
- data/docs/Tasker/Concerns.html +117 -0
- data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
- data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
- data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
- data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
- data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
- data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
- data/docs/Tasker/Configuration.html +1669 -0
- data/docs/Tasker/ConfigurationError.html +143 -0
- data/docs/Tasker/ConfiguredTask.html +514 -0
- data/docs/Tasker/Constants/EventDefinitions.html +590 -0
- data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
- data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
- data/docs/Tasker/Constants/RegistryEvents.html +285 -0
- data/docs/Tasker/Constants/StepEvents.html +177 -0
- data/docs/Tasker/Constants/TaskEvents.html +167 -0
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
- data/docs/Tasker/Constants/TaskExecution.html +126 -0
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
- data/docs/Tasker/Constants/TaskFinalization.html +126 -0
- data/docs/Tasker/Constants/TaskStatuses.html +223 -0
- data/docs/Tasker/Constants/TestEvents.html +163 -0
- data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
- data/docs/Tasker/Constants.html +561 -0
- data/docs/Tasker/DependentSystem.html +137 -0
- data/docs/Tasker/DependentSystemObjectMap.html +250 -0
- data/docs/Tasker/DetectorRegistry.html +598 -0
- data/docs/Tasker/Diagram/Edge.html +1191 -0
- data/docs/Tasker/Diagram/Flowchart.html +1539 -0
- data/docs/Tasker/Diagram/Node.html +1165 -0
- data/docs/Tasker/Diagram.html +117 -0
- data/docs/Tasker/Engine.html +215 -0
- data/docs/Tasker/Error.html +139 -0
- data/docs/Tasker/Events/Bus.html +1226 -0
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
- data/docs/Tasker/Events/Catalog.html +1291 -0
- data/docs/Tasker/Events/CustomRegistry.html +943 -0
- data/docs/Tasker/Events/DefinitionLoader.html +575 -0
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
- data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
- data/docs/Tasker/Events/Publisher.html +365 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
- data/docs/Tasker/Events/Subscribers.html +117 -0
- data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
- data/docs/Tasker/Events.html +294 -0
- data/docs/Tasker/EventsGenerator.html +459 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
- data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
- data/docs/Tasker/Functions.html +117 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
- data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
- data/docs/Tasker/Generators.html +117 -0
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
- data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
- data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
- data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
- data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
- data/docs/Tasker/GraphQLTypes.html +130 -0
- data/docs/Tasker/GraphqlController.html +251 -0
- data/docs/Tasker/HandlerFactory.html +1518 -0
- data/docs/Tasker/HandlerSerializer.html +682 -0
- data/docs/Tasker/HandlersController.html +574 -0
- data/docs/Tasker/HashIdentityStrategy.html +278 -0
- data/docs/Tasker/Health/ReadinessChecker.html +712 -0
- data/docs/Tasker/Health/StatusChecker.html +653 -0
- data/docs/Tasker/Health.html +117 -0
- data/docs/Tasker/HealthController.html +523 -0
- data/docs/Tasker/IdentityStrategy.html +276 -0
- data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
- data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events.html +204 -0
- data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
- data/docs/Tasker/LifecycleEvents.html +799 -0
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
- data/docs/Tasker/Logging.html +115 -0
- data/docs/Tasker/MetricsController.html +293 -0
- data/docs/Tasker/MetricsExportJob.html +414 -0
- data/docs/Tasker/Mutations/BaseMutation.html +128 -0
- data/docs/Tasker/Mutations/CancelStep.html +219 -0
- data/docs/Tasker/Mutations/CancelTask.html +221 -0
- data/docs/Tasker/Mutations/CreateTask.html +243 -0
- data/docs/Tasker/Mutations/UpdateStep.html +243 -0
- data/docs/Tasker/Mutations/UpdateTask.html +243 -0
- data/docs/Tasker/Mutations.html +117 -0
- data/docs/Tasker/NamedStep.html +216 -0
- data/docs/Tasker/NamedTask.html +910 -0
- data/docs/Tasker/NamedTasksNamedStep.html +435 -0
- data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
- data/docs/Tasker/Orchestration/Coordinator.html +641 -0
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
- data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
- data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
- data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
- data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
- data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
- data/docs/Tasker/Orchestration.html +130 -0
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
- data/docs/Tasker/PageSort.html +247 -0
- data/docs/Tasker/PermanentError.html +518 -0
- data/docs/Tasker/ProceduralError.html +147 -0
- data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
- data/docs/Tasker/Queries/AllTasks.html +221 -0
- data/docs/Tasker/Queries/BaseQuery.html +128 -0
- data/docs/Tasker/Queries/Helpers.html +187 -0
- data/docs/Tasker/Queries/OneStep.html +225 -0
- data/docs/Tasker/Queries/OneTask.html +217 -0
- data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
- data/docs/Tasker/Queries/TasksByStatus.html +233 -0
- data/docs/Tasker/Queries.html +119 -0
- data/docs/Tasker/Railtie.html +124 -0
- data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
- data/docs/Tasker/Registry/EventPublisher.html +667 -0
- data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
- data/docs/Tasker/Registry/RegistrationError.html +132 -0
- data/docs/Tasker/Registry/RegistryError.html +139 -0
- data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
- data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
- data/docs/Tasker/Registry/ValidationError.html +132 -0
- data/docs/Tasker/Registry.html +119 -0
- data/docs/Tasker/RetryableError.html +515 -0
- data/docs/Tasker/StateMachine/Compatibility.html +282 -0
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
- data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
- data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
- data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
- data/docs/Tasker/StateMachine.html +602 -0
- data/docs/Tasker/StepDagRelationship.html +657 -0
- data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
- data/docs/Tasker/StepHandler/Api.html +884 -0
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
- data/docs/Tasker/StepHandler/Base.html +970 -0
- data/docs/Tasker/StepHandler.html +119 -0
- data/docs/Tasker/StepReadinessStatus.html +836 -0
- data/docs/Tasker/Task.html +2575 -0
- data/docs/Tasker/TaskAnnotation.html +137 -0
- data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
- data/docs/Tasker/TaskBuilder.html +764 -0
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
- data/docs/Tasker/TaskDiagram.html +548 -0
- data/docs/Tasker/TaskDiagramsController.html +240 -0
- data/docs/Tasker/TaskExecutionContext.html +469 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
- data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
- data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
- data/docs/Tasker/TaskHandler.html +271 -0
- data/docs/Tasker/TaskNamespace.html +312 -0
- data/docs/Tasker/TaskRunnerJob.html +406 -0
- data/docs/Tasker/TaskSerializer.html +474 -0
- data/docs/Tasker/TaskTransition.html +1517 -0
- data/docs/Tasker/TaskWorkflowSummary.html +988 -0
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema.html +384 -0
- data/docs/Tasker/TasksController.html +595 -0
- data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
- data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
- data/docs/Tasker/Telemetry/Events.html +115 -0
- data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
- data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
- data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
- data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
- data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
- data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
- data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
- data/docs/Tasker/Telemetry/Plugins.html +117 -0
- data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
- data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
- data/docs/Tasker/Telemetry.html +130 -0
- data/docs/Tasker/Types/AuthConfig.html +886 -0
- data/docs/Tasker/Types/BackoffConfig.html +1063 -0
- data/docs/Tasker/Types/BaseConfig.html +227 -0
- data/docs/Tasker/Types/CacheConfig.html +1731 -0
- data/docs/Tasker/Types/DatabaseConfig.html +388 -0
- data/docs/Tasker/Types/DependencyGraph.html +526 -0
- data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
- data/docs/Tasker/Types/EngineConfig.html +1181 -0
- data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
- data/docs/Tasker/Types/GraphEdge.html +517 -0
- data/docs/Tasker/Types/GraphMetadata.html +781 -0
- data/docs/Tasker/Types/GraphNode.html +694 -0
- data/docs/Tasker/Types/HealthConfig.html +784 -0
- data/docs/Tasker/Types/StepSequence.html +353 -0
- data/docs/Tasker/Types/StepTemplate.html +1193 -0
- data/docs/Tasker/Types/TaskRequest.html +1179 -0
- data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
- data/docs/Tasker/Types.html +154 -0
- data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
- data/docs/Tasker/WorkflowStep.html +2724 -0
- data/docs/Tasker/WorkflowStepEdge.html +304 -0
- data/docs/Tasker/WorkflowStepSerializer.html +305 -0
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
- data/docs/Tasker/WorkflowStepTransition.html +2201 -0
- data/docs/Tasker/WorkflowStepsController.html +462 -0
- data/docs/Tasker.html +452 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2375 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/events/migration_plan_outcomes.md +80 -0
- data/docs/file.README.html +541 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +541 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +9182 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/generators/tasker/authenticator_generator.rb +301 -0
- data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
- data/lib/generators/tasker/events_generator.rb +91 -0
- data/lib/generators/tasker/subscriber_generator.rb +107 -0
- data/lib/generators/tasker/task_handler_generator.rb +138 -0
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
- data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
- data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
- data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
- data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
- data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
- data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
- data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
- data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
- data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
- data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
- data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
- data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
- data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
- data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
- data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
- data/lib/tasker/authentication/coordinator.rb +78 -0
- data/lib/tasker/authentication/errors.rb +9 -0
- data/lib/tasker/authentication/interface.rb +36 -0
- data/lib/tasker/authentication/none_authenticator.rb +26 -0
- data/lib/tasker/authorization/base_coordinator.rb +112 -0
- data/lib/tasker/authorization/errors.rb +26 -0
- data/lib/tasker/authorization/resource_constants.rb +74 -0
- data/lib/tasker/authorization/resource_registry.rb +143 -0
- data/lib/tasker/authorization.rb +75 -0
- data/lib/tasker/cache_capabilities.rb +131 -0
- data/lib/tasker/cache_strategy.rb +469 -0
- data/lib/tasker/concerns/authenticatable.rb +41 -0
- data/lib/tasker/concerns/authorizable.rb +204 -0
- data/lib/tasker/concerns/controller_authorizable.rb +124 -0
- data/lib/tasker/concerns/event_publisher.rb +716 -0
- data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
- data/lib/tasker/concerns/state_machine_base.rb +218 -0
- data/lib/tasker/concerns/structured_logging.rb +387 -0
- data/lib/tasker/configuration.rb +325 -0
- data/lib/tasker/constants/event_definitions.rb +147 -0
- data/lib/tasker/constants/registry_events.rb +54 -0
- data/lib/tasker/constants.rb +417 -0
- data/lib/tasker/engine.rb +90 -0
- data/lib/tasker/errors.rb +90 -0
- data/lib/tasker/events/catalog.rb +432 -0
- data/lib/tasker/events/custom_registry.rb +175 -0
- data/lib/tasker/events/definition_loader.rb +199 -0
- data/lib/tasker/events/event_payload_builder.rb +461 -0
- data/lib/tasker/events/publisher.rb +149 -0
- data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
- data/lib/tasker/events/subscription_loader.rb +161 -0
- data/lib/tasker/events.rb +37 -0
- data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
- data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
- data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
- data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
- data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
- data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
- data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
- data/lib/tasker/functions/function_wrapper.rb +42 -0
- data/lib/tasker/functions.rb +12 -0
- data/lib/tasker/handler_factory.rb +322 -0
- data/lib/tasker/health/readiness_checker.rb +186 -0
- data/lib/tasker/health/status_checker.rb +203 -0
- data/lib/tasker/identity_strategy.rb +38 -0
- data/lib/tasker/logging/correlation_id_generator.rb +120 -0
- data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
- data/lib/tasker/orchestration/connection_builder.rb +122 -0
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
- data/lib/tasker/orchestration/coordinator.rb +119 -0
- data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
- data/lib/tasker/orchestration/plugin_integration.rb +124 -0
- data/lib/tasker/orchestration/response_processor.rb +168 -0
- data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
- data/lib/tasker/orchestration/step_executor.rb +941 -0
- data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
- data/lib/tasker/orchestration/task_finalizer.rb +564 -0
- data/lib/tasker/orchestration/task_initializer.rb +140 -0
- data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
- data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
- data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
- data/lib/tasker/orchestration.rb +45 -0
- data/lib/tasker/railtie.rb +9 -0
- data/lib/tasker/registry/base_registry.rb +177 -0
- data/lib/tasker/registry/event_publisher.rb +91 -0
- data/lib/tasker/registry/interface_validator.rb +140 -0
- data/lib/tasker/registry/statistics_collector.rb +381 -0
- data/lib/tasker/registry/subscriber_registry.rb +285 -0
- data/lib/tasker/registry.rb +22 -0
- data/lib/tasker/state_machine/step_state_machine.rb +508 -0
- data/lib/tasker/state_machine/task_state_machine.rb +192 -0
- data/lib/tasker/state_machine.rb +83 -0
- data/lib/tasker/step_handler/api.rb +410 -0
- data/lib/tasker/step_handler/base.rb +206 -0
- data/lib/tasker/task_builder.rb +432 -0
- data/lib/tasker/task_handler/class_methods.rb +324 -0
- data/lib/tasker/task_handler/instance_methods.rb +293 -0
- data/lib/tasker/task_handler/step_group.rb +182 -0
- data/lib/tasker/task_handler.rb +43 -0
- data/lib/tasker/telemetry/event_mapping.rb +126 -0
- data/lib/tasker/telemetry/event_router.rb +318 -0
- data/lib/tasker/telemetry/events/export_events.rb +38 -0
- data/lib/tasker/telemetry/export_coordinator.rb +497 -0
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
- data/lib/tasker/telemetry/log_backend.rb +224 -0
- data/lib/tasker/telemetry/metric_types.rb +368 -0
- data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
- data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
- data/lib/tasker/telemetry/plugin_registry.rb +333 -0
- data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
- data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
- data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
- data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
- data/lib/tasker/telemetry/trace_backend.rb +186 -0
- data/lib/tasker/telemetry.rb +59 -0
- data/lib/tasker/types/auth_config.rb +81 -0
- data/lib/tasker/types/backoff_config.rb +142 -0
- data/lib/tasker/types/cache_config.rb +257 -0
- data/lib/tasker/types/database_config.rb +39 -0
- data/lib/tasker/types/dependency_graph.rb +225 -0
- data/lib/tasker/types/dependency_graph_config.rb +149 -0
- data/lib/tasker/types/engine_config.rb +131 -0
- data/lib/tasker/types/execution_config.rb +289 -0
- data/lib/tasker/types/health_config.rb +84 -0
- data/lib/tasker/types/step_sequence.rb +24 -0
- data/lib/tasker/types/step_template.rb +63 -0
- data/lib/tasker/types/task_request.rb +60 -0
- data/lib/tasker/types/telemetry_config.rb +273 -0
- data/lib/tasker/types.rb +64 -0
- data/lib/tasker/version.rb +7 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +302 -0
- metadata +958 -0
@@ -0,0 +1,257 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for intelligent cache strategy settings
|
6
|
+
#
|
7
|
+
# This configuration provides strategic control over cache behavior while
|
8
|
+
# maintaining consistent infrastructure naming through constants.
|
9
|
+
#
|
10
|
+
# Strategic Design:
|
11
|
+
# - CONFIGURABLE: Algorithm parameters that vary by workload characteristics
|
12
|
+
# - CONFIGURABLE: Performance thresholds that vary by deployment environment
|
13
|
+
# - CONSTANTS: Infrastructure naming for consistency across deployments
|
14
|
+
#
|
15
|
+
# @example Basic usage
|
16
|
+
# config = CacheConfig.new(
|
17
|
+
# default_ttl: 600, # 10 minutes for stable data
|
18
|
+
# hit_rate_smoothing_factor: 0.8 # Less aggressive smoothing
|
19
|
+
# )
|
20
|
+
#
|
21
|
+
# @example Environment-specific tuning
|
22
|
+
# # Development environment - shorter TTLs for rapid iteration
|
23
|
+
# config = CacheConfig.new(
|
24
|
+
# default_ttl: 120, # 2 minutes
|
25
|
+
# adaptive_ttl_enabled: false, # Disable complexity
|
26
|
+
# performance_tracking_enabled: false # Reduce overhead
|
27
|
+
# )
|
28
|
+
#
|
29
|
+
# # Production environment - optimized for performance
|
30
|
+
# config = CacheConfig.new(
|
31
|
+
# default_ttl: 300, # 5 minutes
|
32
|
+
# hit_rate_smoothing_factor: 0.95, # Aggressive smoothing
|
33
|
+
# access_frequency_decay_rate: 0.98, # Slow decay
|
34
|
+
# adaptive_ttl_enabled: true, # Enable intelligence
|
35
|
+
# performance_tracking_enabled: true # Full observability
|
36
|
+
# )
|
37
|
+
#
|
38
|
+
# # High-performance environment - maximum efficiency
|
39
|
+
# config = CacheConfig.new(
|
40
|
+
# default_ttl: 600, # 10 minutes
|
41
|
+
# min_adaptive_ttl: 60, # 1 minute minimum
|
42
|
+
# max_adaptive_ttl: 7200, # 2 hours maximum
|
43
|
+
# cache_pressure_threshold: 0.9, # High threshold
|
44
|
+
# adaptive_calculation_interval: 15 # Frequent recalculation
|
45
|
+
# )
|
46
|
+
class CacheConfig < BaseConfig
|
47
|
+
transform_keys(&:to_sym)
|
48
|
+
|
49
|
+
# ====================
|
50
|
+
# CONFIGURABLE SETTINGS
|
51
|
+
# ====================
|
52
|
+
# These affect performance characteristics and should vary by deployment
|
53
|
+
|
54
|
+
# Default cache TTL in seconds
|
55
|
+
#
|
56
|
+
# Base time-to-live for cache entries before adaptive calculation.
|
57
|
+
# Fast-changing data might need 60-120s, stable data can use 300-600s.
|
58
|
+
#
|
59
|
+
# @!attribute [r] default_ttl
|
60
|
+
# @return [Integer] Default TTL in seconds (default: 300)
|
61
|
+
attribute :default_ttl, Types::Integer.default(300)
|
62
|
+
|
63
|
+
# Enable adaptive TTL calculation
|
64
|
+
#
|
65
|
+
# Whether to use intelligent TTL adjustment based on hit rates and generation time.
|
66
|
+
# Development environments might disable this for simplicity.
|
67
|
+
#
|
68
|
+
# @!attribute [r] adaptive_ttl_enabled
|
69
|
+
# @return [Boolean] Whether adaptive TTL is enabled (default: true)
|
70
|
+
attribute :adaptive_ttl_enabled, Types::Bool.default(true)
|
71
|
+
|
72
|
+
# Enable performance tracking
|
73
|
+
#
|
74
|
+
# Whether to track cache performance metrics for adaptive calculation.
|
75
|
+
# Adds small overhead but enables intelligent optimization.
|
76
|
+
#
|
77
|
+
# @!attribute [r] performance_tracking_enabled
|
78
|
+
# @return [Boolean] Whether performance tracking is enabled (default: true)
|
79
|
+
attribute :performance_tracking_enabled, Types::Bool.default(true)
|
80
|
+
|
81
|
+
# Hit rate smoothing factor for exponential moving average
|
82
|
+
#
|
83
|
+
# Controls how quickly hit rate adapts to new data.
|
84
|
+
# Higher values (0.95+) = slower adaptation, more stable
|
85
|
+
# Lower values (0.8-) = faster adaptation, more responsive
|
86
|
+
#
|
87
|
+
# @!attribute [r] hit_rate_smoothing_factor
|
88
|
+
# @return [Float] Smoothing factor (default: 0.9)
|
89
|
+
attribute :hit_rate_smoothing_factor, Types::Float.default(0.9)
|
90
|
+
|
91
|
+
# Access frequency decay rate for daily patterns
|
92
|
+
#
|
93
|
+
# Controls how access frequency decays over time.
|
94
|
+
# Higher values (0.98+) = slow decay, long memory
|
95
|
+
# Lower values (0.9-) = fast decay, short memory
|
96
|
+
#
|
97
|
+
# @!attribute [r] access_frequency_decay_rate
|
98
|
+
# @return [Float] Decay rate (default: 0.95)
|
99
|
+
attribute :access_frequency_decay_rate, Types::Float.default(0.95)
|
100
|
+
|
101
|
+
# Minimum adaptive TTL bound
|
102
|
+
#
|
103
|
+
# Absolute minimum TTL regardless of adaptive calculation.
|
104
|
+
# Prevents thrashing with very short cache times.
|
105
|
+
#
|
106
|
+
# @!attribute [r] min_adaptive_ttl
|
107
|
+
# @return [Integer] Minimum TTL in seconds (default: 30)
|
108
|
+
attribute :min_adaptive_ttl, Types::Integer.default(30)
|
109
|
+
|
110
|
+
# Maximum adaptive TTL bound
|
111
|
+
#
|
112
|
+
# Absolute maximum TTL regardless of adaptive calculation.
|
113
|
+
# Prevents stale data with very long cache times.
|
114
|
+
#
|
115
|
+
# @!attribute [r] max_adaptive_ttl
|
116
|
+
# @return [Integer] Maximum TTL in seconds (default: 3600)
|
117
|
+
attribute :max_adaptive_ttl, Types::Integer.default(3600)
|
118
|
+
|
119
|
+
# Dashboard cache TTL
|
120
|
+
#
|
121
|
+
# Specific TTL for dashboard and analytics queries.
|
122
|
+
# Should be shorter than default for responsive dashboards.
|
123
|
+
#
|
124
|
+
# @!attribute [r] dashboard_cache_ttl
|
125
|
+
# @return [Integer] Dashboard TTL in seconds (default: 120)
|
126
|
+
attribute :dashboard_cache_ttl, Types::Integer.default(120)
|
127
|
+
|
128
|
+
# Cache pressure threshold
|
129
|
+
#
|
130
|
+
# Utilization threshold that triggers cache pressure responses.
|
131
|
+
# Higher values = more aggressive caching, lower = more conservative.
|
132
|
+
#
|
133
|
+
# @!attribute [r] cache_pressure_threshold
|
134
|
+
# @return [Float] Pressure threshold (default: 0.8)
|
135
|
+
attribute :cache_pressure_threshold, Types::Float.default(0.8)
|
136
|
+
|
137
|
+
# Adaptive calculation interval
|
138
|
+
#
|
139
|
+
# How often to recalculate adaptive TTL values in seconds.
|
140
|
+
# Shorter intervals = more responsive, longer = more stable.
|
141
|
+
#
|
142
|
+
# @!attribute [r] adaptive_calculation_interval
|
143
|
+
# @return [Integer] Calculation interval in seconds (default: 30)
|
144
|
+
attribute :adaptive_calculation_interval, Types::Integer.default(30)
|
145
|
+
|
146
|
+
# ====================
|
147
|
+
# VALIDATION METHODS
|
148
|
+
# ====================
|
149
|
+
|
150
|
+
# Validate TTL configuration
|
151
|
+
#
|
152
|
+
# Ensures TTL values are positive and logical
|
153
|
+
# @return [Array<String>] Validation errors (empty if valid)
|
154
|
+
def validate_ttl_configuration
|
155
|
+
errors = []
|
156
|
+
|
157
|
+
errors << "default_ttl must be positive (got: #{default_ttl})" if default_ttl <= 0
|
158
|
+
|
159
|
+
errors << "min_adaptive_ttl must be positive (got: #{min_adaptive_ttl})" if min_adaptive_ttl <= 0
|
160
|
+
|
161
|
+
errors << "max_adaptive_ttl must be positive (got: #{max_adaptive_ttl})" if max_adaptive_ttl <= 0
|
162
|
+
|
163
|
+
if min_adaptive_ttl >= max_adaptive_ttl
|
164
|
+
errors << "min_adaptive_ttl (#{min_adaptive_ttl}) must be less than max_adaptive_ttl (#{max_adaptive_ttl})"
|
165
|
+
end
|
166
|
+
|
167
|
+
errors << "dashboard_cache_ttl must be positive (got: #{dashboard_cache_ttl})" if dashboard_cache_ttl <= 0
|
168
|
+
|
169
|
+
errors
|
170
|
+
end
|
171
|
+
|
172
|
+
# Validate algorithm parameters
|
173
|
+
#
|
174
|
+
# Ensures smoothing factors and thresholds are within valid ranges
|
175
|
+
# @return [Array<String>] Validation errors (empty if valid)
|
176
|
+
def validate_algorithm_parameters
|
177
|
+
errors = []
|
178
|
+
|
179
|
+
unless (0.0..1.0).cover?(hit_rate_smoothing_factor)
|
180
|
+
errors << "hit_rate_smoothing_factor must be between 0.0 and 1.0 (got: #{hit_rate_smoothing_factor})"
|
181
|
+
end
|
182
|
+
|
183
|
+
unless (0.0..1.0).cover?(access_frequency_decay_rate)
|
184
|
+
errors << "access_frequency_decay_rate must be between 0.0 and 1.0 (got: #{access_frequency_decay_rate})"
|
185
|
+
end
|
186
|
+
|
187
|
+
unless (0.0..1.0).cover?(cache_pressure_threshold)
|
188
|
+
errors << "cache_pressure_threshold must be between 0.0 and 1.0 (got: #{cache_pressure_threshold})"
|
189
|
+
end
|
190
|
+
|
191
|
+
if adaptive_calculation_interval <= 0
|
192
|
+
errors << "adaptive_calculation_interval must be positive (got: #{adaptive_calculation_interval})"
|
193
|
+
end
|
194
|
+
|
195
|
+
errors
|
196
|
+
end
|
197
|
+
|
198
|
+
# Validate entire configuration
|
199
|
+
#
|
200
|
+
# Runs all validation checks and raises if any errors found
|
201
|
+
# @raise [ArgumentError] If configuration is invalid
|
202
|
+
def validate!
|
203
|
+
errors = validate_ttl_configuration + validate_algorithm_parameters
|
204
|
+
|
205
|
+
return if errors.empty?
|
206
|
+
|
207
|
+
raise ArgumentError, "Invalid cache configuration: #{errors.join(', ')}"
|
208
|
+
end
|
209
|
+
|
210
|
+
# Calculate adaptive TTL based on performance data
|
211
|
+
#
|
212
|
+
# @param base_ttl [Integer] Base TTL to adjust
|
213
|
+
# @param hit_rate [Float] Current cache hit rate (0.0-1.0)
|
214
|
+
# @param generation_time [Float] Average generation time in seconds
|
215
|
+
# @param access_frequency [Integer] Access frequency count
|
216
|
+
# @return [Integer] Calculated adaptive TTL
|
217
|
+
def calculate_adaptive_ttl(base_ttl, hit_rate: 0.0, generation_time: 0.0, access_frequency: 0)
|
218
|
+
return base_ttl unless adaptive_ttl_enabled
|
219
|
+
|
220
|
+
# Start with base TTL as float for more precise calculations
|
221
|
+
adaptive_ttl = base_ttl.to_f
|
222
|
+
|
223
|
+
# Adjust based on hit rate (only if we have meaningful data)
|
224
|
+
if hit_rate > 0.8
|
225
|
+
adaptive_ttl *= 1.5 # High hit rate, extend TTL
|
226
|
+
elsif hit_rate > 0.0 && hit_rate < 0.3
|
227
|
+
adaptive_ttl *= 0.7 # Low hit rate, reduce TTL
|
228
|
+
end
|
229
|
+
|
230
|
+
# Adjust based on generation time (only if we have meaningful data)
|
231
|
+
if generation_time > 1.0
|
232
|
+
adaptive_ttl *= 1.3 # Expensive to generate, cache longer
|
233
|
+
elsif generation_time > 0.0 && generation_time < 0.1
|
234
|
+
adaptive_ttl *= 0.8 # Cheap to generate, cache shorter
|
235
|
+
end
|
236
|
+
|
237
|
+
# Adjust based on access frequency (only if we have meaningful data)
|
238
|
+
if access_frequency > 100
|
239
|
+
adaptive_ttl *= 1.2 # Frequently accessed, cache longer
|
240
|
+
elsif access_frequency.positive? && access_frequency < 5
|
241
|
+
adaptive_ttl *= 0.9 # Rarely accessed, cache shorter
|
242
|
+
end
|
243
|
+
|
244
|
+
# Convert to integer and apply bounds
|
245
|
+
adaptive_ttl.to_i.clamp(min_adaptive_ttl, max_adaptive_ttl)
|
246
|
+
end
|
247
|
+
|
248
|
+
# Check if cache is under pressure
|
249
|
+
#
|
250
|
+
# @param utilization [Float] Current cache utilization (0.0-1.0)
|
251
|
+
# @return [Boolean] Whether cache is under pressure
|
252
|
+
def cache_under_pressure?(utilization)
|
253
|
+
utilization >= cache_pressure_threshold
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for database settings
|
6
|
+
#
|
7
|
+
# This configuration handles database connection settings for Tasker.
|
8
|
+
# It provides the same functionality as the original DatabaseConfiguration but with
|
9
|
+
# dry-struct type safety and immutability.
|
10
|
+
#
|
11
|
+
# @example Basic usage
|
12
|
+
# config = DatabaseConfig.new(
|
13
|
+
# name: :secondary,
|
14
|
+
# enable_secondary_database: true
|
15
|
+
# )
|
16
|
+
#
|
17
|
+
# @example Default configuration
|
18
|
+
# config = DatabaseConfig.new
|
19
|
+
# # Uses default database, no secondary database
|
20
|
+
class DatabaseConfig < BaseConfig
|
21
|
+
transform_keys(&:to_sym)
|
22
|
+
|
23
|
+
# Database name or configuration key type that accepts strings or symbols
|
24
|
+
NameType = Types::String | Types::Symbol
|
25
|
+
|
26
|
+
# Named database configuration from database.yml
|
27
|
+
#
|
28
|
+
# @!attribute [r] name
|
29
|
+
# @return [String, Symbol, nil] Named database configuration key
|
30
|
+
attribute? :name, NameType.optional.default(nil)
|
31
|
+
|
32
|
+
# Whether to use a secondary database for Tasker models
|
33
|
+
#
|
34
|
+
# @!attribute [r] enable_secondary_database
|
35
|
+
# @return [Boolean] Whether to use secondary database
|
36
|
+
attribute :enable_secondary_database, Types::Bool.default(false)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Represents a single node in a dependency graph
|
6
|
+
#
|
7
|
+
# A node can represent either a step template (for template graphs)
|
8
|
+
# or a workflow step instance (for runtime graphs).
|
9
|
+
#
|
10
|
+
# @example Template graph node
|
11
|
+
# node = GraphNode.new(
|
12
|
+
# id: 'validate_payment',
|
13
|
+
# name: 'validate_payment',
|
14
|
+
# type: 'step_template',
|
15
|
+
# metadata: { retryable: true, retry_limit: 3 }
|
16
|
+
# )
|
17
|
+
#
|
18
|
+
# @example Runtime graph node
|
19
|
+
# node = GraphNode.new(
|
20
|
+
# id: '12345',
|
21
|
+
# name: 'validate_payment',
|
22
|
+
# type: 'workflow_step',
|
23
|
+
# state: 'complete',
|
24
|
+
# readiness_status: { ready_for_execution: false },
|
25
|
+
# metadata: { step_class: 'ValidatePaymentStep' }
|
26
|
+
# )
|
27
|
+
class GraphNode < Dry::Struct
|
28
|
+
transform_keys(&:to_sym)
|
29
|
+
|
30
|
+
# Unique identifier for this node
|
31
|
+
# For templates: step name
|
32
|
+
# For runtime: step ID as string
|
33
|
+
#
|
34
|
+
# @!attribute [r] id
|
35
|
+
# @return [String] Node identifier
|
36
|
+
attribute :id, Types::String
|
37
|
+
|
38
|
+
# Human-readable name of the node
|
39
|
+
#
|
40
|
+
# @!attribute [r] name
|
41
|
+
# @return [String] Node name
|
42
|
+
attribute :name, Types::String
|
43
|
+
|
44
|
+
# Type of node: 'step_template' or 'workflow_step'
|
45
|
+
#
|
46
|
+
# @!attribute [r] type
|
47
|
+
# @return [String] Node type
|
48
|
+
attribute :type, Types::String
|
49
|
+
|
50
|
+
# Current state (for runtime graphs only)
|
51
|
+
#
|
52
|
+
# @!attribute [r] state
|
53
|
+
# @return [String, nil] Current state of the step
|
54
|
+
attribute? :state, Types::String.optional
|
55
|
+
|
56
|
+
# Readiness status information (for runtime graphs only)
|
57
|
+
#
|
58
|
+
# @!attribute [r] readiness_status
|
59
|
+
# @return [Hash, nil] Step readiness information
|
60
|
+
attribute? :readiness_status, Types::Hash.optional
|
61
|
+
|
62
|
+
# Additional metadata about the node
|
63
|
+
#
|
64
|
+
# @!attribute [r] metadata
|
65
|
+
# @return [Hash] Node metadata
|
66
|
+
attribute :metadata, Types::Hash.default({}.freeze)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Represents a relationship between two nodes in a dependency graph
|
70
|
+
#
|
71
|
+
# @example Basic edge
|
72
|
+
# edge = GraphEdge.new(
|
73
|
+
# from: 'validate_payment',
|
74
|
+
# to: 'update_inventory',
|
75
|
+
# relationship: 'prerequisite'
|
76
|
+
# )
|
77
|
+
#
|
78
|
+
# @example Edge with metadata
|
79
|
+
# edge = GraphEdge.new(
|
80
|
+
# from: 'step_1',
|
81
|
+
# to: 'step_2',
|
82
|
+
# relationship: 'prerequisite',
|
83
|
+
# metadata: { weight: 1.5, critical_path: true }
|
84
|
+
# )
|
85
|
+
class GraphEdge < Dry::Struct
|
86
|
+
transform_keys(&:to_sym)
|
87
|
+
|
88
|
+
# Source node identifier
|
89
|
+
#
|
90
|
+
# @!attribute [r] from
|
91
|
+
# @return [String] Source node ID
|
92
|
+
attribute :from, Types::String
|
93
|
+
|
94
|
+
# Target node identifier
|
95
|
+
#
|
96
|
+
# @!attribute [r] to
|
97
|
+
# @return [String] Target node ID
|
98
|
+
attribute :to, Types::String
|
99
|
+
|
100
|
+
# Type of relationship between nodes
|
101
|
+
#
|
102
|
+
# @!attribute [r] relationship
|
103
|
+
# @return [String] Relationship type
|
104
|
+
attribute :relationship, Types::String.default('prerequisite')
|
105
|
+
|
106
|
+
# Additional metadata about the relationship
|
107
|
+
#
|
108
|
+
# @!attribute [r] metadata
|
109
|
+
# @return [Hash] Edge metadata
|
110
|
+
attribute :metadata, Types::Hash.default({}.freeze)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Metadata about the overall dependency graph
|
114
|
+
#
|
115
|
+
# @example Template graph metadata
|
116
|
+
# metadata = GraphMetadata.new(
|
117
|
+
# graph_type: 'template',
|
118
|
+
# handler_name: 'order_processing',
|
119
|
+
# total_nodes: 5,
|
120
|
+
# total_edges: 4
|
121
|
+
# )
|
122
|
+
#
|
123
|
+
# @example Runtime graph metadata
|
124
|
+
# metadata = GraphMetadata.new(
|
125
|
+
# graph_type: 'runtime',
|
126
|
+
# task_id: '12345',
|
127
|
+
# total_nodes: 5,
|
128
|
+
# total_edges: 4,
|
129
|
+
# execution_context: {
|
130
|
+
# ready_steps: 2,
|
131
|
+
# blocked_steps: 1,
|
132
|
+
# completed_steps: 2
|
133
|
+
# }
|
134
|
+
# )
|
135
|
+
class GraphMetadata < Dry::Struct
|
136
|
+
transform_keys(&:to_sym)
|
137
|
+
|
138
|
+
# Type of graph: 'template' or 'runtime'
|
139
|
+
#
|
140
|
+
# @!attribute [r] graph_type
|
141
|
+
# @return [String] Graph type
|
142
|
+
attribute :graph_type, Types::String
|
143
|
+
|
144
|
+
# Handler name (for template graphs)
|
145
|
+
#
|
146
|
+
# @!attribute [r] handler_name
|
147
|
+
# @return [String, nil] Task handler name
|
148
|
+
attribute? :handler_name, Types::String.optional
|
149
|
+
|
150
|
+
# Task ID (for runtime graphs)
|
151
|
+
#
|
152
|
+
# @!attribute [r] task_id
|
153
|
+
# @return [String, nil] Task identifier
|
154
|
+
attribute? :task_id, Types::String.optional
|
155
|
+
|
156
|
+
# Total number of nodes in the graph
|
157
|
+
#
|
158
|
+
# @!attribute [r] total_nodes
|
159
|
+
# @return [Integer] Node count
|
160
|
+
attribute :total_nodes, Types::Integer
|
161
|
+
|
162
|
+
# Total number of edges in the graph
|
163
|
+
#
|
164
|
+
# @!attribute [r] total_edges
|
165
|
+
# @return [Integer] Edge count
|
166
|
+
attribute :total_edges, Types::Integer
|
167
|
+
|
168
|
+
# Execution context information (for runtime graphs only)
|
169
|
+
#
|
170
|
+
# @!attribute [r] execution_context
|
171
|
+
# @return [Hash, nil] Runtime execution information
|
172
|
+
attribute? :execution_context, Types::Hash.optional
|
173
|
+
|
174
|
+
# Additional metadata
|
175
|
+
#
|
176
|
+
# @!attribute [r] additional_data
|
177
|
+
# @return [Hash] Additional graph metadata
|
178
|
+
attribute :additional_data, Types::Hash.default({}.freeze)
|
179
|
+
end
|
180
|
+
|
181
|
+
# Complete dependency graph structure
|
182
|
+
#
|
183
|
+
# @example Template dependency graph
|
184
|
+
# graph = DependencyGraph.new(
|
185
|
+
# nodes: [node1, node2],
|
186
|
+
# edges: [edge1],
|
187
|
+
# metadata: template_metadata
|
188
|
+
# )
|
189
|
+
#
|
190
|
+
# @example Runtime dependency graph
|
191
|
+
# graph = DependencyGraph.new(
|
192
|
+
# nodes: [runtime_node1, runtime_node2],
|
193
|
+
# edges: [runtime_edge1],
|
194
|
+
# metadata: runtime_metadata
|
195
|
+
# )
|
196
|
+
class DependencyGraph < BaseConfig
|
197
|
+
transform_keys(&:to_sym)
|
198
|
+
|
199
|
+
# All nodes in the dependency graph
|
200
|
+
#
|
201
|
+
# @!attribute [r] nodes
|
202
|
+
# @return [Array<GraphNode>] Graph nodes
|
203
|
+
attribute :nodes, Types::Array.of(GraphNode)
|
204
|
+
|
205
|
+
# All edges in the dependency graph
|
206
|
+
#
|
207
|
+
# @!attribute [r] edges
|
208
|
+
# @return [Array<GraphEdge>] Graph edges
|
209
|
+
attribute :edges, Types::Array.of(GraphEdge)
|
210
|
+
|
211
|
+
# Metadata about the overall graph
|
212
|
+
#
|
213
|
+
# @!attribute [r] metadata
|
214
|
+
# @return [GraphMetadata] Graph metadata
|
215
|
+
attribute :metadata, GraphMetadata
|
216
|
+
|
217
|
+
def initialize(*)
|
218
|
+
super
|
219
|
+
# Explicitly freeze arrays for immutability
|
220
|
+
nodes.freeze
|
221
|
+
edges.freeze
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for dependency graph calculation settings
|
6
|
+
#
|
7
|
+
# This configuration exposes previously hardcoded calculation constants
|
8
|
+
# used in dependency graph analysis and bottleneck detection.
|
9
|
+
#
|
10
|
+
# @example Basic usage
|
11
|
+
# config = DependencyGraphConfig.new(
|
12
|
+
# impact_multipliers: { downstream_weight: 5, blocked_weight: 15 }
|
13
|
+
# )
|
14
|
+
#
|
15
|
+
# @example With all options
|
16
|
+
# config = DependencyGraphConfig.new(
|
17
|
+
# impact_multipliers: {
|
18
|
+
# downstream_weight: 5,
|
19
|
+
# blocked_weight: 15,
|
20
|
+
# path_length_weight: 10,
|
21
|
+
# completed_penalty: 15,
|
22
|
+
# blocked_penalty: 25,
|
23
|
+
# error_penalty: 30,
|
24
|
+
# retry_penalty: 10
|
25
|
+
# },
|
26
|
+
# severity_multipliers: {
|
27
|
+
# error_state: 2.0,
|
28
|
+
# exhausted_retry_bonus: 0.5,
|
29
|
+
# dependency_issue: 1.2
|
30
|
+
# },
|
31
|
+
# penalty_constants: {
|
32
|
+
# retry_instability: 3,
|
33
|
+
# non_retryable: 10,
|
34
|
+
# exhausted_retry: 20
|
35
|
+
# },
|
36
|
+
# severity_thresholds: {
|
37
|
+
# critical: 100,
|
38
|
+
# high: 50,
|
39
|
+
# medium: 20
|
40
|
+
# },
|
41
|
+
# duration_estimates: {
|
42
|
+
# base_step_seconds: 30,
|
43
|
+
# error_penalty_seconds: 60,
|
44
|
+
# retry_penalty_seconds: 30
|
45
|
+
# }
|
46
|
+
# )
|
47
|
+
class DependencyGraphConfig < BaseConfig
|
48
|
+
transform_keys(&:to_sym)
|
49
|
+
|
50
|
+
# Impact multipliers for bottleneck scoring calculations
|
51
|
+
#
|
52
|
+
# These multipliers affect how different factors influence the final
|
53
|
+
# bottleneck impact scores in RuntimeGraphAnalyzer.
|
54
|
+
#
|
55
|
+
# @!attribute [r] impact_multipliers
|
56
|
+
# @return [Hash<Symbol, Integer>] Impact calculation multipliers
|
57
|
+
attribute :impact_multipliers, Types::Hash.schema(
|
58
|
+
downstream_weight: Types::Integer.default(5),
|
59
|
+
blocked_weight: Types::Integer.default(15),
|
60
|
+
path_length_weight: Types::Integer.default(10),
|
61
|
+
completed_penalty: Types::Integer.default(15),
|
62
|
+
blocked_penalty: Types::Integer.default(25),
|
63
|
+
error_penalty: Types::Integer.default(30),
|
64
|
+
retry_penalty: Types::Integer.default(10)
|
65
|
+
).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
|
66
|
+
.default({
|
67
|
+
downstream_weight: 5,
|
68
|
+
blocked_weight: 15,
|
69
|
+
path_length_weight: 10,
|
70
|
+
completed_penalty: 15,
|
71
|
+
blocked_penalty: 25,
|
72
|
+
error_penalty: 30,
|
73
|
+
retry_penalty: 10
|
74
|
+
}.freeze)
|
75
|
+
|
76
|
+
# Severity multipliers for state-based calculations
|
77
|
+
#
|
78
|
+
# These multipliers adjust impact scores based on step states
|
79
|
+
# and execution conditions.
|
80
|
+
#
|
81
|
+
# @!attribute [r] severity_multipliers
|
82
|
+
# @return [Hash<Symbol, Float>] State severity multipliers
|
83
|
+
attribute :severity_multipliers, Types::Hash.schema(
|
84
|
+
error_state: Types::Float.default(2.0),
|
85
|
+
exhausted_retry_bonus: Types::Float.default(0.5),
|
86
|
+
dependency_issue: Types::Float.default(1.2)
|
87
|
+
).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
|
88
|
+
.default({
|
89
|
+
error_state: 2.0,
|
90
|
+
exhausted_retry_bonus: 0.5,
|
91
|
+
dependency_issue: 1.2
|
92
|
+
}.freeze)
|
93
|
+
|
94
|
+
# Penalty constants for problematic step conditions
|
95
|
+
#
|
96
|
+
# These constants add penalty points for retry instability,
|
97
|
+
# non-retryable issues, and exhausted retry attempts.
|
98
|
+
#
|
99
|
+
# @!attribute [r] penalty_constants
|
100
|
+
# @return [Hash<Symbol, Integer>] Penalty calculation constants
|
101
|
+
attribute :penalty_constants, Types::Hash.schema(
|
102
|
+
retry_instability: Types::Integer.default(3),
|
103
|
+
non_retryable: Types::Integer.default(10),
|
104
|
+
exhausted_retry: Types::Integer.default(20)
|
105
|
+
).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
|
106
|
+
.default({
|
107
|
+
retry_instability: 3,
|
108
|
+
non_retryable: 10,
|
109
|
+
exhausted_retry: 20
|
110
|
+
}.freeze)
|
111
|
+
|
112
|
+
# Severity thresholds for impact score classification
|
113
|
+
#
|
114
|
+
# These thresholds determine when bottlenecks are classified as
|
115
|
+
# Critical, High, Medium, or Low severity.
|
116
|
+
#
|
117
|
+
# @!attribute [r] severity_thresholds
|
118
|
+
# @return [Hash<Symbol, Integer>] Severity classification thresholds
|
119
|
+
attribute :severity_thresholds, Types::Hash.schema(
|
120
|
+
critical: Types::Integer.default(100),
|
121
|
+
high: Types::Integer.default(50),
|
122
|
+
medium: Types::Integer.default(20)
|
123
|
+
).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
|
124
|
+
.default({
|
125
|
+
critical: 100,
|
126
|
+
high: 50,
|
127
|
+
medium: 20
|
128
|
+
}.freeze)
|
129
|
+
|
130
|
+
# Duration estimation constants for path analysis
|
131
|
+
#
|
132
|
+
# These constants are used for estimating execution times
|
133
|
+
# and calculating path durations.
|
134
|
+
#
|
135
|
+
# @!attribute [r] duration_estimates
|
136
|
+
# @return [Hash<Symbol, Integer>] Duration estimation constants in seconds
|
137
|
+
attribute :duration_estimates, Types::Hash.schema(
|
138
|
+
base_step_seconds: Types::Integer.default(30),
|
139
|
+
error_penalty_seconds: Types::Integer.default(60),
|
140
|
+
retry_penalty_seconds: Types::Integer.default(30)
|
141
|
+
).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
|
142
|
+
.default({
|
143
|
+
base_step_seconds: 30,
|
144
|
+
error_penalty_seconds: 60,
|
145
|
+
retry_penalty_seconds: 30
|
146
|
+
}.freeze)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|