A dry run that tells you what it would do against the current state has a race condition. The tool reports the effect, a person looks at it and approves, and then the commit runs against a state that may have moved. This is the classic objection raised about dry run flags in stateful systems: the check and the action are separated in time, so the assumptions behind the check can expire before the action lands in this discussion of dry run race conditions.
The fix that community converged on is separating planning from execution. Instead of a flag that says "look but do not touch," you produce a plan object that can later be executed programmatically, and if the assumptions made during planning have changed, the executor aborts in this discussion of dry run race conditions. A large cloud outage grew out of exactly this shape of bug: a planner kept producing newer plans while an old enacting process applied a stale one, and the freshness check at the start of application had itself gone stale in this discussion of dry run race conditions.
For agent writes, the reviewer already saw a proposal in a queue. The question is whether the world still looks the way it did when that proposal was written. The two-step apply answers that question by recomputing the effect at commit time and comparing it to the effect the reviewer approved.
There is also a governance argument. Approval gates reduce the impact of mistaken tool calls by inserting a verification checkpoint before side effects occur, and a write to a production database should carry the proposed diff, preconditions and a rollback plan as its evidence in this approval workflow guide. A review contract that names the exact records, current values, proposed values and downstream effects is what makes the human decision meaningful in this change preview playbook.



