dsh-handoff-doc:把长会话交接成一份 HANDOFF.md

前言

在 DeepSeek Harness(DSH)里做长任务时,上下文窗口迟早会顶满。常见做法是压缩历史,或在 Step 边界把状态「简报」成一条消息交给新会话。上一类方案 dsh-session-handoff 能跑,但简报是散文式消息:没有有效期、已完成与未完成容易打架,且每次交接都在上一条之上叠加,接手方越读越长,往往还得回去翻日志。下面介绍后继插件 dsh-handoff-doc:在安全的 Step 边界停住,由当前会话的模型写一份带有效期的快照文件,归档旧版,新会话只收到指向该文件的短指令。

这是什么

dsh-handoff-doc(GitHub:ElioFanyu/dsh-handoff-doc,维护者 ElioFanyu)是 DSH 社区插件,当前 package 版本为 0.2.0,MIT 许可。定位是:把长会话交接成一份文件,而不是一条消息。上下文快满时,会话在 Step 边界停下,生成 HANDOFF.md,上一版写入 CHANGELOG.md 与 history/<月份>.md,在同一工作区开新会话并继承 preset、模型、权限、Plan 模式,最后只投递一条约 200 token 的指针消息。

与 dsh-session-handoff 的差异

这一版把内容搬进工作区文件,并立了几条硬规矩:

规矩 机制
只留「现在仍然成立」 提示词规则 + §9 只允许一行指针
不允许追加 每次交接整份重写 HANDOFF.md
历史不能丢 覆盖前归档进 CHANGELOG.md + history/<YYYY-MM>.md
必须有有效期 顶部写「到下一次提交为止(HEAD xxxxxxxx)」
长度必须可控 按字符预算裁剪,先删整节,再删长节末尾,并留省略说明

缺任一必需小节(§0/§1/§2/§4/§6/§8)则放弃交接,不创建新会话;写文档失败时原会话不动,零写操作。

工作区里的目录与文档骨架

默认目录(<项目> 取工作区最后一级目录名;monorepo 等场景用 handoffProjectFolder 指定):

<工作区>/docs/handoff/<项目>/
├── HANDOFF.md          # 当前快照,唯一要读的文件
├── CHANGELOG.md        # 每次交接一行条目
└── history/
    └── 2026-10.md      # 被覆盖掉的交接文档原文,按月份归档

固定十节:§0 30 秒自检(命令由程序读)、§1 目标与验收、§2 当前有效事实、§3 卡点与阻塞、§4 下一步 + 验证映射、§5 硬约束、§6 文件地图(不写行号)、§7 已否决方案、§8 已验证 vs 未验证、§9 历史(一行指向 CHANGELOG,程序写)。

新会话第一条消息不是正文,而是读取顺序指引:先跑 §0 里的命令;自检通过再读 §2、§3、§4;自检失败或有效期已过则告知用户文档已过期,整份重写后再开工。

命令与自动触发

命令不进入模型可见历史:

命令 行为
/handoff 立即交接成文档并交给新会话
/handoff status 阶段、上下文占用率、累计消费、阈值、最近结果
/handoff where(别名 doc) 文档路径、大小、HEAD、是否已归档
/handoff cancel 取消进行中的动作(下一安全检查点生效)
/handoff retry 重试最近一次失败

自动触发字段与上一版 handoff 系列一致,例如 autoHandoffEnabled(默认 false)、autoHandoffTrigger(context / cumulative / either)、autoHandoffAtContextPercent(默认 85)等。文档相关新增项包括 handoffDir(默认 docs/handoff)、handoffDocMaxChars(默认 24000)、archivePreviousHandoff、reusePreviousHandoff 等。交接与压缩同时开启时,autoCompactAtContextPercent 必须低于 autoHandoffAtContextPercent,否则拒绝保存。

插件声明:不中断正在执行的工作(等 whenIdle())、不吞用户消息、不删改原会话日志、失败不假装成功、不写工作区外路径(经 workspace-fs.ts 的 resolveInside 校验)。

安装与启用

安装命令以 README 为准(本地路径示例,需换成你本机克隆或下载后的目录):

dsh plugin --profile <profile> add "file:D:/path/to/dsh-handoff-doc"

安装后重启 DSH。宿主与浏览器端 UI 在同一包内。运行环境要求 Node ^22.19.0 || >=24.0.0,peer 依赖含 @deepseek-ai/cordis、@deepseek-ai/dsh-host-webserver 等(见仓库 package.json)。

DSH 生态是「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。插件以当前 dsh 进程权限运行,安装前应自行审阅源码与 MIT 许可证。

典型用法

  1. 在长会话中执行 /handoff,等待 Step 边界完成文档写入与新会话创建。
  2. 用 /handoff where 确认 docs/handoff/<项目>/HANDOFF.md 路径与对应 git HEAD。
  3. 在新会话中按指针消息:只读 §0 跑命令,再读 §2–§4 从 §4 第一条动作开始。
  4. 需要观测触发与占用时执行 /handoff status;与 dsh-session-handoff 同时安装时,不要对同一会话同时开自动触发,否则会抢同一 Step 边界。

仓库自述验证情况见 docs/handoff/dsh-handoff-doc/HANDOFF.md。

适用场景与已知限制

适合:单仓库或多会话协作、需要可版本化、可重读的交接快照,且希望接手方先跑自检命令再读事实的场景。

限制(来自 README):协调状态(阶段、闩锁、计数)仅在内存中,重启后丢失;设置与已写文档不受影响。无工作目录的会话无法交接。非 git 仓库时 git 事实自动跳过。模型不上报 contextWindow 时占用率触发不可用(累计触发仍可用)。custom 权限预设无名字可重放,只继承审批策略。

结尾

dsh-handoff-doc 把会话交接从「越来越长的消息」改成「整份重写 + 归档 + 字符预算」的单文件快照,并用短指针引导新会话先自检再动手。目录页:https://www.skillhub.cn/plugins/ElioFanyu/dsh-handoff-doc;源码与完整配置表:https://github.com/ElioFanyu/dsh-handoff-doc。

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

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

小夜