dsh-session-doctor:不打開會話也能定位壞事件

前言

DSH 把會話日誌寫成 session.vN.jsonl[.zstd],事件之間靠 turn / step 的嵌套和順序維持可讀性。一旦某個事件的座標寫錯了——比如在沒有打開 turn 的情況下寫 tool/ptc-dispatch-start——整個會話在當前 reader 眼裏就變成了 corrupt session,只會報一句「會話損壞」,不會告訴你是哪一條事件、哪一步出了問題。想自己翻文件定位,就得手工解壓、逐行 parse。

下面介紹的 dsh-session-doctor 就是爲這一類問題做的:它只讀、不寫,替你把違反 reader 檢查規則的事件逐個點出來。它對應 deepseek-harness Discussions #11971、#11981、#11121 這一類生命週期問題的排查場景。

這是什麼

dsh-session-doctor 是 aturzone 維護的 DSH 插件,分類爲 admin-security,目錄頁顯示星標 0,README 自己標註爲「插件早期、使用 pre-release tag」。

它做的事情可以一句話概括:逐條解碼 session.vN.jsonl[.zstd] 裏的事件,重放當前 reader 生效的 turn/step/scope 規則,然後報出具體是哪個序號、哪種事件類型、哪條規則不再成立。全程只讀,不會寫入會話文件。

它能查到什麼

README 列出的檢查項有四類:

  1. turn/step 座標完整性:turn/start / turn/end / step/start / step/end 的嵌套與順序。
  2. 在同一個未結束的 turn 內 step 編號重新開始。
  3. turn/step 作用域內的事件被寫到了作用域之外:request/header、request/context、tool/ptc-dispatch-start、tool/ptc-dispatch、assistant/message、tool/call、tool/result 的替換記錄等。
  4. 行級損壞:非法 JSON、缺失 header、非事件行。

需要留意它的定位:這是一個「與當前 V4 reader 對齊的簽名檢測器」,不是完整的格式校驗器。它不重新實現 message payload 校驗、格式遷移,也不處理 zstd 之外的壓縮 framing。所以它給出的結論是「這裏違反了哪些規則」,而不是「這個文件格式上還對不對」。

安裝

從 npm 安裝(插件處於早期,用 next 這個預發佈 tag):

dsh plugin --profile web add dsh-session-doctor@next

從 Git 倉庫安裝,命令會觸發 package 的 prepare 構建:

dsh plugin --profile web add git+https://github.com/aturzone/dsh-session-doctor.git

package.json 裏的 engines 限定 dsh >=0.2.2-rc.1 <0.3.0、node >=24.9.0,前者依賴 @deepseek-ai/cordis ^4.1.0,後者 @deepseek-ai/dsh-tools >=0.2.2-rc.1 <0.3.0。項目使用 zstd 解壓,所以 Node 版本要求不低。許可證是 MIT。

作爲 bundle 啓用

裝好之後 bundle 只往配置裏插入一行插件聲明。插件會註冊一個面向模型調用的 session_doctor 工具,掃描 $DSH_HOME/sessions(也可以傳 sessionsRoot 參數),返回和 CLI 相同的報告,同樣是只讀。

如果想在本地 checkout 上用覆蓋文件做開發調試,README 給的做法是先寫 overlay:

# overlay.yml
- insert:
    - id: session-doctor-dev
      name: /absolute/path/to/dsh-session-doctor/src/index.ts

然後帶着 patch 啓動:

pnpm dsh web --patch ./overlay.yml

這一步的意義是把源碼路徑直接掛進正在運行的 dsh,不必先打包發佈。

當 CLI 用

不想走模型工具、只想在腳本里巡檢一遍時,可以直接調命令行:

session-doctor [--home <DSH_HOME>] [--sessions-root <dir>] [--json] [--all-generations]

參數行爲按 README 整理:

  1. 默認先找 $DSH_HOME/sessions,找不到再退回 ~/.dsh/sessions。
  2. 默認只檢查每個會話裏版本號最高的那個 canonical generation;加 --all-generations 會把保留下來的更早版本一起校驗,比如 session.v3.jsonl 與 session.v4.jsonl 並存的情況。
  3. --sessions-root 既可以傳會話根目錄,也可以只傳某一個 workspace bucket,例如 --sessions-root .../sessions/--my-project--。
  4. 退出碼:0 乾淨、1 發現可疑 generation、2 用法或 I/O 出錯。--json 打印結構化報告,便於接進別的腳本。

這些退出碼可以直接當 CI 裏的判定條件用。

輸出長什麼樣

README 給的示例輸出大概長這樣:

session root: /home/me/.dsh/sessions
sessions: 12 scanned, 1 with reader-incompatible signatures

✗ --home-me-project--/session-8bc9…
  file: …/session.v4.jsonl.zstd
  events: 41, version: 4
  - seq 22 tool/ptc-dispatch-start: turn-scope: tool/ptc-dispatch-start outside an open turn
  - seq 23 tool/ptc-dispatch: turn-scope: tool/ptc-dispatch outside an open turn

報告會落到具體文件、事件總數、版本號和出問題的序號,拿到之後可以直接去對應位置看上下文。

適用場景與注意

適合這幾類人:會遇到 corrupt session 報錯、想自己定位而不是等上游修的 DSH 使用者;想審計一批歷史會話是否適用當前 V4 reader 規則的維護者;想在 CI 裏蹲住會話落盤格式變化的項目。

使用前需要注意三點。

  1. 插件以當前 dsh 進程的權限運行,安裝前應當自己過一遍源碼,確認 cordis.patch.yml 這類 patch 沒有超出預期。許可證是 MIT,但「MIT」不等於「可以無腦裝」。
  2. 它是檢測器,不是修復工具。README 明確說目前沒有 repair 或 quarantine 能力,報告給出缺陷之後,要不要把壞掉的 generation 挪走仍是人工決策。
  3. 規則對齊的是發佈時的 V4 reader,future 格式版本(session-format-vN-to-vN+1)需要跟着更新這個插件。另外默認只掃最高 generation,歷史版本不傳 --all-generations 就看不到,這是設計使然,不是漏檢。

社區目錄(skillhub.cn)是獨立站點,與 DeepSeek、幻方沒有官方從屬關係,插件列表別當成官方應用商店來引用。

結尾

dsh-session-doctor 的價值在於把「會話損壞」這種沒法再往下查的報錯,拆成「第幾行、哪種事件、哪條規則違規」。它只讀、不改文件、不承諾修復,代價是要跟 dsh reader 的版本一起維護規則。排查 corrupt session 時,先把這個插件跑一遍,比手工解 zstd 再逐行 parse 省事。

  • 目錄頁:https://www.skillhub.cn/plugins/aturzone/dsh-session-doctor
  • GitHub:https://github.com/aturzone/dsh-session-doctor
羽毛球分组比赛记分
小程序二维码

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

小夜