mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-08-17 21:25:46 +02:00
`get_delta_channel_history` pages the `checkpoints` table newest-first from the head of the thread, so the target checkpoint's own row does not land until paging reaches back to it. `_try_advance_walks` read the walk cursor out of the partial `parent_of` map on the first page regardless, and `parent_of.get(target_id)` returns `None` there for a target that is simply not loaded yet, which is the same value that means "the target is a root". The cursor is derived under a `ch not in walk_cursor_by_ch` guard, so it is never recomputed. A target older than one page (1024 checkpoints) kept that `None` for the rest of the run: the chain stayed empty, the channel never seeded, and the history came back with no seed and no writes. Downstream `channels_from_checkpoint` hydrates that as an empty channel, so `get_state`, `get_state_history` and `update_state` against an older checkpoint returned an empty `DeltaChannel` on a thread with real accumulated history, silently and without an error. Start the walk only once `target_id` is actually in `parent_of`, so "not loaded yet" and "is a root" stop sharing a representation. Both savers share this method, so both are covered. Fixes #8448 Co-authored-by: Navneet-Scaler <147032454+Navneet-Scaler@users.noreply.github.com>