跳至主要內容
返回學習中心
14運維閱讀 18 分鐘入門

實操 · 重現、修復、驗證

DeepSeek Harness 最佳實踐:完成兩個可核驗的修復

用兩個小任務建立可重複的習慣:糾正訂單總額,再修復忽略配置變化的快取。每個任務都有輸入、可觀察的失敗、可複製提示詞和獨立驗收。先在下面的一次性專案完成練習,再用於重要工作。

最後驗證
2026年9月6日
指南原始碼基準
0.1.3-alpha.1
安裝狀態
以所選項目的紀錄為準
驗證範圍
  • 固定 DSH Alpha 原始碼與上下文管理、Agent 評估的一手資料
  • 本機實際執行的兩個合成 Node 範例專案、參考修復與指定檔案復原
  • 沒有聲稱完成模型橫評或真實 Provider 業務任務
本頁目錄
  1. 哪些內容經過了實際驗證
  2. 發送提示詞前先定好邊界
  3. 建立一個能看見錯誤的小專案
  4. 先要求可重現的診斷
  5. 授權小範圍修復,再獨立檢查
  6. 第二個任務:配置已變,快取仍返回舊實例
  7. 為什麼在練習中這樣檢查
  8. 讓暫停的任務容易接續
  9. 按觀察到的故障復原
  10. 把有效流程整理成一個小型 Skill

哪些內容經過了實際驗證

發送提示詞前先定好邊界

  1. 01

    從已知執行環境開始

    按 Alpha 快速上手安裝 0.1.3-alpha.1 的固定原始碼,在 Settings → Models 選擇已配置模型。認證資訊放在 Provider 設定中,不放在提示詞或測試範例專案中。

  2. 02

    把專案與執行環境分開

    練習放在獨立目錄,並在 Web UI 選中它。不要把官方從原始碼建置的執行環境放進本站或祖先目錄帶有衝突 node_modules 的專案內。

  3. 03

    第一次任務保持小範圍

    檢查實際沙箱與審批設定,在一次性工作區完成提示詞所需操作。解決三檔案問題,無需先加外掛或依賴。

建立一個能看見錯誤的小專案

準備 Node.js 24 和 Bash 終端,在全新的練習目錄中操作。命令適用於 macOS/Linux 的 Bash;Windows 可用 Git Bash 或 WSL。harness-lab 目錄必須尚不存在。範例專案無需 npm 依賴、帳戶、私人數據或生產檔案。CSV 特意不含引號內逗號,這不是通用 CSV 解析器練習。

bash
create_harness_lab() {
mkdir harness-lab || return
cd harness-lab || return
cat > orders.csv <<'CSV'
id,status,cents
A,paid,1200
B,refunded,700
C,paid,800
D,pending,400
CSV
cat > report.mjs <<'JS'
export function totalPaid(csv) {
  const rows = csv.trim().split(/\r?\n/).slice(1);
  return rows.map(row => row.split(','))
    .filter(([, status]) => status !== 'pending')
    .reduce((sum, [, , cents]) => sum + Number(cents), 0);
}
JS
cat > report.test.mjs <<'JS'
const { default: assert } = await import('node:assert/strict');
const { readFileSync } = await import('node:fs');
const { default: test } = await import('node:test');
const { totalPaid } = await import('./report.mjs');
const csv = readFileSync(new URL('./orders.csv', import.meta.url), 'utf8');
test('only paid orders count', () => assert.equal(totalPaid(csv), 2000));
test('refunds alone count as zero', () => assert.equal(totalPaid('id,status,cents\nB,refunded,700\n'), 0));
test('an empty ledger counts as zero', () => assert.equal(totalPaid('id,status,cents\n'), 0));
JS
cp report.mjs report.original.mjs
node --test report.test.mjs
}
create_harness_lab
建立三個檔案並重現錯誤

首次執行應有兩項斷言失敗、一項通過。錯誤實作把已退款訂單的 700 分計入,得到 2700,而正確結果是 2000。規則是只統計 status 為 paid 的行;refunded 與 pending 均不計入。金額統一使用整數分。

先要求可重現的診斷

text
只檢查 orders.csv、report.mjs 和 report.test.mjs,先不要改檔案。說明測試要求的統計規則,指出已退款行,並執行 node --test report.test.mjs。解釋目前篩選為何得到 2700 而不是 2000。無法執行環境,請報告實際環境問題,不要編造輸出。
第一輪:修改程式碼前先建立失敗證據

