From 78b537cdf73a8ac70e06203b4ee4f480c179fd96 Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Thu, 15 Oct 2026 11:34:41 +0800 Subject: [PATCH] fix: recognize salvaged histories by prefix --- strix/core/execution.py | 2 +- tests/test_execution.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/strix/core/execution.py b/strix/core/execution.py index aad336ea..aa7fde0c 100644 --- a/strix/core/execution.py +++ b/strix/core/execution.py @@ -172,7 +172,7 @@ async def _salvage_stream_to_session( logger.exception("could not build salvage history for %s", agent_id) return pre_len = len(pre_run_items) - if pre_len > 0 and len(replay) >= pre_len and replay[-pre_len:] == pre_run_items: + if pre_len > 0 and len(replay) >= pre_len and replay[:pre_len] == pre_run_items: desired = replay else: desired = list(pre_run_items) + replay diff --git a/tests/test_execution.py b/tests/test_execution.py index 83d3829b..2225d697 100644 --- a/tests/test_execution.py +++ b/tests/test_execution.py @@ -806,11 +806,22 @@ async def test_salvage_stream_to_session_preserves_full_history(tmp_path: Any) - "recon turn 2", ] + # A replayed full history starts with the already-persisted session items. + replayed_history = [ + *stored, + {"role": "assistant", "content": "recovered turn"}, + ] + await execution._salvage_stream_to_session( + session, stored, _SalvageStream(replayed_history), "child" + ) + stored = [cast("dict[str, Any]", i) for i in await session.get_items()] + assert stored == replayed_history + # A crash with nothing new to salvage leaves the session untouched. await execution._salvage_stream_to_session( session, list(await session.get_items()), _SalvageStream([]), "child" ) - assert len(await session.get_items()) == 3 + assert len(await session.get_items()) == len(replayed_history) session.close()