用 dsh-harness-ops 給 DeepSeek Harness 做 A/B 輪換、10 秒自愈和一鍵回滾

前言

DeepSeek Harness(下文簡稱 dsh)是 DeepSeek 開源的智能體運行時,官方倉庫在 deepseek-ai/deepseek-harness,核心理念是「一切皆插件」:模型適配、工具、會話、循環、界面都可以換成插件,掛到 Cordis 運行時上。它目前仍是 developer preview,上游幾乎每天會發一個新的 snapshots/... 快照分支。

對長期掛着 dsh web 的人來說,這會帶來一組很具體的問題:今天的快照能不能安全切過去?切完 web 起不來怎麼辦?重啓會不會把正在跑的 agent 打斷?會話看起來丟了,該從哪修?這些問題不是換皮膚能解決的,而是運維問題。

社區目錄 DeepSeek Harness 插件庫dsh-harness-ops 收在「界面增強」分類下。需要先說清楚:這個站點是獨立的社區目錄,與 DeepSeek 或幻方沒有從屬、背書或贊助關係;官方發現插件的入口仍是 GitHub topic dsh-plugin。本文只介紹這個倉庫已經寫進 README 和安裝腳本的能力,不把它寫成官方應用商店裏的推薦位。

這是什麼

dsh-harness-ops 是一套給 dsh 用的運維工具箱,GitHub 倉庫爲 fakechris/dsh-harness-ops,維護者是 fakechris。許可證是 MIT,版權欄寫的是 songchuansheng(2026)。倉庫根目錄 VERSION 當前爲 0.3.2(CHANGELOG 標註日期 2026-08-14);截至 2026-08-17,GitHub 顯示 11 星,目錄頁仍寫 9 星,以倉庫頁面爲準。

它不是單一的 Cordis 插件,而是「4 個 skill + 1 個 bundle 插件」的混合倉庫。2026-08-11 曾用名 dsh-skill-snapshot-ab,後來從「純 A/B 輪換 skill」長成了現在的工具箱;skill 目錄名 dsh-snapshot-ab 保持不變,因爲它同時是觸發名和 ab.sh 的安裝路徑。

倉庫 README 用五個問題概括它要回答的事:

  1. web 掛了誰拉起?
  2. 拉起後工作繼續嗎?
  3. 會話看起來丟了怎麼辦?
  4. 官方發新版本怎麼安全切換?
  5. A/B 兩個槽都掛了怎麼一鍵救?

對應組件如下。

組件 類型 管什麼
skills/dsh-snapshot-ab skill 官方每日快照 A/B 雙槽輪換,驗收通過才原子切換
skills/dsh-web-guard skill launchd / systemd 守護,端口空閒約 10 秒內拉起 dsh web
skills/dsh-session-recovery skill 「0 sessions」或日誌損壞時的定位與無損修復
skills/dsh-web-doctor skill web / A/B 全掛時,終端一鍵診斷 → 修復 → 拉起
plugins/dsh-restart-recover Cordis bundle 重啓後檢測被打斷的 turn,自動注入續接

bundle 插件已發佈到 npm,包名是 @fakechris/dsh-restart-recover,當前 package.json 版本爲 0.2.1。skill 走的是 ~/.dsh/skills/ 目錄掃描,不進 npm。

核心功能

A/B 雙槽:新快照先進隔離槽

心智模型可以畫成下面這樣:

~/.local/bin/dsh
   └─> ~/.dsh/source/current   ← 符號鏈接,指向當前生效的槽
            ├─ slot-a/  舊版(已驗證,生產兜底)
            └─ slot-b/  新快照(構建 + 驗收通過後的候選)

生產實例永遠只跑 current 指向的那個槽,默認地址是 http://127.0.0.1:3080。切換是一次原子的 ln -sfn,再加上重啓 dsh web。A/B 是槽位身份,目錄名固定;內容每天互換:舊版佔一個槽,新快照進另一個槽。

prepare 在非當前槽裏做完整流水線:檢出快照、pnpm install --frozen-lockfilebuild:lib + build:web、擴展 relink、typecheck / build / test、運行時依賴檢查、staging 端口(默認 3081)冒煙 HTTP 200。任何一步失敗都會還原擴展鏈接,不動生產,phase 回到 idle

