Idempotency
Every mutation that can be retried needs a stable key.
Starts and Signals
WorkflowRunMetadata.idempotencyKey and signal delivery keys make HTTP retries safe. The service retries transport failures with the same key. It does not treat an HTTP response as completion evidence; persisted run state is authoritative.
Activities
ActivityContext.idempotencyKey is stable for a logical attempt. Manual retry creates a new attempt and retains the key so the external system can dedupe.
Completions
User-task completion, cancel, redrive, and command retry all require a request idempotency key. Duplicate posts do not append a second history event.
Replay
Replay itself is the other half of idempotency. A completed await never runs its handler again. That is why operation IDs must be stable and why workflow code must not perform I/O.