前言¶
在 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 目錄頁。