50fd10bf1b
A retried card submit was only repairable while the first attempt's watch was still active. Once it had fired, expired, or answered in one shot, the retry re-evaluated the condition and created a second operation. A watch_submissions ledger, keyed (chat_id, client_request_id), is now written before the condition is read and carries the outcome once there is one. A retry looks it up first: a recorded outcome is replayed, a different draft under the same id conflicts, and only a pending row proceeds - converging on the watch id reserved up front rather than creating another.