WinMedic 是做什麼的?
目標
把宿主 Agent 當推理層,把本機 PowerShell 和內建引擎當執行層。先用證據定位原因,再提最小修復,確認後執行並驗證。
本 Skill 不啟動獨立模型、不聯網、不採集遙測,始終服從宿主的權限與審批機制。
執行前檢查
- 確認平台是 Windows、Shell 是 PowerShell、目前是否管理員。不要憑用戶描述推斷。
- 確認作用範圍是本機。用戶給了保留項(不要動微信、別刪 D 碟)就寫成約束,全程遵守。
- 執行
engine\winmedic.ps1 doctor一次,取得權限/PS 版本/WizTree 可用性。 - 若宿主無本機執行能力(只有聊天),改用「人工步驟 + 驗證點」模式輸出,不假裝執行。
強制工作流
1. 明確目標
- 拆成:症狀、期望狀態、不可改變的約束。
- 多目標逐項保留,不得用刪除替代遷移、用重裝替代修復。
- 只有歧義會顯著改變路徑時才提問。
2. 路由 Playbook
- 讀 playbook-index.md,按症狀選最具體的一個。
- 只載入需要的那一份
playbooks/*.md,不要一次讀全部。 - 多個獨立問題時,按「影響面 × 依賴順序」逐個做。
3. 唯讀診斷
winmedic.ps1 probe --set <domain> # 產出 state\findings.json
- 探針唯讀。任何一步產生寫操作都是 bug,立即停止並報告。
- 採不到的項如實標註「無法獲取」,不要猜。
4. 生成方案
winmedic.ps1 plan --from state\findings.json
輸出 plan.json + plan.md + planHash。把 plan.md 原文呈現給用戶,不要自己複述成模糊描述。
plan.md 現在含兩段:
- 建議(按優先級) —— 跨域處置建議,
high先處理(待重啟、無還原點、安全風險、磁碟告急)處置列寫可執行: <action>的,可直接winmedic.ps1 apply --action <action> --yes- 寫
人工: <playbook>的,按該 playbook 逐條處置,不要自己發明步驟
- 明細 —— 引擎可執行的清理項(按 id 執行)
建議段的來源是確定性規則(不是模型猜測),證據指向 playbook 或 catalog 證據條目。
5. 確認
- 逐項列出:動作、影響量、風險級別、能否回滾。
- 只執行用戶點過頭的 id。用戶說「都行」時,預設只做 Tier 1 + Tier 2。
- Tier 3 必須逐項確認;Tier 4 一律不執行。
6. 執行
winmedic.ps1 apply --plan state\plan.json --ids R1,R3 --yes
- 預設進隔離區(soft delete),不要隨手加
--purge。 - 部分失敗(退出碼 7)時,先看 journal 再決定是否繼續。
7. 驗證
winmedic.ps1 verify --journal <id>
- 核對可用空間、服務狀態、目標是否消失。
- 若
pendingReboot = true,明確告訴用戶「重啟後才會完全生效」,不要謊報成功。
8. 報告
固定五段:現狀 → 找到什麼 → 做了什麼 → 驗證結果 → 沒做什麼(及原因)。
動作分級
| Tier | 含義 | 執行要求 |
|---|---|---|
| 1 | 零風險,刪了系統照跑 | 確認即可 |
| 2 | 快取,會重建 | 說明重建代價 |
| 3 | 需判斷,可能影響功能 | 逐項確認 + 展示證據 |
| 4 | 紅線 | 拒絕執行,說明原因並給人工路徑 |
一螢幕體檢與對比
winmedic.ps1 probe --set intake # 跨域唯讀採集(約 60-90 秒)
winmedic.ps1 summary # 九域一螢幕摘要,帶 OK/WARN/BAD
winmedic.ps1 diff --from a.json --to b.json # 兩次採集對比
summary 未採集的領域顯示 [?] 未採集,不要據此下結論,先補採集。
摘要末尾會直接列出「建議」(按優先級),與 plan 的建議段同源。要機器可讀就加 --json 並重新導向:
winmedic.ps1 summary --json > status.json
具體軟體(軟體負載域)
用戶點名某個軟體時(LaTeX、PyCharm、Steam、Zotero、Word、代理工具……)先執行:
winmedic.ps1 probe --set workloads
它按 catalog/workloads.json 的簽名表測量各軟體的快取與數據體積,並檢查代理鏈一致性。
關鍵區分:
kind=cache(著色器快取、IDE 索引、texmf-var、OfficeFileCache)→ 可清理,代價是重建kind=data(遊戲本體、Zotero 附件、微信聊天記錄、texmf-dist)→ 絕不刪,只能遷移kind=review(騰訊視頻下載、混合目錄)→ 必須先確認,其中可能含用戶主動下載的內容probe.proxy-chain列出 system/WinHTTP/git/npm/pip 五層代理值,consistent=false就是衝突
加新軟體不需要改程式碼:在 catalog/workloads.json 加一條簽名(detect + measure + playbook)即可。
遷移決策(用戶說「把快取/軟體搬到別的碟」「C 碟裝不下新軟體」時)
這是判斷題,不是查表題。引擎只給事實,方案由你決定,但你必須走完清單。
winmedic.ps1 relocate # 磁碟概況 + 決策清單 + 事實表 + 預設建議
winmedic.ps1 relocate --json # 同上,結構化
輸出分三段,含義不同,不要混為一談:
| 段 | 含義 | 用法 |
|---|---|---|
| 決策清單 | 三條必須回答的問題 | 必須在回答裡逐條給結論,不許跳過 |
| 事實 | 路徑/體積/介質/是否存在/已知資料夾/軟體宣告路徑 | 決策依據 |
| 預設建議 | 引擎的預設視角(標註 policySource=default-hint) | 僅參考,可被你的判斷推翻;不許當結論直接轉述 |
三條清單問題(回答時必須顯式覆蓋)
- 是否在已知資料夾下? 是 → 移動該資料夾一次,不要給單個軟體設路徑;但先判斷下面第 3 條
- 熱數據還是冷數據? 熱(即時渲染快取、IDE 索引、串流媒體快取)→ 留最快碟;冷(遊戲/虛擬機/書庫/聊天記錄)→ 才考慮搬容量碟
- 軟體是否已記錄絕對路徑(先裝後搬)? 是 → 移動後必須同步改軟體內設定,否則指回舊路徑
你(DSH)必須做的事
- 先看事實表裡的
介質:把熱數據搬到 HDD 是錯的,即使它更大 - 先看
軟體宣告路徑:那是「先裝後搬」的硬證據 - 方案要寫成「做什麼 → 為什麼 → 風險 → 驗證方式」,並讓用戶確認後才執行
- 引擎不代你遷移;你的 job 是給出帶理由的方案
詳見 playbook apps-relocate-cache(PB-913)。
病程(誰在漲,而不只是誰最大)
winmedic.ps1 trend --record # 記錄一條快照(建議每日一次)
winmedic.ps1 trend --days 14 # 看變化與速率
判讀規則:
confidence=insufficient(<2 條樣本)→ 不許下結論,先記錄confidence=low(間隔 <0.5 天)→ 只看變化量,沒有每日速率confidence=ok→ 才能說「每天漲 X GB」
用途:C 碟滿時先看趨勢,再決定是清快取還是查某個軟體在瘋狂寫日誌。
鑑別診斷(C 碟滿 / 網路異常這類「要查病因」的場景)
winmedic.ps1 diagnose --list
winmedic.ps1 diagnose --case dx.cdisk-full
輸出是事實表(假設 × 指標 × 當前值 × 判讀信號 × 數據來源),沒有結論。
必須做的:逐條判斷、說明哪些假設被排除、哪些被支持,再給方案。
source 含 trend 的是變化量;標 low 的不能推算速率;標 insufficient 的沒有值。
需要外部工具時先看器械台:winmedic.ps1 tools(只檢測,不自動執行 Tier≥3)。
病例庫(經驗沉澱)
cases/ 下是七段式病例:症狀 / 環境 / 採集 / 假設與排除 / 處置 / 結果 / 教訓。
- 遇到同類問題先查病例,能省掉一整輪排查
- 解決新問題後按
cases/_template.md寫一條,否則下次還得重頭來 - 標
pending的是尚無現場證據的待查項,不得當結論引用
證據查詢
任何動作執行前,若用戶問「為什麼」「依據是什麼」,直接查:
winmedic.ps1 explain --action storage.winsxs-cleanup
輸出含:級別、可回滾性、命令、注意事項、證據原文與官方連結、核對日期、驗證規則。
風險門
apply 會檢查恢復能力(還原點/磁碟區陰影複製):
- 目標含 Tier 3(不可回滾)且恢復能力不是 ready → 拒絕執行,返回碼 4
- 此時正確做法:先
apply --action recovery.create-restore-point --yes建還原點,或讓用戶顯式加--accept-risk - 不要為了「推進任務」擅自加
--accept-risk
用戶保留項(硬約束)
用戶說「別動微信」「D 碟別碰」時,立刻固化成保留項,不要只記在腦子裡:
winmedic.ps1 profile --exclude "C:\Users\<user>\Documents\WeChat Files"
winmedic.ps1 profile --exclude "D:\*"
winmedic.ps1 profile # 查看當前保留項
winmedic.ps1 profile --exclude "..." --remove # 移除
保留項是雙層攔截:plan 階段排除,apply 階段再次拒絕並記帳。
何時必須停手
- 目標是
Windows\WinSxS內檔案、Windows\Installer、System32、WindowsApps - 目標是聊天記錄目錄(
WeChat Files/xwechat_files)或用戶聲明的保留項 - 只剩 1-2 個系統還原點時要求刪還原點
- 提交量已接近提交上限時要求縮頁面檔案
- 用戶要求「全部刪掉」「不用管風險」——先解釋,再只做 Tier 1/2
引擎呼叫約定
若宿主只能透過 MCP 存取工具,用
engine\mcp\winmedic-mcp.ps1(見 docs/MCP.md); 工具參數與下面命令一一對應,寫工具需yes=true。其餘規則完全一致。
- 所有子命令支援
--json,無--json時輸出人類可讀摘要。 - 退出碼:0 成功 / 2 用法 / 3 權限 / 4 前置未過 / 5 plan 失效 / 6 紅線 / 7 部分失敗。
- 不要繞過引擎直接下刪除命令。引擎的價值就是雜湊綁定、隔離區和稽核日誌。
生成報告
winmedic.ps1 report --journal <runId> # 五段式交付報告
winmedic.ps1 report --set storage --out report.md
報告固定五段:現狀 → 找到什麼 → 做了什麼 → 驗證結果 → 沒做什麼(及原因)。 缺數據時如實寫「未採集」,不編造。
報告範本
## 現狀
C: 98.7 GB,可用 16.7 GB(83%)
## 找到什麼
| 項 | 大小 | 級別 | 依據 |
| 資源回收筒 | 7.03 GB | 1 | 無影響 |
| hiberfil.sys | 6.32 GB | 1 | 微軟文件:powercfg /h off |
## 做了什麼
R1 資源回收筒清空:7.03 GB -> 0
R2 關閉休眠:6.32 GB 釋放
## 驗證結果
C: 可用 16.7 -> 30.1 GB;待機 S0 正常;無 pendingReboot
## 沒做什麼
SoftwareDistribution(用戶要求跳過)、Windows\Installer(高風險,建議專用工具)