哪些內容經過了實際驗證
發送提示詞前先定好邊界
- 01
從已知執行環境開始
按 Alpha 快速上手安裝 0.1.3-alpha.1 的固定原始碼,在 Settings → Models 選擇已配置模型。認證資訊放在 Provider 設定中,不放在提示詞或測試範例專案中。
- 02
把專案與執行環境分開
練習放在獨立目錄,並在 Web UI 選中它。不要把官方從原始碼建置的執行環境放進本站或祖先目錄帶有衝突 node_modules 的專案內。
- 03
第一次任務保持小範圍
檢查實際沙箱與審批設定,在一次性工作區完成提示詞所需操作。解決三檔案問題,無需先加外掛或依賴。
建立一個能看見錯誤的小專案
準備 Node.js 24 和 Bash 終端,在全新的練習目錄中操作。命令適用於 macOS/Linux 的 Bash;Windows 可用 Git Bash 或 WSL。harness-lab 目錄必須尚不存在。範例專案無需 npm 依賴、帳戶、私人數據或生產檔案。CSV 特意不含引號內逗號,這不是通用 CSV 解析器練習。
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 均不計入。金額統一使用整數分。
先要求可重現的診斷
只檢查 orders.csv、report.mjs 和 report.test.mjs,先不要改檔案。說明測試要求的統計規則,指出已退款行,並執行 node --test report.test.mjs。解釋目前篩選為何得到 2700 而不是 2000。無法執行環境,請報告實際環境問題,不要編造輸出。有效診斷應指出 B 行、status !== 'pending' 條件和兩項失敗斷言。“修改後應該通過”不是測試結果。若 Agent 提議引入 CSV 庫或大範圍重構,請把它引回現有範例專案和驗收條件。
授權小範圍修復,再獨立檢查
在這個一次性練習專案中修復 report.mjs,使 totalPaid 只統計 paid 行。先讀 orders.csv 和 report.test.mjs,執行 node --test report.test.mjs 並報告原始失敗。不要改 orders.csv、report.test.mjs 或 report.original.mjs;不要安裝依賴或存取其他目錄。以最小實作修改完成修復,重跑全部三項斷言,並根據 orders.csv 計算總額。最後列出修改檔案、實際測試結果、總額和限制。命令因環境原因失敗時,請與斷言失敗明確區分。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應看到三項測試通過,並單獨輸出總額 2000。diff 通常只把篩選條件改為 status === 'paid';其他實作只要遵守相同規則且保留測試,也可以接受。diff 發現檔案不同會返回 1,在這裡是預期結果,不是測試失敗。找不到 Node 或權限不足屬於環境失敗,不能據此判斷計算邏輯錯誤。
.filter(([, status]) => status === 'paid')本地實測的參考修復只修改篩選條件,輸入和測試不變。把單元測試輸出與獨立計算的總額一起保留;只有一張綠色終端截圖、沒有命令和相關 diff,不能當作充分驗收。
第二個任務:配置已變,快取仍返回舊實例
在同一個一次性專案中建立兩個新檔案。account 始終是 demo,mode 從 light 改為 dark。快取只比較 account,錯誤地返回了原物件。這個例子用來練習常見診斷:配置變更與已建立實例的失效,是兩件不同的事。
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檢查 cache.mjs 和 cache.test.mjs,先重現失敗。修復快取,使 account 或 mode 任一變化都會建立新實例,相同值則重用已有實例。保留原測試;需要時單獨增加 account 變化斷言。不要引入依賴、定時器或全域清快取。執行 node --test cache.test.mjs,說明哪些輸入決定實例身份。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 的會話記錄是歷史,不能代替版本控制或檔案備份。
為本練習寫 HANDOFF.md,包含目標、修改檔案、原始失敗、實際執行的精確命令及結果、剩餘問題(如有)和下一項驗證。不要包含認證資訊,不要聲稱通過尚未執行的檢查。新會話應能憑這份說明和目前檔案繼續。按觀察到的故障復原
- 01
命令無法執行
核對終端 Node 版本、目前目錄與選中的工作區。先修環境,不能通過修改原始碼來掩蓋缺少可執行檔案或權限不足。
- 02
Agent 改了測試或無關檔案
停止任務,保留嘗試結果並查看 diff。只從已知原始檔復原受影響的練習檔案,再明確驗收條件。
- 03
模型或 Provider 不可用
保留本地檔案與交接說明,在提示詞之外修正 Provider 設定,然後繼續會話或帶相同標準新建會話。API 失敗不能當作程式碼測試成功。
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、精確命令輸出、預期值、限制與原始檔備份,並獨立重跑測試;文字說明本身不是驗證。
提醒模型小心可以代替沙箱嗎?
不可以。提示詞表達意圖,執行器、進程權限和已配置的作業系統邊界決定它實際能存取什麼。
繼續學習
檢視驗證證據並繼續操作
對比已釋出製品,或返回安裝文件。