Deferred from the v0.10.0 release review. Self-disclosed.
A prompt retried after a client-side timeout or connection reset carries no idempotency key (packages/opencode/src/cli/cmd/run.ts). If the server accepted the request and only the response was lost, the retry is executed a second time.
For a data tool this is not merely a duplicated read: a sql_execute carrying a mutating statement can run twice against a live warehouse. The exposure is largest under automation that layers its own retries on top.
Fixing this needs a server-side idempotency contract, not a client-only change.
Deferred from the v0.10.0 release review. Self-disclosed.
A prompt retried after a client-side timeout or connection reset carries no idempotency key (
packages/opencode/src/cli/cmd/run.ts). If the server accepted the request and only the response was lost, the retry is executed a second time.For a data tool this is not merely a duplicated read: a
sql_executecarrying a mutating statement can run twice against a live warehouse. The exposure is largest under automation that layers its own retries on top.Fixing this needs a server-side idempotency contract, not a client-only change.