mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-25 11:05:12 +02:00
A DeltaChannel that was never written on the branch being forked has no value to snapshot and no entry in channel_versions, so create_checkpoint skipped it and the fork's first checkpoint recorded no boundary at all. The walk then ran past the fork into the shared base and collected the abandoned branch's writes, the same failure this branch already fixes for channels that do have a value. Two shapes leaked. A run forking off a checkpoint older than the channel's first value and never writing that channel returned ['in-1'] where the plain-channel oracle returned []. A bulk update writing the delta key only in its second superstep returned ['in-1', 's2'] against ['s2']. No new blob type is needed. _DeltaSnapshot already carries the value and is already serialized by every saver, and from_checkpoint turns MISSING into typ(), so _DeltaSnapshot(typ()) reconstructs to the same empty value the channel would have had. What was missing is a version: without one, put drops the blob as not-a-new-version, so mint a first one. Deferring the seal to a later superstep does not work. That superstep reconstructs through the still-unsealed checkpoint and would only bake the corrupted value into its own snapshot. Checked that minting a version does not fire nodes that subscribe to the channel: a raw Pregel node subscribed directly to the delta channel stays silent across the fork. Reported by the Open SWE review bot on #8548.