メインコンテンツまでスキップ
バージョン: 2.0

Server Config Reference

This page documents the operator-facing DW_* environment variable contract for the Durable Workflow server image. Use it when building deployment templates, reviewing production configuration, or migrating older WORKFLOW_* / ACTIVITY_* names to the v2 server contract.

The server still consumes ordinary Laravel runtime settings such as DB_*, REDIS_*, QUEUE_CONNECTION, and CACHE_STORE. Those runtime infrastructure variables are listed separately because they are deployment plumbing, not Durable Workflow API controls.

How The Contract Is Enforced​

The server repository keeps the canonical contract in config/dw-contract.php. At container boot, php artisan env:audit warns when it sees unknown DW_* variables or legacy names. Set DW_ENV_AUDIT_STRICT=1 when you want the entrypoint to fail instead of booting with warnings.

DW_ENV_AUDIT_STRICT=1
DW_AUTH_DRIVER=token
DW_ADMIN_TOKEN="${DW_ADMIN_TOKEN}"
DW_OPERATOR_TOKEN="${DW_OPERATOR_TOKEN}"
DW_WORKER_TOKEN="${DW_WORKER_TOKEN}"

Legacy names are fallback-only. Prefer the DW_* name in every new deployment, and treat a legacy warning as migration debt even when the server still honors the value.

Server Identity And Mode​

VariableDefaultPurposeLegacy alias
DW_MODEserviceServer mode: service makes external workers poll; embedded dispatches locally through the Laravel queue.WORKFLOW_SERVER_MODE
DW_SERVER_IDgethostname()Unique server instance identifier used in lease ownership and worker registration.WORKFLOW_SERVER_ID
DW_SERVER_TOPOLOGY_SHAPEstandalone_serverAdvertised topology shape for cluster discovery, such as embedded, standalone_server, or split_control_execution.WORKFLOW_SERVER_TOPOLOGY_SHAPE
DW_SERVER_PROCESS_CLASSserver_http_nodeAdvertised process class for this node within the selected topology shape, such as server_http_node, worker_node, or scheduler_node.WORKFLOW_SERVER_PROCESS_CLASS
DW_SERVER_KEYgenerated at container bootOptional server-internal runtime key. Docker images generate one automatically when unset.-
DW_DEFAULT_NAMESPACEdefaultNamespace used when a request omits the namespace header.WORKFLOW_SERVER_DEFAULT_NAMESPACE
DW_TASK_DISPATCH_MODEunsetOverrides workflows.v2.task_dispatch_mode; in service mode the server defaults to poll unless you set a different value.WORKFLOW_V2_TASK_DISPATCH_MODE
DW_WORKFLOW_MEMO_MIGRATION_RECOVERYunsetOne-run MySQL recovery proof for an unrecorded memo rewrite: raw-json or envelope-prefix:<last-converted-id>.WORKFLOW_SERVER_WORKFLOW_MEMO_MIGRATION_RECOVERY
DW_EXTERNAL_EXECUTOR_CONFIG_PATHunsetPath to a durable-workflow.external-executor.config JSON file for external executor handler mappings.WORKFLOW_SERVER_EXTERNAL_EXECUTOR_CONFIG_PATH
DW_EXTERNAL_EXECUTOR_CONFIG_OVERLAYunsetOverlay name from the external executor config file to apply before server validation and discovery.WORKFLOW_SERVER_EXTERNAL_EXECUTOR_CONFIG_OVERLAY

Authentication​