有效診斷應指出 B 行、status !== 'pending' 條件和兩項失敗斷言。“修改後應該通過”不是測試結果。若 Agent 提議引入 CSV 庫或大範圍重構,請把它引回現有範例專案和驗收條件。

授權小範圍修復,再獨立檢查

text
在這個一次性練習專案中修復 report.mjs,使 totalPaid 只統計 paid 行。先讀 orders.csv 和 report.test.mjs,執行 node --test report.test.mjs 並報告原始失敗。不要改 orders.csv、report.test.mjs 或 report.original.mjs;不要安裝依賴或存取其他目錄。以最小實作修改完成修復,重跑全部三項斷言,並根據 orders.csv 計算總額。最後列出修改檔案、實際測試結果、總額和限制。命令因環境原因失敗時,請與斷言失敗明確區分。
可以直接複製的任務提示詞
bash
node --test report.test.mjs
node --input-type=module -e "import {readFileSync} from 'node:fs'; import {totalPaid} from './report.mjs'; console.log(totalPaid(readFileSync('orders.csv','utf8')))"
diff -u report.original.mjs report.mjs
在 harness-lab 目錄中親自執行這些命令

應看到三項測試通過,並單獨輸出總額 2000。diff 通常只把篩選條件改為 status === 'paid';其他實作只要遵守相同規則且保留測試,也可以接受。diff 發現檔案不同會返回 1,在這裡是預期結果,不是測試失敗。找不到 Node 或權限不足屬於環境失敗,不能據此判斷計算邏輯錯誤。

text
.filter(([, status]) => status === 'paid')
這個範例專案的參考實作修改

本地實測的參考修復只修改篩選條件,輸入和測試不變。把單元測試輸出與獨立計算的總額一起保留;只有一張綠色終端截圖、沒有命令和相關 diff,不能當作充分驗收。

第二個任務:配置已變,快取仍返回舊實例

在同一個一次性專案中建立兩個新檔案。account 始終是 demo,mode 從 light 改為 dark。快取只比較 account,錯誤地返回了原物件。這個例子用來練習常見診斷:配置變更與已建立實例的失效,是兩件不同的事。

bash
create_cache_lab() {
test ! -e cache.mjs && test ! -e cache.test.mjs && test ! -e cache.original.mjs || return
cat > cache.mjs <<'JS'
let cached;
export function getSettings(config) {
  if (!cached || cached.account !== config.account) cached = { ...config };
  return cached;
}
JS
cat > cache.test.mjs <<'JS'
const { default: assert } = await import('node:assert/strict');
const { default: test } = await import('node:test');
const { getSettings } = await import('./cache.mjs');
test('a changed setting refreshes the instance', () => {
  const first = getSettings({ account: 'demo', mode: 'light' });
  const second = getSettings({ account: 'demo', mode: 'dark' });
  assert.notEqual(second, first);
  assert.equal(second.mode, 'dark');
  assert.equal(getSettings({ account: 'demo', mode: 'dark' }), second);
});
JS
cp cache.mjs cache.original.mjs
node --test cache.test.mjs
}
create_cache_lab
無需資料庫或認證資訊,直接重現快取問題
text
檢查 cache.mjs 和 cache.test.mjs,先重現失敗。修復快取,使 account 或 mode 任一變化都會建立新實例,相同值則重用已有實例。保留原測試;需要時單獨增加 account 變化斷言。不要引入依賴、定時器或全域清快取。執行 node --test cache.test.mjs,說明哪些輸入決定實例身份。
可以直接複製的任務提示詞
text
if (!cached || cached.account !== config.account || cached.mode !== config.mode) cached = { ...config };
參考修復:兩個影響行為的輸入都參與判斷

執行 node --test cache.test.mjs。經過本地檢查的參考修復會通過:mode 變化後得到不同物件且值為 dark,下一次相同呼叫重用該物件。範例專案只有 account 和 mode;真實服務需枚舉全部建立輸入、保留讀取失敗語義,並在不洩露金鑰值的前提下測試輪換。本練習不認證生產快取或支付 Provider。

為什麼在練習中這樣檢查

