DSH 历史会话不可见排查与恢复
DeepSeek Harness v0.2.1-rc.2:会话不可见排查与恢复
- 作者
- DeepSeekAgent.io 编辑部
- 发布
- 更新
升级 DeepSeek Harness v0.2.1-rc.2 后,如果侧边栏里的历史会话突然消失,先不要把“列表为空”理解成“会话已经被删除”。DSH 展示会话前,需要读取持久化文件、解析 Session Header,并把会话重新归入 Workspace;任何一层拒绝某条记录,都可能让磁盘上的会话与界面里的列表不一致。
2026 年 10 月 20 日的社区排查把这一现象定位到多条不同路径。最初报告指出,带有退役字段 sandboxMode 或 approvalPolicy 的 Session Header 会触发异常,而列表读取只容忍部分错误类型。后续源码与版本历史核查又修正了一个重要判断:公开发布版并没有写入这两个字段,真正携带它们的文件更可能来自短暂的开发版或 Nightly。对大量普通升级用户来说,Workspace 归属、重复 Session ID 和路径匹配同样需要检查,不能把所有案例都归到一个“坏字段”。
会话列表是怎样生成的
DSH 的会话不是只靠一个目录名显示。列表至少涉及三层状态:
- 持久化文件:Session 的 JSONL 或压缩记录是否仍在磁盘;
- Session Header:版本、ID、工作目录与其他头部字段能否通过当前读取器校验;
- Workspace Registry:读取出的会话能否归入当前注册的工作区并保持正确顺序。
因此,“文件还在但界面不显示”是完全可能的。相反,如果会话目录本身已经不存在,这就不是索引或列表过滤问题,需要按备份、迁移或磁盘恢复处理。
先根据现象缩小范围
| 现象 | 优先检查 |
|---|---|
| 所有工作区都没有历史会话 | Header 读取异常、重复 Session ID、列表级异常 |
| 只有一个工作区为空 | Workspace Registry、路径归属、大小写与链接解析 |
| 会话能看到但无法打开 | stat() 与实际读取是否接受同一代 Session Header |
| Session 文件也不存在 | 备份、迁移路径、磁盘或清理操作,不属于列表故障 |
这张表的意义是先区分数据是否存在,再讨论列表为什么没有接受它。不要一看到空列表就批量移动、改名或删除 .dsh 下的目录,那会把一个可诊断的索引问题变成真实的数据问题。
退役 Header 字段为什么会影响整张列表
社区报告在 v0.2.1-rc.2 的发布产物中定位到 assertNoRetiredHeaderFields:Header 含有 sandboxMode 或 approvalPolicy 时会抛出普通 Error。相邻的列表读取逻辑只把特定的“格式不支持”和“持久化损坏”错误当作单条记录失败处理。
结果是,一条不被当前读取器接受的 Header 可能阻断更高层列表,而不是只把自己标成不可用。更麻烦的是,list() 与 stat() 都会读取 Header;只让列表跳过异常而不统一打开路径,可能把“全部看不到”变成“看得到但打不开”。真正稳健的修复应把“这一代 Header 被拒绝”建模为可呈现的结果,让列表、详情和恢复入口使用同一判断。
但这个触发器并不等于所有 rc.2 升级事故的根因。后续提交历史核查显示,公开版本没有写入这两个退役字段;如果用户从正式版或公开候选版升级,仍应检查 Workspace 与重复 ID 等其他路径。
Workspace 路径也不能简单归因
Workspace Registry 会影响 Session 的项目归属,但“原目录不存在”也不能一概解释为会话被过滤。rc.2 已包含对部分缺失路径的保留逻辑:已归属会话在记录的绝对路径暂时不存在时,可以继续保留所有权。
真正需要核对的是:
- Registry 里记录的是不是当前工作区;
- Session Header 的
cwd与注册路径是否指向同一个规范化位置; - Windows 盘符、路径大小写、符号链接或 Junction 是否改变了匹配结果;
- 同一个 Session ID 是否出现在多个存储桶;
- 路径是“缺失但可容忍”,还是“存在但实际指向另一个目录”。
这也是为什么恢复文章不能只给出“把目录建回来”或“删除某个字段”这一条命令。不同触发链需要不同处理。
安全的排查顺序
- 完整复制 DSH 数据目录,保留时间戳和目录结构;不要直接在唯一副本上试修复。
- 记录版本、发布通道、系统与升级前版本。Nightly、开发构建与公开 Release 的历史写入行为可能不同。
- 确认 Session 文件是否存在,并统计受影响的是全部工作区还是单个工作区。
- 只读检查 Header 与重复 ID。先输出诊断结果,再决定是否隔离某条记录。
- 核对 Workspace Registry 与真实路径,特别关注 Windows 大小写、盘符和链接目标。
- 在副本上验证最小修复。一次只处理一种异常,重启后同时检查列表、打开、继续与压缩。
- 保留修复前后的差异,以便上游判断是读取器、Registry 还是迁移逻辑的问题。
如果需要临时隔离一条可疑 Session,应移动到单独备份目录,而不是删除。若必须修改 Header,也应在副本上进行,并确认 JSONL 首行结构、压缩格式与多代文件关系;直接对压缩文件做文本替换可能破坏整个 Session。
产品层应该怎样修复
一个可靠的会话系统不应让单条异常记录把整张列表变空。更合理的行为包括:
- 单条读取失败时继续加载其他会话;
- 在界面显示“有 1 条会话需要恢复”,而不是静默消失;
- 让
list()、stat()、打开与恢复共享同一错误分类; - 区分 Header 不兼容、重复 ID、Registry 不匹配和文件损坏;
- 提供只读诊断与可回滚修复,不要求用户手工猜目录。
这类故障也印证了 HarnessTester 对 Agent Harness 测试空白的研究:测试不能只覆盖正常 Session,还要覆盖单条坏记录、旧版 Header、重复 ID、路径变化和部分迁移失败时的降级行为。
参考资料
- v0.2.1-rc.2 历史会话不可见的社区排查
- DeepSeek Harness v0.2.1-rc.2 Release
- Session Header 校验源码
- Workspace 子系统说明
- DeepSeek Harness v0.2.1-rc.2 更新说明
常见问题
历史会话不显示,是否代表内容已经丢失?
不一定。先确认 Session 文件是否仍在磁盘。列表为空可能来自 Header 读取、重复 ID 或 Workspace 归属,而不是文件删除。
可以直接删除出问题的 Session 目录吗?
不建议。先完整备份并采用隔离方式验证。删除会把可恢复的索引问题变成不可逆的数据损失。
这是 v0.2.1-rc.2 已确认的单一 Bug 吗?
不是单一原因。官方仓库讨论已经确认若干真实触发路径,也修正了最初对版本历史和缺失目录行为的部分判断。排查时应以实际文件、Header 和 Registry 状态为准。