VariableDefaultPurposeLegacy alias
DW_AUTH_PROVIDERunsetLaravel-resolvable class implementing App\Contracts\AuthProvider.WORKFLOW_SERVER_AUTH_PROVIDER
DW_AUTH_DRIVERtokenAuth driver: none, token, or signature.WORKFLOW_SERVER_AUTH_DRIVER
DW_AUTH_TOKENunsetSingle shared bearer token when no role-scoped token is configured.WORKFLOW_SERVER_AUTH_TOKEN
DW_SIGNATURE_KEYunsetShared HMAC signature key when no role-scoped signature key is configured.WORKFLOW_SERVER_SIGNATURE_KEY
DW_WORKER_TOKENunsetBearer token for worker registration, polling, heartbeats, and completions.WORKFLOW_SERVER_WORKER_TOKEN
DW_OPERATOR_TOKENunsetBearer token for read and operator control-plane actions.WORKFLOW_SERVER_OPERATOR_TOKEN
DW_ADMIN_TOKENunsetBearer token for namespace, retention, and other administrative mutations.WORKFLOW_SERVER_ADMIN_TOKEN
DW_PRINCIPAL_TOKENSunsetJSON token map for named bearer-token principals. Each entry supplies token, subject, roles, optional tenant, label, and non-secret claims.WORKFLOW_SERVER_PRINCIPAL_TOKENS
DW_WORKER_SIGNATURE_KEYunsetHMAC key for worker-role requests when using signature auth.WORKFLOW_SERVER_WORKER_SIGNATURE_KEY
DW_OPERATOR_SIGNATURE_KEYunsetHMAC key for operator-role requests when using signature auth.WORKFLOW_SERVER_OPERATOR_SIGNATURE_KEY
DW_ADMIN_SIGNATURE_KEYunsetHMAC key for admin-role requests when using signature auth.WORKFLOW_SERVER_ADMIN_SIGNATURE_KEY
DW_AUTH_BACKWARD_COMPATIBLEtrueHonor shared DW_AUTH_TOKEN / DW_SIGNATURE_KEY as a fallback when a role-scoped credential is missing.WORKFLOW_SERVER_AUTH_BACKWARD_COMPATIBLE

Use role-scoped credentials for production. DW_AUTH_DRIVER=none is only for local smoke work because every endpoint becomes reachable without a bearer token or signature.

Use DW_PRINCIPAL_TOKENS when audit trails need stable actor subjects rather than role labels. The server derives the recorded principal from the matched token entry; clients cannot override it with request payloads or headers.

Command Attribution​

These settings let a trusted gateway preserve caller metadata in durable command history. Leave DW_TRUST_FORWARDED_ATTRIBUTION_HEADERS=false unless the server is behind a gateway that strips untrusted client-supplied headers.

VariableDefaultPurposeLegacy alias
DW_TRUST_FORWARDED_ATTRIBUTION_HEADERSfalseRecord forwarded caller/auth headers into workflow command history.WORKFLOW_SERVER_TRUST_FORWARDED_ATTRIBUTION_HEADERS
DW_CALLER_TYPE_HEADERX-Workflow-Caller-TypeHeader carrying forwarded caller type.WORKFLOW_SERVER_CALLER_TYPE_HEADER
DW_CALLER_LABEL_HEADERX-Workflow-Caller-LabelHeader carrying forwarded caller label.WORKFLOW_SERVER_CALLER_LABEL_HEADER
DW_AUTH_STATUS_HEADERX-Workflow-Auth-StatusHeader carrying forwarded auth status.WORKFLOW_SERVER_AUTH_STATUS_HEADER
DW_AUTH_METHOD_HEADERX-Workflow-Auth-MethodHeader carrying forwarded auth method.WORKFLOW_SERVER_AUTH_METHOD_HEADER

Worker Polling And Admission​

These values control long-poll timing, wake coordination, server-side admission caps, and bounded task dispatch budgets.