Anthropic 的上下文工程文章討論按需取得資料與結構化筆記,評估文章則區分對話紀錄與最終結果。我們把它們落實為具體操作:從指定檔案開始,修改後重新讀取,把實際測試輸出、總額與 diff 放在一起。HANDOFF.md 記錄路徑、已執行命令與未完成事項,讓繼續工作的會話再次核對目前檔案。這把上下文、證據與交接連起來,而不是用更長的提示詞或日誌證明品質。

讓暫停的任務容易接續

保持 report.original.mjs 和 cache.original.mjs 不變。新會話前要求簡短交接,記錄目前檔案、最後執行的命令與未解決事項。繼續工作時重新讀檔案、重跑測試,因為會話摘要可能對應舊狀態。DSH 的會話記錄是歷史,不能代替版本控制或檔案備份。

text
為本練習寫 HANDOFF.md,包含目標、修改檔案、原始失敗、實際執行的精確命令及結果、剩餘問題(如有)和下一項驗證。不要包含認證資訊,不要聲稱通過尚未執行的檢查。新會話應能憑這份說明和目前檔案繼續。
具體的交接請求

按觀察到的故障復原

  1. 01

    命令無法執行

    核對終端 Node 版本、目前目錄與選中的工作區。先修環境,不能通過修改原始碼來掩蓋缺少可執行檔案或權限不足。

  2. 02

    Agent 改了測試或無關檔案

    停止任務,保留嘗試結果並查看 diff。只從已知原始檔復原受影響的練習檔案,再明確驗收條件。

  3. 03

    模型或 Provider 不可用

    保留本地檔案與交接說明,在提示詞之外修正 Provider 設定,然後繼續會話或帶相同標準新建會話。API 失敗不能當作程式碼測試成功。

bash
cp report.mjs report.attempt.mjs
cp report.original.mjs report.mjs
node --test report.test.mjs
保留嘗試結果,僅復原練習檔案

復原後應再次出現原來的兩項失敗,這是有意進行的復原檢查。保留 report.attempt.mjs 便於比較。在真實倉庫中應使用乾淨分支或工作樹,並逐檔案審閱復原;不要把本練習的覆蓋命令用於無關工作。

把有效流程整理成一個小型 Skill

完成練習後,再記錄檢查、重現、修改、測試、交接的流程。DSH 官方本地發現路徑包含專案 .dsh/skills 和 .agents/skills,名稱與優先級有實際影響。Skill 記錄工作流程,不賦予新的系統權限。讓檔案被發現前先審閱,命令範圍保持明確,不要因為未知擴充套件承諾自動化就直接載入。

帶著具體目標繼續

閱讀一手官方資料

常見問題

修改前需要了解的事項

關於格式、相容性、證據與回滾的簡明說明。

這篇指南核實哪些範圍?

本指南涵蓋:固定 DSH Alpha 原始碼與上下文管理、Agent 評估的一手資料;本機實際執行的兩個合成 Node 範例專案、參考修復與指定檔案復原;沒有聲稱完成模型橫評或真實 Provider 業務任務

我應該先做什麼?

用兩個小任務建立可重複的習慣:糾正訂單總額,再修復忽略配置變化的快取。每個任務都有輸入、可觀察的失敗、可複製提示詞和獨立驗收。先在下面的一次性專案完成練習,再用於重要工作。

最需要記住的邊界是什麼?

兩個 Node 範例已在本機執行,包含原始失敗、參考修正,以及 report.mjs 統計模組的原始內容復原。DSH 步驟依據 0.1.3-alpha.1,固定提交 d347e703908d0406b7a7ef80e3a0e594d86b2215。這些範例供你使用已設定的模型練習,不代表已執行過模型任務。

很小的修改也需要完整計劃嗎?

這兩個範例專案只需簡短診斷和明確測試命令。較大任務適合分階段,但每個階段都應有可審閱產物和檢查辦法。

Agent 說完成後應保留什麼?

保留檔案 diff、精確命令輸出、預期值、限制與原始檔備份,並獨立重跑測試;文字說明本身不是驗證。

提醒模型小心可以代替沙箱嗎?

不可以。提示詞表達意圖,執行器、進程權限和已配置的作業系統邊界決定它實際能存取什麼。

繼續學習

檢視驗證證據並繼續操作

對比已釋出製品,或返回安裝文件。