Why Generic AI Translation Runs the Same Job Twice
Idempotency is the property that running the same operation more than once yields the same result as running it once. For a paid, long-running translation, the absence of idempotency is not a minor inconvenience. It is a quiet way to charge a user twice for the same work.
What goes wrong
You open a second tab to check on a project. You click translate again because the page seemed stuck. A friend with the same account starts a different document while yours is still running. In each case, a system without idempotency cheerfully accepts the new request and starts a second job alongside the first.
Why generic AI translation fails here
Chat-based AI translation has no concept of a project. Each request is independent. There is no server-side notion of "this user already has work in flight". Two windows means two conversations means two bills.
How TranslationAI solves it
A per-user concurrency guard refuses to start a second translation while one is active. Within a project, chunk processing is sequential, so two workers cannot race the same chunk. A status guard rejects requests against projects already in a terminal state. The user-visible result is simple: one translation runs at a time, and a duplicate click is a quiet rejection, not a duplicate charge.
Further reading: why resume must be addressable, not implicit, why long documents need a single orchestrator, why honest failure surfacing is the prerequisite.