# Idempotency

`runs.start` accepts an optional client-chosen `runId`. Retry the same start with the same id
and conversation to receive the same run id without duplicate work. Use a new id for a new
instruction. A retry does not amend the already admitted input or profile.

`automations.invoke` and `automations.signal` accept an `idempotencyKey`. Follow their endpoint
contracts, including the required current automation revision. There is no general
`Idempotency-Key` header in v1.

Approval decisions are single-shot: a repeated decision can return
`409 approval_not_pending`. Read recorded state after an ambiguous response instead of assuming
the action failed or creating a replacement action.
