Skip to main content
Version: 2.0 prerelease

Client and Worker Capabilities

Choose a surface for what the process needs to do. The dw CLI and the first-party PHP, Python, and Rust SDKs share the v2 control-plane and worker contracts, but their operator, client, and worker roles are not identical.

This all-client guide remains at the original /docs/2.0/polyglot/cli-python-parity/ route so existing links keep working.

Capability comparison

Capabilitydw CLIPHP SDKPython SDKRust SDK
Workflow lifecycleSupported: start, list, inspect, wait, cancel, terminate, and archive operator commands. CommandsSupported: start, describe, list, await results, cancel, and terminate through Client and WorkflowHandle. Lifecycle evidenceSupported: start, list/describe, await results, cancel, and terminate through the async client. Workflow operationsSupported: start, describe, await results, cancel, and terminate through Client and WorkflowHandle. Terminal operations
SignalsSupported: send by workflow ID or selected run. CommandsSupported: client and handle send methods plus worker signal history. PHP APISupported: async client sends and workflow workers handle signals. MessagesSupported: client and handle sends plus worker signal handling. Rust API
QueriesSupported: execute a named read-only query with structured output. CommandsSupported: client and handle queries plus registered worker query handlers. PHP APISupported: async client queries plus replayed worker query handlers. MessagesSupported: client queries and replayed worker query handlers when runtime discovery advertises query-task support. Rust API
UpdatesSupported: submit and wait for accepted or completed outcomes. CommandsSupported: updateWorkflow and registerUpdate; the PHP SDK does not expose validator authoring and declares no validators. PHP APISupported: clients, workflow handlers, and synchronous declared validators when discovery advertises the pre-accept contract. Validator-bearing workers refuse unsupported runtimes. MessagesSupported: client, handle, JSON/Avro, and registered worker update surfaces; the Rust SDK does not expose validator authoring and declares no validators. Updates
SchedulesSupported: complete schedule lifecycle, backfill, and audit history. CommandsSupported: complete schedule lifecycle and listing through Client. PHP APISupported: complete async schedule lifecycle and audit-history paging. SchedulesNot supported: the current Rust SDK does not claim a schedule-management API. Use CLI, PHP, Python, or the server API.
VisibilitySupported: workflow/run search, workers, task queues, history, and diagnostic JSON. CommandsSupported: workflow filtering/pagination, history, namespaces, workers, and task queues. Visibility evidenceSupported: workflow, schedule, namespace, worker, queue, history, and search-attribute client surfaces. Client APIDifferent: selected-run describe/result is supported; fleet-wide list/search and namespace administration are not claimed. Rust client
Worker executionIntentionally different: low-level worker-protocol commands support diagnostics and conformance; dw is not an application worker runtime. Worker commandsSupported: remote workflow, activity, query, and update handlers through durable-workflow/sdk. PHP workerSupported: deterministic workflow and activity workers. Python workerSupported: native workflow, activity, query, and update handlers. Rust worker API

Supported means the named current release surface exposes the capability. Different identifies an intentional scope boundary. Not supported is an explicit current gap, not a hidden promise. Runtime protocol discovery remains authoritative when a capability depends on a negotiated worker protocol.

Evidence by product surface

CLI

The CLI overview defines installation, profiles, structured output, and exit behavior. The command reference is the complete operator surface, including lifecycle, messages, schedules, visibility, and the low-level worker-protocol commands that are intentionally not an SDK worker loop.

PHP SDK

The pinned PHP SDK exposes framework-neutral client and remote-worker APIs. Its current public surface includes workflow lifecycle and result handles, signals, queries, updates, schedules, workflow filtering/history, namespace, worker, and task-queue visibility, plus registered workflow, activity, query, and update handlers. See the PHP SDK guide and generated PHP API reference.

Python SDK

The Python SDK combines an async control-plane client with deterministic workflow and activity workers. Its guide publishes client operations, message handlers, worker execution, and schedule management. The generated Python API reference carries exact signatures and result types.

Rust SDK

The published Rust SDK exposes control-plane and selected-run lifecycle, signals, replayed queries, updates, and native workflow/activity workers. Update support includes Client::update_workflow, WorkflowHandle::update, Worker::register_update, and their Avro-value variants. Schedule management and fleet-wide list/search remain explicit gaps. See the Rust SDK guide and generated Rust API reference.

Shared contract evidence

All four products target the same versioned HTTP+JSON control plane and public payload envelope. Evidence is split by what it proves:

  • the Capability Index records exact artifact floors and current breadth;
  • the Platform Conformance Suite records cross-client and cross-worker runtime scenarios;
  • CLI and Python repositories retain shared request fixtures for operations whose semantic request bodies are byte-for-byte compared today;
  • PHP and Rust public API references and release tests establish the additional supported methods listed above.

The existence of a shared fixture in two repositories does not imply that other SDKs lack the operation. Conversely, a common endpoint does not imply that every product exposes the same operator or worker role.

Adding or extending a client surface

When adding a new CLI or SDK operation:

  1. Keep paths, methods, semantic fields, payload envelopes, and error outcomes language-neutral.
  2. Add request and runtime evidence for every participating client or worker.
  3. Document deliberately different syntax or role boundaries.
  4. Mark unsupported products explicitly.
  5. Treat language-specific serialization, file paths, class names, or error shapes as bugs in the public contract.