VariableDefaultPurposeLegacy alias
DW_WORKER_POLL_TIMEOUT30Seconds the server holds a poll open waiting for a task.WORKFLOW_SERVER_WORKER_POLL_TIMEOUT
DW_WORKER_POLL_INTERVAL_MS1000Milliseconds between internal scans while a poll is held open.WORKFLOW_SERVER_WORKER_POLL_INTERVAL_MS
DW_WORKER_POLL_SIGNAL_CHECK_INTERVAL_MS100Milliseconds between wake-signal checks while a poll is held open.WORKFLOW_SERVER_WORKER_POLL_SIGNAL_CHECK_INTERVAL_MS
DW_POLLING_CACHE_PATHstorage/framework/cache/server-polling/<APP_ENV>Directory for worker-poll coordination state when using file-backed polling cache.WORKFLOW_SERVER_POLLING_CACHE_PATH
DW_WAKE_SIGNAL_TTL_SECONDSmax(DW_WORKER_POLL_TIMEOUT + 5, 60)TTL for per-queue wake signals that short-circuit a pending poll.WORKFLOW_SERVER_WAKE_SIGNAL_TTL_SECONDS
DW_WORKER_LONG_POLL_MAX_CONCURRENTunset; derived for PHP_CLI_SERVER_WORKERSOptional cap for concurrent held workflow/activity worker long-poll waits on this server node. Query-task polls use a separate wait budget.WORKFLOW_SERVER_WORKER_LONG_POLL_MAX_CONCURRENT
DW_WORKER_LONG_POLL_RESERVED_HTTP_WORKERS2PHP CLI server workers reserved for health and control-plane requests when deriving the workflow/activity long-poll wait cap.WORKFLOW_SERVER_WORKER_LONG_POLL_RESERVED_HTTP_WORKERS
DW_MAX_TASKS_PER_POLL1Maximum tasks returned per worker poll.WORKFLOW_SERVER_MAX_TASKS_PER_POLL
DW_SQLITE_CLAIM_LOCK_TTL_SECONDS10Seconds the SQLite quickstart backend holds the cache-backed worker poll claim gate before the lock expires.WORKFLOW_SERVER_SQLITE_CLAIM_LOCK_TTL_SECONDS
DW_SQLITE_CLAIM_LOCK_WAIT_SECONDS5Seconds SQLite worker poll claims wait for the cache-backed claim gate before returning backend lock pressure.WORKFLOW_SERVER_SQLITE_CLAIM_LOCK_WAIT_SECONDS
DW_WORKFLOW_TASK_MAX_ACTIVE_LEASES_PER_QUEUEunsetActive workflow-task lease cap per namespace/task queue.WORKFLOW_SERVER_WORKFLOW_TASK_MAX_ACTIVE_LEASES_PER_QUEUE
DW_WORKFLOW_TASK_MAX_ACTIVE_LEASES_PER_NAMESPACEunsetActive workflow-task lease cap across all queues in a namespace.WORKFLOW_SERVER_WORKFLOW_TASK_MAX_ACTIVE_LEASES_PER_NAMESPACE
DW_WORKFLOW_TASK_MAX_DISPATCHES_PER_MINUTEunsetPer-minute workflow-task dispatch cap per namespace/task queue.WORKFLOW_SERVER_WORKFLOW_TASK_MAX_DISPATCHES_PER_MINUTE
DW_WORKFLOW_TASK_MAX_DISPATCHES_PER_MINUTE_PER_NAMESPACEunsetPer-minute workflow-task dispatch cap across a namespace.WORKFLOW_SERVER_WORKFLOW_TASK_MAX_DISPATCHES_PER_MINUTE_PER_NAMESPACE
DW_ACTIVITY_TASK_MAX_ACTIVE_LEASES_PER_QUEUEunsetActive activity-task lease cap per namespace/task queue.WORKFLOW_SERVER_ACTIVITY_TASK_MAX_ACTIVE_LEASES_PER_QUEUE
DW_ACTIVITY_TASK_MAX_ACTIVE_LEASES_PER_NAMESPACEunsetActive activity-task lease cap across all queues in a namespace.WORKFLOW_SERVER_ACTIVITY_TASK_MAX_ACTIVE_LEASES_PER_NAMESPACE
DW_ACTIVITY_TASK_MAX_DISPATCHES_PER_MINUTEunsetPer-minute activity-task dispatch cap per namespace/task queue.WORKFLOW_SERVER_ACTIVITY_TASK_MAX_DISPATCHES_PER_MINUTE
DW_ACTIVITY_TASK_MAX_DISPATCHES_PER_MINUTE_PER_NAMESPACEunsetPer-minute activity-task dispatch cap across a namespace.WORKFLOW_SERVER_ACTIVITY_TASK_MAX_DISPATCHES_PER_MINUTE_PER_NAMESPACE
DW_TASK_QUEUE_ADMISSION_OVERRIDES{}JSON overrides keyed by namespace:task_queue, namespace:*, task_queue, or * for active leases, dispatch rate, namespace caps, and downstream budget groups.WORKFLOW_SERVER_TASK_QUEUE_ADMISSION_OVERRIDES
DW_DUE_TIMER_RECOVERY_SCAN_LIMIT5Maximum due service-mode timer tasks recovered per worker poll pass.WORKFLOW_SERVER_DUE_TIMER_RECOVERY_SCAN_LIMIT
DW_EXPIRED_WORKFLOW_TASK_RECOVERY_SCAN_LIMIT5Maximum expired workflow tasks recovered per pass.WORKFLOW_SERVER_EXPIRED_WORKFLOW_TASK_RECOVERY_SCAN_LIMIT
DW_EXPIRED_WORKFLOW_TASK_RECOVERY_TTL_SECONDS5Minimum seconds between expired-task recovery passes per queue.WORKFLOW_SERVER_EXPIRED_WORKFLOW_TASK_RECOVERY_TTL_SECONDS

