dsh-ctx: Leveraging Checkpoints to Preserve Task State During DSH Context Compression

前言

在 DeepSeek Harness(DSH)里做长会话时,宿主会把较早的对话历史压成一条摘要。压一次往往还能接受,多次压缩之后,原先定过的参数、否决过的方案、测试是否跑过这类细节会从上下文里消失,模型有时还会否认刚才确认过的结论。

常见补救是在项目里手写 AGENTS.md 或让模型「自己记得写笔记」,但笔记若只留在对话里,照样会被压缩卷走;若写进工作区,又会污染仓库、牵涉权限与协作习惯。下面介绍社区插件 dsh-ctx(维护者 Saretheya,GitHub:Saretheya/dsh-ctx),它把检查点放在插件自有目录,并在每次压缩后重新注入系统提示词,让里程碑状态留在压缩碰不到的位置。

这是什么

dsh-ctx 的定位是:让模型在任务里程碑处写入检查点(目标、已定结论、否决方案、待办与证据等),由插件持久化并在上下文压缩后自动回填到 DSH 系统提示词的首段(该段不参与压缩)。数据全部落在 <DSH_HOME>/plugins/dsh-ctx/data/,不会在你的工作区新增文件。

插件在社区目录中的分类为「记忆」;许可为 MIT,目标 DSH 版本为 0.2.x(README 记载在 0.2.1-rc.5 上实测)。它不修改你的 cordis.patch.yml,也不写入 settings.yaml,卸载后随插件目录一并移除。

它解决什么问题

情况 没有检查点机制时 有 dsh-ctx 时
压缩后模型否认刚确认的结论 需要人重新说明 从检查点续写
反复讨论已否决的方案 方案被再次提出 检查点中保留「已否决及原因」
记不清测试是否执行 重跑或空口声称 在 Evidence 等字段保留要点
新会话接手同一任务 从零对齐目标 跨会话时可注入摘要卡片或指针

核心功能

四档注入策略

插件不会每轮都把整份检查点塞进上下文,而是按检查点与会话的关系选择体量:

情形 注入内容 README 记载的实测体积
同一会话 全文(单份注入上限 12000 字符) 起约 240 字符
跨会话、7 天内且主题相关 摘要卡片(≤900 字符) 约 175 字符
跨会话、过期或主题不相关 一行指针 约 95 字符
尚无检查点 不注入 0 字符

跨会话的「主题相关」依赖写入检查点时的 topic 与 keywords;README 强调这两个字段务必填写,否则跨会话时往往只会得到一行提示。

模型工具

工具 作用
checkpoint_write 写入或更新检查点;旧代自动归档,保留最近 20 代
checkpoint_read 读回全文,或按关键词过滤行
context_status 查看 token 占用、窗口,以及当前检查点为何被注入或未注入
context_compact 在宿主提供压缩服务时预约主动压缩;若服务不可用则只落盘并告知

何时写检查点:提醒而不只靠自觉

README 说明插件在四个层面推动纪律:

  1. 上下文越线提醒:按真实占用跨档位时向会话注入提醒(同档只提醒一次)。例如占用 ≥ 窗口 50%(warm)时建议先 checkpoint_write 再 context_compact;≥80%(near)、≥90%(over)时要求立刻更新检查点。
  2. 常驻系统提示词段:本会话已有检查点时,每轮可读到的规则包括:以本段为会话权威副本(与 repo 冲突以 repo 为准);上下文紧张时先落盘再压缩。
  3. 随包 skill context-checkpoint:声明里程碑、压缩后对账、明确压力信号、溢出类报错等触发条件。
  4. 压缩后的唤醒消息:压缩完成后注入后续消息,提示检查点已落盘、历史已压缩,直接接着做、勿重述已完成工作。

若任务长期不到 50% 占用且从不压缩,上述自动提醒可能不会出现;README 建议在 AGENTS.md 中约定里程碑纪律(例如每个模块改完调用一次 checkpoint_write)。

与 DSH 压缩的关系

DSH 压缩是有损摘要,细节会被丢弃。dsh-ctx 不改压缩逻辑,而是把检查点放在 systemPrompt.section——系统提示词首节点不参与压缩,因此可跨越多次压缩仍被重注入。

安装与启用

需要 DSH 0.2.x。在 desktop 配置下安装:

dsh plugin --profile desktop add dsh-ctx

安装完成后重启 DSH。插件以当前 DSH 进程的权限运行;安装前请自行查阅 仓库源码 与 MIT 许可证,确认符合你的安全与合规要求。

典型用法

经过上面的步骤启用插件后,长任务中可以按 README 推荐的节奏操作:

  1. 在根因确定、方案拍板、模块改完、测试通过或用户确认决策等里程碑,调用 checkpoint_write,填写 topic、keywords,以及目标、结论、否决项、待办与 Evidence 等正文。
  2. 上下文占用升高时,按插件注入的提醒先更新检查点,再在支持的环境中调用 context_compact。
  3. 压缩出现新的 <compacted-summary> 后,利用压缩后唤醒消息与已注入的检查点继续执行,必要时用 checkpoint_read 取全文或按关键词过滤。
  4. 用 context_status 核对当前窗口占用以及检查点被全文、卡片还是指针注入的原因。

单份写入上限默认 60000 字符(超出拒绝);注入上限 12000 字符(超出截断并提示,全文仍可通过 checkpoint_read 读取)。context_compact 在检查点落盘超过 10 分钟新鲜度窗口时会拒绝预约。

数据存放与已知限制

检查点目录结构(均在插件目录内):

<DSH_HOME>/plugins/dsh-ctx/data/
├── checkpoints/<工作区标识>/
│   ├── current.md
│   ├── current.meta.json
│   └── gen-NNN.md
├── active-variant.lock
├── tmp/
└── logs/

README 列出的限制包括:不会自动总结对话,写什么由模型决定;跨会话相关性为关键词级而非语义 embedding,误判时保守地只给一行指针;主动压缩依赖 DSH 装配,不可用时核心落盘与重注入仍可用;同一 data/ 目录仅允许一个插件实例生效(锁文件仲裁)。

结尾

dsh-ctx 的价值在于:把「压缩冲走的细节」变成系统提示词里可重复注入的检查点,且不占工作区文件。社区目录页:skillhub.cn/plugins/Saretheya/dsh-ctx;源码与完整说明:github.com/Saretheya/dsh-ctx。DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye