build_messages merges the current message into a same-role history tail, shrinking the prompt prefix to 1 + history_count. The save boundary assumed a standalone current message and skipped one message too many, cutting the first new-turn assistant message (with its tool_calls) from persistence while keeping its tool results - producing orphaned tool results in session history.