Sticky execution has no standalone server-image environment variables. See Sticky Execution for the sticky-cache lifecycle, worker protocol fields, replay modes, and diagnostics.

Example admission override:

{
"production:billing": {
"workflow_tasks": {
"max_active_leases": 50,
"max_dispatches_per_minute": 600
},
"activity_tasks": {
"max_active_leases": 200
}
},
"production:*": {
"workflow_tasks": {
"max_active_leases_per_namespace": 500
}
}
}

Worker Protocol And Query Transport​

VariableDefaultPurposeLegacy alias
DW_WORKER_PROTOCOL_VERSIONWorkerProtocolVersion::VERSIONWorker-protocol version advertised on worker-plane responses.WORKFLOW_SERVER_WORKER_PROTOCOL_VERSION
DW_HISTORY_PAGE_SIZE_DEFAULTWorkerProtocolVersion::DEFAULT_HISTORY_PAGE_SIZEDefault page size for worker history reads.WORKFLOW_SERVER_HISTORY_PAGE_SIZE_DEFAULT
DW_HISTORY_PAGE_SIZE_MAXWorkerProtocolVersion::MAX_HISTORY_PAGE_SIZEMaximum page size honored on worker history reads.WORKFLOW_SERVER_HISTORY_PAGE_SIZE_MAX
DW_UPDATE_VALIDATION_TIMEOUT10Seconds the control plane waits for a synchronous pre-accept update validator result.WORKFLOW_SERVER_UPDATE_VALIDATION_TIMEOUT
DW_UPDATE_VALIDATION_LEASE_TIMEOUT5Seconds an update-validation task lease remains owned before a replacement validator-capable worker may retry it.WORKFLOW_SERVER_UPDATE_VALIDATION_LEASE_TIMEOUT
DW_QUERY_TASK_TIMEOUTDW_WORKER_POLL_TIMEOUTSeconds the control plane waits for a query task response from the worker.WORKFLOW_SERVER_QUERY_TASK_TIMEOUT
DW_QUERY_TASK_LEASE_TIMEOUTDW_WORKFLOW_TASK_TIMEOUTLease timeout for ephemeral query tasks handed to workers.WORKFLOW_SERVER_QUERY_TASK_LEASE_TIMEOUT
DW_QUERY_TASK_TTL_SECONDS180How long the server retains query-task result rows before reaping them.WORKFLOW_SERVER_QUERY_TASK_TTL_SECONDS
DW_QUERY_TASK_MAX_PENDING_PER_QUEUE1024Maximum pending cache-backed query tasks per namespace/task queue before new queries are rejected.WORKFLOW_SERVER_QUERY_TASK_MAX_PENDING_PER_QUEUE
DW_QUERY_TASK_POLL_TIMEOUT5Maximum seconds each idle query-task worker poll waits before rechecking workflow-task pressure and control-plane availability.WORKFLOW_SERVER_QUERY_TASK_POLL_TIMEOUT
DW_QUERY_TASK_POLL_MAX_CONCURRENTunset; derived for PHP_CLI_SERVER_WORKERSOptional cap for concurrent held idle query-task worker long-poll waits on this server node. Pending query tasks can still be claimed immediately before an idle poll waits.WORKFLOW_SERVER_QUERY_TASK_POLL_MAX_CONCURRENT
DW_WORKFLOW_TASK_TIMEOUT60Default workflow-task lease timeout in seconds.WORKFLOW_TASK_TIMEOUT
DW_ACTIVITY_TASK_TIMEOUT300Default activity-task lease timeout in seconds.ACTIVITY_TASK_TIMEOUT
DW_WORKER_STALE_AFTER_SECONDSmax(DW_WORKER_POLL_TIMEOUT * 2, 60)Seconds after a worker heartbeat before the worker registration is stale.WORKFLOW_SERVER_WORKER_STALE_AFTER_SECONDS
DW_WORKER_HEARTBEAT_INTERVAL_SECONDS60Cadence in seconds advertised to SDKs in worker register and heartbeat acknowledgements.WORKFLOW_SERVER_WORKER_HEARTBEAT_INTERVAL_SECONDS

