dsh-graft-slice:长会话物理切片与零继承冷恢复

前言

在 DeepSeek Harness(DSH)里跑长任务时,上下文窗口会随轮次变长:注意力被历史稀释,已解决过的报错和中间叙述仍占着窗口,模型容易在新窗口里重复推导或误把旧失败当成当前阻塞。常见做法是手动开新会话并粘贴摘要,但摘要会丢 seq、丢工具输出,且难以核对「当时原文是什么」。

dsh-graft-slice 是 DSH 开源生态(GitHub topic:dsh-plugin)里的「记忆」类插件,由 corvus-dsh 维护。它在源会话最后一个 turn/end 处切出高保真日志磁带,生成为一个零继承、可冷恢复的目标会话,完成物理交接;不 fork 源日志、不做有损压缩,并用事务日志保证崩溃可恢复。兄弟项目 dsh-memory 负责能力记忆(SKILL.md / 负知识),与本插件仅通过台账文件耦合。

这是什么

一句话:dsh-graft-slice 负责工作能力连续性——在上下文逼近上限前换干净窗口,同时保留按 seq 回读事实的能力。

项 说明
仓库 corvus-dsh/dsh-graft-slice
目录页 skillhub.cn 插件页
当前版本 0.21.0(预发布),v7.4 能力线
目标运行时 DeepSeek Harness 0.2.1-rc.5(package.json 中 engines.dsh)
许可证 MIT

生态里把记忆拆成两类:事实记忆(做过什么、原文与工具输出)只需可查,由会话日志加 graft_read_result / graft_search_history 按 seq 回读;能力记忆才需要持久化,由规划中的记忆系统插件承担。本插件不做 SQLite、不单独注入 tool/result,只追加、不改写源日志。

核心功能

日志切片与注入

在封闭轮次边界切取磁带,向目标会话注入 system、磁带与约束包。README 记载的真机自我切片:源会话 48 轮、约 9.5 MB 压缩日志时,交接注入约 14,252 字符(约为源的 0.15%),新会话零澄清接上工作,并能自行发现 pending 与断点信息是否一致。

交接任务看板(v0.20.0)

把任务状态渲染为四列(已完成、进行中、待开始等),避免 v0.19 那种「散文式一段话」迫使模型自行推导进度。开放轮次上的未决工作进入「进行中」,与 open-turn-carryover 共用同一提取器;空列用显式「无」与缺失列区分;停泊点后补充 graft_read_result / graft_search_history 的用法说明。

语义状态提取与物理点火(v0.19.0)

open-turn-carryover 不再整段搬运已解决报错栈;只保留可核对的「最终结果」(带 seq)、唯一未覆盖的「未决报错」一行,以及停泊点与回读指针。瘦身内容在「已按语义瘦身」中声明,避免静默丢弃。

切片完成后,插件通过宿主 sessionController.prompt 向目标投递带 [dsh-graft-slice 点火] 标记的引导语,使冷恢复会话自动开跑;失败时写入 <dataDir>/.graft-pending-ignition.json 排队重试,迁移本身不回溯。

风险与策略、动态水位与硬约束(v0.18.0 及后续)

  • 命令风险分类(safe / unknown / destructive)与策略表(strict / balanced / autonomous)分离;destructive 在 autonomous 下为 ask,不会静默执行无界删除。
  • 动态水位:按窗口估算交接成本,hardAt 在 0.50–0.75 间 clamp;过小窗口会标记 feasible: false。
  • 硬约束按字符预算打包,装不下则中止并报告 GRAFT_ABORTED: constraints truncated,避免静默截断规则。
  • 台账 .retired.json / .transferred.json 使用 epoch 信封,跨进程防撕裂;与 dsh-memory 的台账读取规则对齐。

Bundle 与校验

本插件是 DSH bundle:须在 package.json 中声明 dsh.bundle.patch(指向 cordis.patch.yml),cordis.patch.yml 用包名 dsh-graft-slice 引用。仓库提供 27 项 bundle 校验,可在 CI 中运行:

node scripts/verify-bundle.mjs

安装与启用

安装命令以 README 为准(勿自行拼接 github:owner/repo 形式):

# 用户安装(dsh CLI)
dsh plugin --profile <name> add dsh-graft-slice
dsh --profile <name> --dump-config        # 配置树里应出现 dsh-graft-slice 条目

安装后确认配置树中出现 dsh-graft-slice;Node 需 >= 20。控制台侧提供「物理点火」相关卡片(开关、投递方式、未点火会话列表等),具体项以当前版本 UI 为准。

典型用法

下面介绍长会话交接的常见路径,细节以仓库 README 与 ARCHITECTURE.md 为准。

  1. 在 profile 中安装并启用插件(见上一节命令),保证 Harness 版本满足 >=0.2.1-rc.5。
  2. 继续在同一源会话中工作,插件根据动态水位在接近 hardAt 时提示或触发切片准备;操作员可在面板查看可行性(feasible)与水位参数(如 watermarkMode: 'fixed' 用于差分测试)。
  3. 执行切片与注入(工具链中的 graft_slice_and_inject 等,由插件注册到 DSH)。源会话在事务提交后退休;目标会话收到磁带、交接任务看板或交接指令卡,以及硬约束包。
  4. 目标会话第一轮优先阅读注入块中的看板或指令卡;需要原文或工具输出时,用注入里点名的 seq 调用 graft_read_result 或 graft_search_history,而不是假设磁带内仍有全文。
  5. 若物理点火成功,目标会收到点火消息并继续执行「待开始」项;若点火排队,插件在后续 apply() 时通过 resumePendingIgnitions() 重试。

交接任务看板在 README 中的结构示例(内容仅为格式说明):

## 交接任务看板(第一轮只要读这里)
**原始用户要求**:……

**已完成**
- git commit abc1234 成功(seq=88)

**进行中**
- ……

**待开始**
- ……

适用场景与注意

适合谁:需要在 DSH 中单会话连续跑多轮工具、又不想手动 copy 摘要开新窗的开发者;希望事实记忆仍可按 seq 回查、同时用干净上下文重置注意力的长任务场景。

注意:

  • 插件以当前 DSH 进程的权限运行;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,并理解命令拦截策略(strict / balanced / autonomous)对自身工作流的影响。
  • 社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;版本以仓库 tag 与 package.json 为准(当前文档对应 0.21.0 预发布线)。
  • 窗口过小导致一次交接都装不下时,插件会明确报 feasible: false,应调整窗口或策略,而不是强行在 50% 切点假装可行。
  • 与 dsh-memory 协作时,迁移证据依赖台账 epoch;被拒读时应按 README 说明重试,勿手工猜测「最新状态」。

结尾

dsh-graft-slice 把「换窗」做成可审计的物理交接:源日志只读、目标零继承冷启动、事实按 seq 可查、事务与点火队列保证崩溃与延迟启动仍可恢复。若要进一步了解实现与发布说明,可查阅仓库 README 与 RELEASE_NOTES.md;安装与索引见 SkillHub 目录页。

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

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

小夜