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