Limits, Retention, And Metrics​

These settings are request-boundary and bounded-growth controls. If an application regularly approaches these values, prefer smaller payloads, external payload storage, or continue-as-new rather than raising the limits by default.

VariableDefaultPurposeLegacy alias
DW_METRICS_WORKFLOW_TASK_FAILURE_TYPE_LIMIT20Maximum workflow_type series reported by dw_workflow_task_consecutive_failures; excess types are summarized.WORKFLOW_SERVER_METRICS_WORKFLOW_TASK_FAILURE_TYPE_LIMIT
DW_METRICS_PROMETHEUS_WORKFLOW_SERIES_LIMIT100Maximum workflow series reported by /api/system/prometheus-metrics before excess series are summarized.WORKFLOW_SERVER_METRICS_PROMETHEUS_WORKFLOW_SERIES_LIMIT
DW_METRICS_PROMETHEUS_ACTIVITY_SERIES_LIMIT100Maximum activity series reported by /api/system/prometheus-metrics before excess series are summarized.WORKFLOW_SERVER_METRICS_PROMETHEUS_ACTIVITY_SERIES_LIMIT
DW_METRICS_PROMETHEUS_TASK_QUEUE_SERIES_LIMIT100Maximum task-queue runtime series reported by /api/system/prometheus-metrics before excess series are summarized.WORKFLOW_SERVER_METRICS_PROMETHEUS_TASK_QUEUE_SERIES_LIMIT
DW_MAX_HISTORY_EVENTS50000Maximum history events per workflow run before continue-as-new is enforced.WORKFLOW_MAX_HISTORY_EVENTS
DW_HISTORY_RETENTION_DAYS30Default number of days closed-run history is retained when a namespace does not override it.WORKFLOW_HISTORY_RETENTION_DAYS
DW_MAX_PAYLOAD_BYTES2097152Maximum serialized bytes for one payload.WORKFLOW_MAX_PAYLOAD_BYTES
DW_EXTERNAL_PAYLOAD_MAX_BYTES67108864Maximum encoded size in bytes (64 MiB) accepted by the authenticated external-payload upload and fetch transport.WORKFLOW_SERVER_EXTERNAL_PAYLOAD_MAX_BYTES
DW_EXTERNAL_PAYLOAD_REQUEST_TIMEOUT30Client-facing upload and fetch request-timeout budget advertised by the server, in seconds.WORKFLOW_SERVER_EXTERNAL_PAYLOAD_REQUEST_TIMEOUT
DW_EXTERNAL_PAYLOAD_UPLOAD_EXPIRY3600Seconds an uploaded external payload may remain unclaimed before its opaque reference expires.WORKFLOW_SERVER_EXTERNAL_PAYLOAD_UPLOAD_EXPIRY
DW_MAX_MEMO_BYTES262144Maximum serialized bytes for a workflow memo.WORKFLOW_MAX_MEMO_BYTES
DW_MAX_SEARCH_ATTRIBUTES100Maximum number of search attributes on one workflow.WORKFLOW_MAX_SEARCH_ATTRIBUTES
DW_MAX_SEARCH_ATTRIBUTE_KEY_LENGTH128Maximum byte length for one search-attribute key.WORKFLOW_MAX_SEARCH_ATTRIBUTE_KEY_LENGTH
DW_MAX_SEARCH_ATTRIBUTE_VALUE_BYTES2048Maximum byte size for one search-attribute string value.WORKFLOW_MAX_SEARCH_ATTRIBUTE_VALUE_BYTES
DW_MAX_OPERATION_NAME_LENGTH256Maximum byte length for a signal, update, or query name.WORKFLOW_MAX_OPERATION_NAME_LENGTH
DW_MAX_PENDING_ACTIVITIES2000Maximum pending activities per workflow run before rejecting a command batch.WORKFLOW_MAX_PENDING_ACTIVITIES
DW_MAX_PENDING_CHILDREN2000Maximum pending child workflows per run before rejecting a command batch.WORKFLOW_MAX_PENDING_CHILDREN
DW_MAX_NEXUS_OPERATIONS_PER_CALLER200Maximum Nexus operations returned per caller from the operations history surface before clients must paginate.WORKFLOW_MAX_NEXUS_OPERATIONS_PER_CALLER
DW_COMPRESSION_ENABLEDtrueEnable JSON response compression above the minimum size threshold.WORKFLOW_SERVER_COMPRESSION_ENABLED

