Establish what is happening
Capture competing events
Record resource key, event IDs, event and receipt times, source labels, local version, state before each write, and final state. Redact payload. Keep the two deliveries together so a single event cannot explain the reversal.
Compare ordering signals
Check sequence, version, timestamp precision, receipt order, and handler decision for both events. A newer receipt may contain an older state. Note whether the contract guarantees order for this resource or leaves it unspecified.
Bound stale writes
Group reversals by resource, event type, endpoint, worker, version evidence, and state transition. Separate stale snapshot, duplicate, equal-time event, and local race. Preserve any state that was overwritten for reconciliation.
What to carry forward
Triage ends with competing event identity, ordering evidence, first stale write, affected resource cohort, and contract gap. Hold destructive transitions when order is unknown. Route event contract, version guard, and reconciliation separately. Keep the older state from becoming authoritative during state review.
Technical background: Stripe documentation.
Keep the decision with the work.
Use a Work Item in Aglet to record the problem, the evidence you have, and the next decision. Add an owner and priority, then keep updates in the discussion so the next person can follow the reasoning.
Create an account See the product workflow