The planner ran two branches to compare options. One branch issued a payment call before the winner was chosen. Dropping that branch's text, memory or workflow state did not undo a request already sent to a payment provider. Cancellation is a signal to local work, not a time machine for an external effect. Temporal's cancellation guidance describes cancellation reaching activities at the next available opportunity, which is useful context but not a guarantee that the remote service has reversed anything.

I would draw a hard boundary between speculative investigation and committed action. Competing branches may read prices, build proposals and validate constraints. They should not send an irreversible tool call until the coordinator selects one concrete proposal, binds it to an approval if needed and submits it through an action service. That service checks the selected branch ID, current authority, amount and target, and assigns a stable idempotency key for this business action. A losing branch has no capability to commit. This is more reliable than asking every branch to cancel itself quickly enough.

If the unsafe call already went out, trace branch IDs, tool request IDs, provider response, action state and when the coordinator declared a winner. The provider may have charged even if our tool timed out. Reconcile against the provider using a stable operation identity before retrying or issuing a refund. Do not assume compensating a charge is equivalent to making it never happen. Fees, customer notifications and accounting entries may survive compensation.

The interviewer may ask about fast speculative work that needs reservations. A reservation can be a deliberate, expiring side effect with a bounded hold and a release protocol, but it still consumes inventory and needs ownership and cleanup. Decide whether that cost is acceptable, then make reservation IDs visible to the coordinator. The agent rolled back a failed branch. Why does the next model call remember it? deals with a failed branch whose inference state still influences the next model call. This case is about a losing branch whose real-world effect cannot be removed by clearing the model state.