[Bug] 会话日志损坏:长工具调用执行期间中断回合,导致 seq 重复(中断修复路径使用了过期的 seq 基线) #5952
|
环境:dsh 0.1.2-rc.1、Windows、Node 24.15.0 症状:某回合中工具调用(pwsh,约 100 秒长任务)仍在运行时中断了回合;重新加载会话报错: 根因(自查结论,欢迎纠正):中断修复路径( 已验证:删除这 4 行合成事件(全部是占位内容,零真实内容丢失)后,seq 恢复严格连续(0..70226),会话经真实加载路径( 复现步骤(基于日志取证推断,非逐步确认):
附件:完整中文分析草稿、原始损坏日志、只读诊断脚本与修复脚本。对附件 07 运行 |
Replies: 2 comments
|
对照 0.1.2-rc.1 的宿主源码把你的根因链走了一遍——你的分析成立,而且能在代码里精确对上:
你的修复方案我补一个边界提醒(你的案例没踩到,但别人照抄会踩): 动手前先 根治方向建议随报告一起提给维护者:让 |
|
你的复核和修复提醒都很到位(尤其是多并行未决调用的边界 + 先备份这条,非常关键)。我补两个点,帮你把这条帖子在家族里定位清楚,也提供一个检测侧的现成工具: 1. 这是「closers 不推进活跃会话 seq 游标」机制的复发,不是新机制你的根因(
你的案例多了一个具体注入点:中断修复路径合成的占位事件( 所以这不是孤立 bug,前因后果都在 2. 检测侧:session-audit 插件已能重放前揪出这个 shape你现在的流程是「加载失败 → 取证脚本 → 手动删 4 行」。如果想在下次加载崩溃之前就把这个 shape 暴露出来(尤其是多会话、多插件场景),可以用我已发布的
一句话:机理已由家族收敛,你的附件补了一个新的实证注入点;检测侧 session-audit 的 SEQ_GAP/SEQ_DUPLICATE 可在重放前提前暴露同类 shape。 若你愿意,我可以把这两条(核心修复方向 + 检测插件)作为家族归档的一部分整理成一段更完整的说明。 |
对照 0.1.2-rc.1 的宿主源码把你的根因链走了一遍——你的分析成立,而且能在代码里精确对上:
dsh-session的interruptedTurnClosers(rc.1 编译产物)里,合成事件的第一条 seq 就是let seq = last.seq + 1——以存储态最后一条事件为基线,和你说的一致;adoptSessionEvent构造后,经backend.commitRepair直写后端(commitRepair(inspection, tornMarker, closers)),全程不碰活跃 Session 的内存 seq 游标;你的修复方案我补一个边界提醒(你的案例没踩到,但别人照抄会踩):
interruptedTurnClosers是给每个未决 tool-call 各生成一条占位tool/result,再补step/end+turn/end。你的日志里未决调用只有一个,所以删那 4 行是干净的;但如果哪次是多个并行未决调用的中断,只删了部分占位结果会留下一个"开着的 turn"——下次加载会被另一条守卫拦住(cannot load session ... while its live turn is open)。所以删完建议用你的 04 脚本复扫两件事:seq 全程连续、无残…