How should agent tool calls handle retries safely (idempotency keys, write-ahead logs, retry semantics)?