驗收過了才 switch。默認 acceptance.modemanual,必須帶 --yes;也可以改成 auto,前提是 e2e 已經用真實瀏覽器斷言過配置裏的 UI 元素(例如 #dsh-track-fab)。切換後還要 $AB confirm,纔會解鎖下一天回收回滾槽——在此之前,舊槽始終是退路。$AB rollback --yes 會把 current 指回上一版並重啓 web。

倉庫把這套設計和官方 dsh-upgrade 區分開:後者是 rebase 到上游 master 的整合流程;本機制面向「官方每日快照 + 本地擴展外掛」的日常輪換,兩者可以共存。

10 秒守護 + 斷點續接

dsh-web-guard 用 macOS 的 launchd 或 Linux 的 systemd 託管,PPID=1,不跟 web 進程綁在一起。v0.3.1 起判活只認 LISTEN 態 socket(lsof -ti :PORT -sTCP:LISTEN),避免瀏覽器還掛着舊連接時把端口誤判爲「被佔用」,從而永不拉起。CHANGELOG 記錄過 2026-08-14 的實測:舊判定下 3080 停機大約 20 分鐘都沒有被拉起來。

光把進程拉起來不夠。dsh-restart-recover 監聽 agent/created,發現上一輪是 interrupted 就自動注入續接消息,用戶不用再敲「繼續」。它和 guard 的分工是:guard 負責進程,bundle 負責會話。ab.sh switch/rollback 殺掉 web 之後,guard 拉起新的 current,restart-recover 再續上被打斷的 turn。

web 全掛時走終端醫生

agent 是由 web 託管的。web 起不來,GUI 和 agent 一起沒了,這時再依賴頁面上的插件沒有意義。dsh-web-doctor 是 out-of-band 入口:純終端,不加載 web 擴展,依賴本機的 node / zstd / jq / curl / ps / lsof。

安裝腳本會把 doctor.sh 鏈到 ~/.local/bin/dsh-doctor。常用入口:

dsh-doctor                    # 交互菜單(默認英文,菜單裏可切中文)
dsh-doctor --guide            # mini TUI:看完整思維鏈,隨時 Ctrl-C 打斷再指引

診斷固定九項:web 健康、launcher 鏈、擴展 relink、槽可啓動、session 文件層、web.log、profile bundles 依賴、LLM 配置(.env key)、最近會話最後發生的事。修復分兩層:菜單 2 是機械修復已知配置故障(relink、插件依賴、launcher、session、LLM 憑據),不調模型;菜單 3 / 4 用 dsh --profile headless 起一次性 agent,讀報告和日誌推理根因。headless 不加載 web 的擴展 bundle,所以擴展把 web 搞掛時,醫生自己還能跑。

README 寫明:2026-08-13 有一次無人值守的 --agent 長跑失敗,所以後來加了 --guide 的人機協同模式——LLM 自動判斷和修復,人看完整思維鏈,覺得不對就打斷。這是倉庫自己的設計取捨,不是第三方評測。

會話如果只是「側邊欄變成 0 sessions」或 zstd 日誌損壞,先走同倉庫的 dsh-session-recovery,不要一上來就整槽回滾。

安裝與啓用

目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏可以直接跑:

dsh plugin add github:fakechris/dsh-harness-ops

如需可復現安裝,按目錄頁說明固定 commit 哈希。截至 2026-08-17,倉庫 main 最新提交是 c2d10c9d4707eb6685669ff375fa7617a7554a47

dsh plugin add github:fakechris/dsh-harness-ops#c2d10c9d4707eb6685669ff375fa7617a7554a47

這條命令走的是 dsh CLI 的 GitHub 解析路徑。對本倉庫來說,完整工具箱(4 個 skill、dsh-doctor 入口、以及 web profile 裏的 restart-recover bundle)以 README 的 git clone + scripts/install.sh 爲準。README 原文克隆的是 dsh-external/dsh-harness-ops;該地址目前可以打開,內容與 fakechris/dsh-harness-ops 一致。下面按已覈實的維護者倉庫來寫:

git clone https://github.com/fakechris/dsh-harness-ops.git
cd dsh-harness-ops
bash scripts/install.sh

install.sh 做四件事:把四個 skill 拷進 ~/.dsh/skills/;用 dsh plugin --profile web add @fakechris/dsh-restart-recover@<version> 把已發佈的 npm 包裝進 web profile(不再本地 link:,避免倉庫裏被 gitignore 的 lib/ 被清掉後 web 起不來);把 dsh-doctor 鏈到 ~/.local/bin;提示可選的守護進程安裝。腳本可重複執行。

自愈守護是可選的,macOS 走 launchd,Linux 走 systemd:

bash skills/dsh-web-guard/scripts/install.sh

之後更新不必本地構建插件:

cd dsh-harness-ops && bash scripts/update.sh

update.sh 的流程是 git pull --ff-only → 重跑 install.sh → 從 npm 重裝 bundle。首次建議看一下 ~/.dsh/source/ab-config.json,確認 extensions(示例裏包含 dsh-restart-recover)、web.port(默認 3081)和 web.productionPort(默認 3080),然後:

# $AB 指 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh
$AB status

插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應檢查源碼倉庫和 MIT 許可證。

典型用法

約定:下文 $AB 均指裝好 skill 之後的 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh

第一次把正在跑的版本收編爲 A 槽,不會重啓服務

$AB status          # 確認 current 指向、slots 爲空、phase=idle
$AB init --yes      # 新建 slot-a worktree,pnpm install + 完整構建
$AB status          # current=a,phase=idle

日常生產啓動不指定 A/B,永遠跑 current

dsh web
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/

只想看官方今天改了什麼、先不切版本,在對話裏說「分析一下今天和昨天的快照」即可觸發 skill;等價命令是:

$AB discover        # fetch 上游,列快照,候選更新時附官方 changelog
$AB notes           # 打印兩個快照之間新增的 Agent Note

官方倉庫沒有獨立 CHANGELOG 文檔,但非平凡改動會寫進 .agents/notes/implemented/discover / notes 把這段筆記當成該快照的 changelog 列出來。

真正升級走完整輪換:

$AB status
$AB discover
$AB prepare         # 在非當前槽構建、掛擴展、staging 冒煙,全程不動生產
$AB verify          # 可選,對已 prepared 的候選重跑擴展測試 + 冒煙
$AB e2e             # 可選但推薦:真實瀏覽器斷言前端真的掛上了
$AB switch --yes    # manual 模式必須 --yes;會重啓 web,當前會話會斷

switch 會斷當前 agent 會話,這是預期行爲,不是故障。切完後:

readlink ~/.dsh/source/current
$AB status                              # current 已切到候選槽,confirmed=false
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/

瀏覽器需要硬刷新(macOS 上是 Cmd+Shift+R)。README 記載過 2026-08-11 的坑:舊 tab 仍是切換前加載的 boot manifest,新的 client 面板不會出現。觀察幾天沒問題再執行:

$AB confirm

新版有問題隨時回滾:

$AB rollback --yes

web 徹底起不來、連 agent 都沒有時:

dsh-doctor --guide

想確認守護是否會拉起,README 給的自愈驗證是:kill $(lsof -ti :3080),大約 10 秒內應自動拉起,已裝 restart-recover 時會話會自動續接。這會中斷當前 web,只在你明確要做故障演練時使用。

適用場景與注意事項

適合已經把 dsh 當日常工作臺、並且會跟官方每日快照走的人:本機長期跑 dsh web 的用戶、要在新快照上驗證自有擴展的插件作者、需要回滾和自愈而不是每次重裝的部署人員。如果只用官方模板偶爾試一下,沒有本地擴展、也不在乎快照日期,這套 A/B 機制偏重。

使用時有幾條硬邊界,都來自倉庫自己的說明,不是額外發揮:

  1. 兩個槽共享 ~/.dsh sessions 是 append-only 共享文件,storages 是單進程串行寫。生產只保留一個常駐實例;另一個槽用 $AB stage 短起、只讀、看完即關。不要直接 <槽>/bin/dsh web --port 3081 裸跑。
  2. switch / rollback 會斷當前會話。 會話文件在 ~/.dsh/sessions/,重啓後會重新索引,一般不會丟盤;但當前這一輪對話會被打斷。裝了 restart-recover 會嘗試從 interrupted turn 續上。
  3. 切完必須硬刷新。 普通刷新不夠。
  4. prepare 失敗不要切。 失敗時 current 不動。擴展 typecheck / build / test 紅,說明擴展和該快照不兼容,應先修擴展再重跑 prepare
  5. 守護進程綁定平臺。 dsh-web-guard 的安裝腳本面向 macOS launchd 與 Linux systemd,README 沒有把 Windows 服務列爲同等支持。
  6. 醫生會調 LLM。 機械修復不依賴模型;深度檢測需要本機 LLM 憑據,推理過程會打到終端。不要在不信任的環境把診斷日誌隨手外發。
  7. 權限與許可證。 插件以當前 dsh 進程權限運行,安裝腳本會往 ~/.dsh/skillsweb profile 和 ~/.local/bin 寫文件。安裝前檢查 源碼 和 MIT 許可證。

小結

dsh-harness-ops 把「切對版本、拉起進程、續上會話、全掛自救」收進同一個倉庫。A/B 雙槽讓官方每日快照先在隔離槽裏構建和驗收,通過才原子切換,舊槽一直能回滾;guard 在 web 死後約 10 秒拉起進程;restart-recover 把被打斷的 turn 接回去;dsh-doctor 在 GUI 完全不可用時提供終端入口。

它解決的是 preview 階段跟快照跑的運維成本,不是把 dsh 變成託管服務。目錄頁與源碼地址如下,安裝前以倉庫 README 和 scripts/install.sh 爲準:

  • 目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-harness-ops/
  • GitHub:https://github.com/fakechris/dsh-harness-ops
羽毛球分组比赛记分
小程序二维码

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

小夜