Docker Bootstrap And Provenance​

VariableDefaultPurposeLegacy alias
DW_EXPOSE_PACKAGE_PROVENANCEfalseInclude package_provenance in /api/cluster/info for admin requests.WORKFLOW_SERVER_EXPOSE_PACKAGE_PROVENANCE
DW_PACKAGE_PROVENANCE_PATH<base_path>/.package-provenanceAbsolute path to the Docker build provenance file.WORKFLOW_SERVER_PACKAGE_PROVENANCE_PATH
DW_SERVICE_BOUNDARY_CROSS_NAMESPACE_DEFAULTallowDefault service-call boundary action for cross-namespace calls when no more-specific rule matches.WORKFLOW_SERVER_SERVICE_BOUNDARY_CROSS_NAMESPACE_DEFAULT
DW_SERVICE_BOUNDARY_RATE_LIMIT_PER_MINUTEunsetOptional per-minute service-call boundary rate limit.WORKFLOW_SERVER_SERVICE_BOUNDARY_RATE_LIMIT_PER_MINUTE
DW_SERVICE_BOUNDARY_MAX_IN_FLIGHTunsetOptional service-call boundary concurrency limit.WORKFLOW_SERVER_SERVICE_BOUNDARY_MAX_IN_FLIGHT

Docker Bootstrap​

VariableDefaultPurposeLegacy alias
DW_ENV_AUDIT_STRICT0Fail container boot when env:audit finds unknown or legacy DW_* variables.-
DW_BOOTSTRAP_RETRIES30Bootstrap attempts before entrypoint gives up on migrations and default namespace seed.WORKFLOW_SERVER_BOOTSTRAP_RETRIES
DW_BOOTSTRAP_DELAY_SECONDS2Seconds between bootstrap attempts.WORKFLOW_SERVER_BOOTSTRAP_DELAY_SECONDS

Workflow Package Controls​

The server image bundles durable-workflow/workflow, so it also exposes the package-level DW_V2_* controls. These should match worker deployments that execute the same workflows.

