Field note 27 · Oct 22, 2026 · builder

Approved once, emailed twice

  • resume-idempotency
  • side-effect-replay
  • checkpoint-write-index
  • parallel-interrupts
  • durability-modes
Approved once, emailed twice

A human approves one action once. The agent sends the email twice. Every state assertion you wrote still passes.

If you run human-in-the-loop agents on LangGraph with durable execution (approval gates, interrupt(), a Postgres checkpointer), this was your production behavior until last week.

LangGraph 1.2.16 (Oct 16) fixed four resume bugs. Per the maintainers: a resumed Command applied its state update twice. A subgraph paused on parallel interrupts re-ran already-finished nodes each time a later answer arrived. Approving one tool call while another failed validation sent the approved call's email twice. In every case the final state looked correct.

The mechanism: checkpointers key pending writes by their position in a list. A resume value inserted at the front shifted the indexes, so earlier writes got saved twice and replayed on the next resume. The state converged. The email still went out twice.

What this changes: pin langgraph 1.2.16 or later, and treat every side effect that sits after an interrupt as something that will eventually run twice. Give each one an idempotency key.

The trap: your test suite asserts on final state, and final state was correct the whole time. The only test that catches this one counts the writes.

Count the side effects after interrupt() in your graphs, then count how many are idempotent. Those two numbers should match.

Sources
  1. LangGraph 1.2.16 release notes (2026-10-16) Oct 16, 2026
  2. PR #9322, a resumed Command's update applied once (merged 2026-10-16) Oct 16, 2026
  3. PR #9315, subgraph no longer re-runs finished tasks on resume (2026-10-15) Oct 15, 2026
  4. PR #9314, resumed exit-durability writes saved once (2026-10-15) Oct 15, 2026
  5. PR #9265, an invalid resume value no longer cancels sibling tasks (2026-10-16) Oct 16, 2026