Reference

Startup errors

Source SchedulerConfigurationBuilder/, JobRunnerExtensions.cs

Trax checks a host's configuration when the host builds and starts, before any worker takes a job. Each error below is an InvalidOperationException unless the table says otherwise.

Scheduler

CauseMessage starts
AddScheduler() with no data providerAddScheduler() requires a data provider (UsePostgres(), UseSqlite(), or UseInMemory()).
A duration or count outside its range, such as DeleteBatchSize = 20_000The scheduler configuration has values it cannot run with., then each value, for example AddMetadataCleanup: DeleteBatchSize must be between 1 and 10000. The ranges are on AddScheduler.
Manifest groups that depend on each other in a cycleCircular dependency detected among manifest groups
Two members of one manifest group stating different values for one group settingManifest group '<group>' is given two different <setting> values
A batch whose prune prefix covers another batch's manifests<batch> prunes manifests whose external ID starts with '<prefix>', which includes the manifests of <other batch>
A single Schedule whose external id falls inside a batch's prune<batch> prunes manifests whose external ID starts with '<prefix>', which includes '<externalId>', scheduled on its own.
ThenInclude() with no manifest before itThenInclude() must be called after Schedule(), Include(), or another ThenInclude().
Include() or IncludeMany() with no Schedule() before itInclude() must be called after Schedule(). (or IncludeMany())
A ThenIncludeMany() item with no DependsOnThenIncludeMany() requires DependsOn to be set on every ManifestItem.
An input whose type is not the one the train takesInput type mismatch: <train> expects input of type '<input>'
A train routed to two submittersTrain '<train>' is routed to multiple submitters
[TraxRemote] trains and no UseRemoteWorkers(), UseSqsWorkers() or UseLambdaWorkers()'<train>' is marked [TraxRemote], but this scheduler has no remote submitter to send it to
AddTraxWorker() on a host whose AddScheduler() already runs local workersThis host registers two local worker pools
A train whose chain asks a decider, with no AddDecisionRecording()Names the trains. See A host that does not record.

Runner

CauseMessage starts
UseTraxJobRunner() or UseTraxRunEndpoint() with no postureMapping the Trax runner endpoint '<route>' requires AddTraxJobRunner(runner => ...) with a SigningKey, an AuthorizationPolicy, or AllowUnsignedRequests().
A runner with a SigningKey on a host with no relational data provider and no nonce storeA Trax runner with a SigningKey keeps the nonces it accepts in the database

The postures are described in Runner authorization posture.

Surfaces a scheduler host often carries

CauseMessage starts
UseTraxApiDashboard() with no postureUseTraxApiDashboard() needs to know who may load the dashboard
ExposeOperationQueries() or ExposeOperationMutations() with no gateExposeOperationMutations() exposes scheduler-control mutations (...) but the GraphQL endpoint is not gated
GateOperations() with no policy or rolesGateOperations() needs a policy or roles
A do-not-use-in-production demo key outside DevelopmentAddTraxApiKeyAuth() registered a key containing 'do-not-use-in-production'

See also