VariableDefaultPurposeLegacy alias
DW_V2_NAMESPACEunsetScope workflow instances to a namespace.WORKFLOW_V2_NAMESPACE
DW_V2_TENANCY_ORGANIZATIONunsetOptional organization segment for the workflow package tenancy hierarchy exposed to readiness, discovery, and operator surfaces.WORKFLOW_V2_TENANCY_ORGANIZATION
DW_V2_TENANCY_PROJECTunsetOptional project segment for the workflow package tenancy hierarchy exposed to readiness, discovery, and operator surfaces.WORKFLOW_V2_TENANCY_PROJECT
DW_V2_TENANCY_ENVIRONMENTunsetOptional environment segment for the workflow package tenancy hierarchy exposed to readiness, discovery, and operator surfaces.WORKFLOW_V2_TENANCY_ENVIRONMENT
DW_V2_CURRENT_COMPATIBILITYunsetWorker-compatibility marker this worker advertises.WORKFLOW_V2_CURRENT_COMPATIBILITY
DW_V2_SUPPORTED_COMPATIBILITIESunsetComma-separated compatibility markers this worker accepts, or *.WORKFLOW_V2_SUPPORTED_COMPATIBILITIES
DW_V2_COMPATIBILITY_NAMESPACEunsetCompatibility namespace for shared workflow databases with independent fleets.WORKFLOW_V2_COMPATIBILITY_NAMESPACE
DW_V2_COMPATIBILITY_HEARTBEAT_TTL30Seconds a worker-compatibility heartbeat remains valid.WORKFLOW_V2_COMPATIBILITY_HEARTBEAT_TTL
DW_V2_PIN_TO_RECORDED_FINGERPRINTtrueResolve in-flight runs from the workflow fingerprint recorded at WorkflowStarted.WORKFLOW_V2_PIN_TO_RECORDED_FINGERPRINT
DW_V2_CONTINUE_AS_NEW_EVENT_THRESHOLD10000History event count at which the package asks the workflow author to continue-as-new.WORKFLOW_V2_CONTINUE_AS_NEW_EVENT_THRESHOLD
DW_V2_CONTINUE_AS_NEW_SIZE_BYTES_THRESHOLD5242880Serialized-history byte size at which the package asks for continue-as-new.WORKFLOW_V2_CONTINUE_AS_NEW_SIZE_BYTES_THRESHOLD
DW_V2_HISTORY_EXPORT_SIGNING_KEYunsetOptional HMAC key for authenticating history export archives.WORKFLOW_V2_HISTORY_EXPORT_SIGNING_KEY
DW_V2_HISTORY_EXPORT_SIGNING_KEY_IDunsetKey identifier recorded alongside signed history exports.WORKFLOW_V2_HISTORY_EXPORT_SIGNING_KEY_ID
DW_V2_UPDATE_WAIT_COMPLETION_TIMEOUT_SECONDS10Seconds the server waits for an update to reach a terminal stage.WORKFLOW_V2_UPDATE_WAIT_COMPLETION_TIMEOUT_SECONDS
DW_V2_UPDATE_WAIT_POLL_INTERVAL_MS50Milliseconds between update-stage polls.WORKFLOW_V2_UPDATE_WAIT_POLL_INTERVAL_MS
DW_V2_GUARDRAILS_BOOTwarnBoot-time structural guardrail mode: warn, fail, or silent.WORKFLOW_V2_GUARDRAILS_BOOT
DW_V2_LIMIT_PENDING_ACTIVITIES2000Package-level pending-activity ceiling.WORKFLOW_V2_LIMIT_PENDING_ACTIVITIES
DW_V2_LIMIT_PENDING_CHILDREN1000Package-level pending-child-workflow ceiling.WORKFLOW_V2_LIMIT_PENDING_CHILDREN
DW_V2_LIMIT_PENDING_TIMERS2000Package-level pending-timer ceiling.WORKFLOW_V2_LIMIT_PENDING_TIMERS
DW_V2_LIMIT_PENDING_SIGNALS5000Package-level pending-signal ceiling.WORKFLOW_V2_LIMIT_PENDING_SIGNALS
DW_V2_LIMIT_PENDING_UPDATES500Package-level pending-update ceiling.WORKFLOW_V2_LIMIT_PENDING_UPDATES
DW_V2_LIMIT_COMMAND_BATCH_SIZE1000Maximum commands accepted in one workflow-task completion.WORKFLOW_V2_LIMIT_COMMAND_BATCH_SIZE
DW_V2_LIMIT_PAYLOAD_SIZE_BYTES2097152Package-level single-payload byte ceiling.WORKFLOW_V2_LIMIT_PAYLOAD_SIZE_BYTES
DW_V2_LIMIT_MEMO_SIZE_BYTES262144Package-level workflow-memo byte ceiling.WORKFLOW_V2_LIMIT_MEMO_SIZE_BYTES
DW_V2_LIMIT_SEARCH_ATTRIBUTE_SIZE_BYTES40960Package-level search-attribute byte ceiling.WORKFLOW_V2_LIMIT_SEARCH_ATTRIBUTE_SIZE_BYTES
DW_V2_LIMIT_HISTORY_TRANSACTION_SIZE5000Package-level history-transaction event ceiling.WORKFLOW_V2_LIMIT_HISTORY_TRANSACTION_SIZE
DW_V2_LIMIT_WARNING_THRESHOLD_PERCENT80Percent of a structural limit at which the package emits a warning.WORKFLOW_V2_LIMIT_WARNING_THRESHOLD_PERCENT
DW_V2_TASK_DISPATCH_MODEqueuePackage-level task dispatch mode, usually overridden by DW_TASK_DISPATCH_MODE in server mode.-
DW_V2_MATCHING_ROLE_QUEUE_WAKEtrueWhether queue workers run the in-worker matching-role wake on every Looping event. Set to false to opt execution-only nodes out of the broad-poll wake when a dedicated php artisan workflow:v2:repair-pass --loop daemon owns the sweep instead.WORKFLOW_V2_MATCHING_ROLE_QUEUE_WAKE
DW_V2_TASK_REPAIR_REDISPATCH_AFTER_SECONDS3Seconds before an orphaned workflow task is redispatched by repair.WORKFLOW_V2_TASK_REPAIR_REDISPATCH_AFTER_SECONDS
DW_V2_TASK_REPAIR_LOOP_THROTTLE_SECONDS5Minimum seconds between task-repair passes per queue.WORKFLOW_V2_TASK_REPAIR_LOOP_THROTTLE_SECONDS
DW_V2_TASK_REPAIR_SCAN_LIMIT25Maximum tasks considered per task-repair pass.WORKFLOW_V2_TASK_REPAIR_SCAN_LIMIT
DW_V2_TASK_REPAIR_FAILURE_BACKOFF_MAX_SECONDS60Maximum task-repair failure backoff in seconds.WORKFLOW_V2_TASK_REPAIR_FAILURE_BACKOFF_MAX_SECONDS
DW_V2_MULTI_NODEfalseDeclare a multi-node deployment so cache backends are validated for cross-node coordination.WORKFLOW_V2_MULTI_NODE
DW_V2_VALIDATE_CACHE_BACKENDtrueValidate the long-poll cache backend at boot.WORKFLOW_V2_VALIDATE_CACHE_BACKEND
DW_V2_CACHE_VALIDATION_MODEwarnCache-backend validation failure mode: fail, warn, or silent.WORKFLOW_V2_CACHE_VALIDATION_MODE
DW_V2_FLEET_VALIDATION_MODEwarnFleet-compatibility validation mode: warn logs, fail blocks dispatch and fails closed when no compatible worker is available.WORKFLOW_V2_FLEET_VALIDATION_MODE
DW_SERIALIZERavroPayload codec diagnostic input; final v2 resolves new-run payloads to Avro.WORKFLOW_SERIALIZER

Use DW_V2_GUARDRAILS_BOOT in CI and deployment manifests. The older WORKFLOW_V2_GUARDRAILS_BOOT name is retained only so env:audit can point alpha-era operators at the rename; the workflow package no longer reads it as a runtime fallback.

Use Task Matching and Dispatch when you configure DW_V2_MATCHING_ROLE_QUEUE_WAKE or a dedicated workflow:v2:repair-pass --loop daemon. Those settings change where ready-task discovery runs, not the worker-protocol contract itself.

Runtime Infrastructure Variables​

Runtime infrastructure variables are framework and dependency controls. The server audit recognizes them so it does not warn, but they are not stable Durable Workflow API knobs.

GroupVariablesUse
ApplicationAPP_NAME, APP_ENV, APP_KEY, APP_DEBUG, APP_URL, APP_VERSION, locale, timezone, maintenance, and cipher settingsLaravel application runtime identity and boot behavior.
LoggingLOG_CHANNEL, LOG_LEVEL, stack, daily, Slack, and Papertrail settingsLaravel logging destinations and retention.
DatabaseDB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD, DB_SOCKET, DB_URL, charset, collation, and foreign-key settingsSQL state store for workflow, namespace, worker, and projection tables.
Redis/cache/queueREDIS_*, QUEUE_CONNECTION, QUEUE_FAILED_DRIVER, CACHE_STORE, CACHE_PREFIX, SESSION_*Queue workers, cache locks, long-poll signaling, and web/session runtime support.
Filesystems/mail/broadcastingFILESYSTEM_DISK, MAIL_*, BROADCAST_*, PUSHER_*, AWS_*Framework integrations used by deployment-specific features.
Build/runtimeMYSQL_VERSION, REDIS_VERSION, PHP_CLI_SERVER_WORKERS, VITE_APP_NAME, BCRYPT_ROUNDSDocker Compose images and framework runtime behavior.

Migration Notes​

When migrating an older deployment, change the public name first and leave the legacy name unset. If both are present, the DW_* value is the value operators should reason about, and the legacy name should be removed.

# Before
WORKFLOW_SERVER_AUTH_DRIVER=token
WORKFLOW_SERVER_OPERATOR_TOKEN=operator-secret

# After
DW_AUTH_DRIVER=token
DW_OPERATOR_TOKEN=operator-secret

Run the server image with DW_ENV_AUDIT_STRICT=1 after migration to catch misspelled variables, stale aliases, and settings copied from older runbooks.