跳到主要內容

【2026 最新】Unlazy 教學:Acceptance Ledger+Depth Tree 如何驗收 Agent 假完成?

最後更新: ·
Unlazy 驗收工作流首圖:Acceptance Ledger 勾選清單連到 Depth Tree 與驗收證據

Agent 很有自信地說「完成」,你打開 repo 卻發現文件沒更新、手機版跑版、測試只跑了一半——不能假設把提示詞改成「請更努力」,這種「假完成」就會消失。這篇 Unlazy 教學專為第一次替 Claude Code、Codex 或其他 coding agent 設計驗收流程的人而寫:我們會把需求改寫成 Acceptance Ledger、把大任務拆成 Depth Tree,再用一套可重現 A/B 方法判斷它究竟提高了品質,還是只增加 Token 與等待時間。

截至 2026 年 9 月 22 日,skills.sh 顯示 Unlazy 有 6.6K installs、3.5K GitHub stars;這是人氣快照,不是效果證明。更重要的是,官方重跑協議明說:早期六次比較缺少 prompt、逐步紀錄、輸出 repo、Token log 與計算程式,不能當成可稽核 benchmark。因此本文交付的是可直接執行的驗收與 A/B 設計,不會捏造一組「用了就進步幾倍」的結果。

Table of Contents

先說結論:Unlazy 不能保證正確,但能改變「完成」的門檻

  • 它做得到的:先列出可觀察的承諾,再讓可執行 gate 以 exit code、預期輸出與目前 evidence 判斷是否通過;工作回來後可以重跑。
  • 它做不到的:自動知道規格是否完整、英文 gate 與 shell 指令是否真的在驗同一件事,也不能把錯誤測試變成正確測試。
  • 建議起手式:先用 solo ledger,不要一開始就堆多層樹;當 coherent deliverables 需要 fresh contexts、獨立 ownership 或跨分支整合時,再考慮 Depth Tree。
  • 效果怎麼判斷:用 Agent 看不到、改不到的 Hidden Oracle 驗收預先凍結的 acceptance outcomes,再以盲評補上 UX/安全等人工項目,並比較假完成、人工接手、時間與 Token。

Unlazy 教學先記住這句:Done 不是一句話,而是一組可重跑證據

完成 ≠ Agent 說 Done;完成=每個必要承諾,都有能重新觀察結果的證據。

可以把它想成搬家點交。口頭說「都搬完了」是 final answer;逐房間清單是 Acceptance Ledger;開燈、開水、數鑰匙是 runnable gate;把客廳、廚房、倉庫分給不同人並在最後一起點交,就是 Depth Tree。清單的設計目的,是把已列出的遺漏顯示出來;但若你忘了把「冰箱裡的食物」寫進去,整張表全綠仍然可能漏東西。

這也是為什麼它與一般「多想一步」提示不同。Quantifying Laziness 在有限的 GPT-4 variant/DeepSeek 設定中,把 partial compliance 與提前截斷列為可觀察問題;Microsoft Research 的 Webwright 也在 Agent 輸出 done: true 前加入最終腳本、log、screenshot gate 與 Agent 自己的 self-reflection 判斷。這些材料說明外部 evidence gate 是一種實際設計選擇,卻沒有測 Unlazy 本身,也不能取代獨立 Hidden Oracle 或證明完成率改善。

Unlazy 把 Agent 的完成聲明依序轉成驗收帳本、可執行 gate、證據與重新驗證
Unlazy 的核心不是叫 Agent 更努力,而是把「我做完了」改成「這些承諾可以被重新檢查」。

Acceptance Ledger、Gate Checker、Depth Tree 各自做什麼?

1. Acceptance Ledger:先寫可驗收結果,再開始施工

Ledger 通常是 GATES.md。每一列只寫一個可觀察 outcome;能用程式判斷的項目,加上 CHECK:EXPECT:,不能自動化的 UX 或風險判斷才留給 manual evidence。它像測驗的配分表:不是寫「完成前端」,而是拆成「360px 寬度沒有水平捲軸」「鍵盤可完成主流程」「既有桌機版測試沒有回歸」。

2. Gate Checker:只承認 exit 0、命中 EXPECT、而且證據仍屬於目前定義

在本文鎖定的原始碼中,runnable gate 要同時滿足三件事:命令 exit code 是 0、合併輸出符合 EXPECT:、ledger 裡的 evidence 仍綁定目前已解析的 CHECKEXPECT 與原始 CWD 定義。這三項改變才會讓 automatic evidence 過期;resolved path、shell、timeout、platform 與 PATH 等執行身分由另一套 runtime approval 約束。父層能用 --reverify 嘗試重跑已核准的 runnable gates。但官方README 的 gate contract同時畫出界線:checker 只能證明你宣告的命令 oracle,不能理解 gate 標題與命令在語義上是否一致。

3. Depth Tree:按真實邊界拆工,不是把努力乘上樹深

現行Depth Tree 方法明確要求不要把 depth 當成 effort/Token 的算術承諾。現在的 tree 用來暴露元件、所有權、依賴與整合點:小 bug 可以只用一張 ledger;當多個 coherent deliverables 值得交給 fresh contexts/獨立 ownership,或 API、前端、資料遷移需要 branch integration gates 時,再建立 leaves。更多層級若沒有新工作或驗收邊界,只會增加管理項目,是否值得仍要由 A/B 判斷。

4. Stop Hook:對已宣告 unmet 狀態回傳 block,不替你執行驗收

可選的 Claude Code Stop hook 會掃描 ledger 與 dispatch 中已宣告的狀態,在仍有 unmet gate 或未完成 dispatch wave 時回傳 block;它不執行 CHECK:,而且連續六次沒有語義進展後會放行,避免在完全無語義進展時持續 block。Codex 可使用同一套 Skill 與 gate checker,但這個 hook 不是跨 Agent 通用的強制層。把它理解成「門口提醒」,而不是保全替你重新驗屋。

版本先鎖死:本文使用的是原始碼,不是正式 2.1.0 Release

截至 2026 年 9 月 22 日,Unlazy main 的目標版本是 2.1.0,但官方仍標為 UnreleasedGitHub Releases 頁面也沒有 Release。本文把目前設計簡稱為「v2」,實際鎖定 commit 16671491f6679ad9378f52604d3bc2415b4120c7;不要把它寫成已發布穩定版。

git clone https://github.com/Leonxlnx/unlazy.git
git -C unlazy checkout 16671491f6679ad9378f52604d3bc2415b4120c7
npm --prefix unlazy test

AlphaLab 在同日以 Node.js 24.15.0、npm 11.14.0 執行上面官方測試,七組共 188/188 項測試通過。這只能說明該 commit 的 parser、checker、lease、hook、installer 與結構檢查在這個環境通過,不能推論它會讓任一模型提高多少 Hidden acceptance pass rate。

一般安裝可依官方指令執行 npx skills add Leonxlnx/unlazy,再在支援 slash skill 的工具輸入 /unlazy。Codex 的現行官方 Skill 文件則說明:Codex CLI/IDE 的 repo skill 放在 .agents/skills、個人 skill 放在 ~/.agents/skills,並用 $unlazy 明確呼叫;可先輸入 /skills 確認它真的被載入。做 A/B 時不要追著會變動的 main,兩組都要記錄確切 commit 與 Agent 版本。

Unlazy 教學實作:先做一張可被反證的 GATES.md

假設任務是「把舊設定格式遷移到新格式,同時保留向下相容」。一種可能出現的假完成,是新格式測試綠了,舊 fixture、文件範例或錯誤路徑沒被碰到。可先從這個最小模板改寫:

# Gates: settings migration

- [ ] G1: 舊版與新版設定都能載入,遷移後欄位值正確
  CHECK: node scripts/verify-settings-migration.mjs
  EXPECT: settings migration verification passed
  EVIDENCE: pending

- [ ] G2: 非法設定會失敗,且不會留下半套輸出
  CHECK: node scripts/verify-invalid-settings.mjs
  EXPECT: invalid settings rejection passed
  EVIDENCE: pending

- [ ] G3: 使用文件的兩個範例能由真實 parser 讀取
  CHECK: node scripts/verify-doc-examples.mjs
  EXPECT: documentation examples passed
  EVIDENCE: pending

三支 verifier 都應先執行所有 assertion,只有全部通過才印 success marker。尤其是「沒有多餘檔案」「沒有洩漏 secret」這類 absence check,要放一個已知會失敗的 positive control,證明路徑、glob 與 pattern 真的看得到違規案例。否則「搜尋不到」可能只是搜尋了錯誤目錄。

# 只解析狀態,保證不執行 CHECK
node <path-to-skill>/scripts/gate-check.mjs --status GATES.md

# 先讀懂每個命令與被呼叫的 script,再核准並立即執行待驗 gate
node <path-to-skill>/scripts/gate-check.mjs --approve GATES.md

# 交付前重驗全部 runnable gates;只有目前 runtime oracle 已核准者會執行
node <path-to-skill>/scripts/gate-check.mjs --reverify GATES.md

# 若 resolved CWD、shell 或 PATH 等 approval identity 可能改變
node <path-to-skill>/scripts/gate-check.mjs --approve --reverify GATES.md

--status 才是永遠不執行命令的模式;普通模式在同一 oracle 已核准後可能直接執行。CHECK: 是任意 shell code,會繼承目前檔案、環境變數、網路與憑證權限。Approval 代表你同意執行,不是 sandbox;被呼叫的 script、fixture 或 dependency 內容也不會因命令字串沒變就自動重新取得核准。想把 coding agent 的測試與驗收底層補起來,可先讀 Coding Agent 測試驗收方法

另有一個本文鎖定 commit 的時效性陷阱:截至 2026 年 9 月 22 日,公開 issue #36 重現了「gate 已 met 後,若 resolved CWD、shell 或 PATH 改變,單獨執行 --approve 可能略過新的 runtime approval」;相關 PR #37 當時仍未合併。遇到這個特定情境,先確認上游狀態;在該 commit 可合併使用 --approve --reverify,並逐項閱讀將執行的 oracle。

A/B 怎麼跑:三種任務、兩個條件、每格至少多次重跑

入門 pilot 可選三種容易「看起來好了」的 repo 任務:跨檔案設定遷移、響應式/無障礙前端修改、帶負向案例的 parser 或權限 bug。每題都跑 baseline(不載入 Unlazy)與 treatment(載入固定 commit、使用 Acceptance Ledger;有真實整合邊界才用 Depth Tree),每格先做 3 次,共 18 次。三次只可能暴露流程錯誤與初步變異,不能證明普遍效果;若結果要影響團隊流程,應先用 pilot 估變異,再以預先登錄的 power/simulation 增加不同 repo 與 repetitions。

Unlazy A/B 測試以 baseline 和完整工作流比較三種 repo 任務、重跑、Hidden Oracle 與成本指標
Agent 可見的需求與資源固定;最後由 Agent 看不到、改不到的 Hidden Oracle 判斷預先凍結的 acceptance outcomes 是否通過,UX/安全另由盲評補足。

第一步:在執行前凍結實驗卡

先寫下 Agent 產品、完整模型 ID/snapshot、reasoning、權限、工具、system rules、base commit、lockfile、OS、runtime、網路政策、context/Token/時間上限、retry 與 timeout 規則。Hosted model 若不能鎖 snapshot,就記錄執行時間,並讓 A、B 在同一時間區塊交錯。這些欄位任何一項不同,都可能把「Unlazy 效果」變成模型、快取或依賴差異。

{
  "base_commit": "REPO_COMMIT",
  "unlazy_commit": "16671491f6679ad9378f52604d3bc2415b4120c7",
  "agent_product": "PRODUCT_AND_VERSION",
  "model_snapshot": "EXACT_MODEL_OR_DATED_UNKNOWN",
  "reasoning": "FIXED_SETTING",
  "permissions": "FIXED_POLICY",
  "wall_time_limit": "FIXED_BEFORE_RUNS",
  "retries": 0,
  "primary_outcome": "all_hidden_acceptance_outcomes_pass"
}

第二步:每次 run 都用全新 session 與 worktree

前一次的 transcript、review、.unlazy 狀態或修正結果都不能流進下一次;可控制的本機 cache 要清除或用 run id 隔離,無法控制的 provider cache 則記錄為限制。兩組收到完全相同的需求與 acceptance bullets;差別只能是是否載入 Unlazy 工作流。可用 detached worktree 建立每個起點:

git worktree add --detach ../runs/T1-A-1 REPO_COMMIT
git worktree add --detach ../runs/T1-B-1 REPO_COMMIT

# A = baseline;B = pinned Unlazy
# T1、T2、T3 各自把 A/B 的順序隨機化,再建立第 2、3 次 run

如果 baseline 額外少看到需求內容,效果就混入「有沒有寫清楚規格」的差異,不能歸因於 ledger 形式。兩組必須看到同一份可見需求;B 組只是把那些要求映射到 ledger、執行 gate、必要時用 tree 管理分工。

第三步:用 Hidden Oracle 當裁判,不拿可見 gate 自我評分

Hidden Oracle 應在實驗前由另一個人凍結並計算 checksum,再放進 Agent 工具無法存取、由 ACL/容器/網路邊界隔離的 evaluator,Agent session 結束後才執行;checksum 只能證明內容身分,不能代替存取隔離。Oracle 只能驗證使用者已明說的需求,不能偷偷加入新需求。前端題要測不同 viewport、鍵盤路徑與 console;設定題要測舊 fixture、新格式、rollback 與禁改範圍;負向斷言要有一個已知違規 fixture,證明 verifier 有能力失敗。

原因是「可見測試通過」不等於「長任務完成」。SlopCodeBench v2 的最新 arXiv metadata涵蓋 36 題、196 checkpoints、15 個 coding agents;沒有任何 agent 端到端解完一題,最佳 checkpoint pass rate 為 14.8%。這不是 Unlazy 評測,但提醒我們要把 checkpoint pass 與全任務完成分開記。

第四步:先看 Hidden acceptance,再算成本

  • Hidden acceptance pass rate:預先凍結的 Hidden Oracle outcomes 是否全部通過;另外保留 UX/安全盲評,不把 hidden tests 假裝成完整正確性。
  • 完成聲明分類:執行前定義 success、partial、handoff 的判讀規則,讓不知道 treatment 的 reviewer 依 final answer 分類並處理分歧。
  • 假完成:同時報「成功聲明且 hidden outcome 失敗 ÷ 全部 runs」、「成功聲明且 hidden outcome 失敗 ÷ 所有成功聲明」與「(成功聲明且 hidden outcome 失敗)÷ 所有 hidden outcome 失敗」;避免 treatment 只因少說成功就顯得更可靠。
  • 誠實 handoff:未完成時是否清楚交代阻塞與證據;它不是成功,必須依預先凍結的 blind-review rubric 另列。
  • 規格覆蓋:先凍結可見 requirements 的分母,再算多少進入 ledger;另記 vacuous gate、manual gate 與錯誤 path。
  • 代價:輸入、cached input、輸出 Token、wall time、API 成本、重試、人工審查與接手分鐘。
  • 每次 hidden pass 成本:該組所有 runs 的總成本 ÷ Hidden Oracle 完整通過次數;不能刪掉失敗 run,零成功要預先規定為不可估,並同時顯示總成本與 raw passes。

建議同時報 raw counts、中位數與範圍。三次得到 2/33/3 並不代表 B 已被「統計證明」較好;run 是觀測/隨機分派單位,task 是 block、cluster 與一般化單位,同一 run 裡的 100 個 tests 不是 100 個獨立樣本。若要估 tree 的增量,可改成三臂 staged ablation:baseline、ledger/checker、ledger/checker+tree;「tree only」不是現行 Unlazy tree,Claude Code 專用 Stop hook 也應另作 factor。不要從兩臂結果反推是哪個元件有用。這和 Agent Skill Routing A/B Test 的核心相同:一次只回答你真的操弄過的因果問題。

6 個關鍵坑:Gate 全綠,成品仍可能錯

1. CHECK 根本沒觀察 gate 標題

官方 repo 的公開 issue #13 曾用「八顆行星都能點」搭配 CHECK: echo ok 重現綠燈。這不是 parser bug,而是 oracle 語義缺口。解法是讓 verifier 讀取真正 artifact/service,並讓 success marker 只出現在所有 assertion 之後。

2. Ledger 漏掉原始需求

若任務要求 A+B,PLAN 只收 A,所有已宣告 gate 都可能完美通過。現行 contract inventory 會要求把每項必要 outcome 映射到 owner 與 observation,但仍需要人或獨立 reviewer 重讀原始需求。可搭配 Agent Skill/SKILL.md 教學,先把觸發條件、輸入與成功定義寫清楚。

3. Absence check 搜錯地方也會通過

「沒有 secret」「沒有 staging URL」這類 negative gate 可能假綠:錯誤 path、空 glob、壞 regex 都可能回報找不到。官方合併的 PR #15 因真實課程稽核案例加入三條 gate authoring 規則,其中第一條就是 negative gate 要有 positive control。

4. Approval、evidence 與 ledger 都不是防竄改證明

自動 evidence 用未加金鑰(unkeyed)的 SHA-256 摘要綁定 gate 定義,能偵測結構漂移,卻不是身份驗證;能編輯 ledger 的人也能偽造外觀。成功輸出的原文只留下 fingerprint/byte count,Approval 也不會雜湊被呼叫的 transitive scripts。高風險任務要保存外部 CI log、artifact checksum 與 reviewer 記錄,不能只留一張打勾的 Markdown。

5. Gate 過嚴、規格寫錯或反覆修同一點

執行前就定義每個 run 的時間/Token/retry cap。超過上限、同一失敗沒有新證據,或 spec 與需求矛盾時,停止並保留 transcript。若錯誤 gate 是 Agent 在 treatment 中自己寫出的,它就是 treatment 行為,必須照預先規則計分,不能排除;只有與 treatment 無關、事先定義的 infrastructure/evaluator 故障才可標成 invalid。若研究者提供的共同規格或 oracle 本身有錯,建立新 protocol version,對所有組別從乾淨起點對稱重跑,並保留舊結果。無法完成則用明確 handoff,而不是刪 gate。

6. 把更多樹、更多 Agent 誤當成更多品質

一個單檔 bug 通常可先從 solo ledger 開始;branch integration、lease、dispatch wave 與 parent reverify 都會增加管理項目。先用 AI Agent Harness 的觀念判斷哪些驗收該由模型外部執行,再參考 AI Agent Harness 實作指南把 checker 放進真正的 CI/browser runner。當 fresh contexts、獨立 ownership 或跨分支整合可能帶來新證據時,再把 Depth Tree 納入 A/B。

什麼任務值得用 Unlazy?

  • 值得:需求可拆成多個獨立 outcomes、常漏文件/回歸/跨端驗收、修改風險高,或會由多個 Agent/人員交接。
  • 先用 solo ledger:單一 bug、單一 feature、文件或小型 refactor;先保留少量、真正能失敗的強 gate,不為了數量加入弱 gate。
  • 再升級 Depth Tree:API、資料、前端與 deployment 有明確所有權,而且 branch 能執行跨子任務 integration test。
  • 不值得:幾分鐘能人工確認的低風險改字、沒有可觀察 artifact 的腦力激盪,或 verifier 成本比錯誤本身更高。

一個務實的採用方式,是先挑你團隊經常返工的一類任務跑小型 pilot,而不是把所有 repo 一夜之間改成深樹。與站內的 OMP Plan/Advisor/Reviewer A/B 教學相比,OMP 那篇設計比較的是額外角色;本文提出要比較的 treatment 是「驗收帳本+可重跑 oracle+必要時分解」這一整套 completion discipline,兩者回答的問題不同。

常見問題

1. Unlazy 真的能阻止 Agent 假完成嗎?

不能保證。它會把已寫入 ledger、且 oracle 判定為 unmet 的狀態顯示出來;漏規格、弱測試、錯路徑與 manual judgment 仍可能假綠,是否改善完成率要由 A/B 判斷。

2. Acceptance Ledger 就是另一份 todo list 嗎?

不只。普通 todo 記活動;ledger 應記 outcome,並把可判定結果連到可重跑 command 與 evidence。

3. Depth Tree 越深,Agent 會越努力嗎?

不一定,而且現行官方方法明確反對這種算術承諾。深度只應對應真實工作與整合邊界。

4. 每個 gate 都通過,就能交付嗎?

還要重讀原始需求與執行獨立整合驗收。Gate 只證明它觀察的 oracle;使用者意圖、UX、安全與未列出的 requirement 可能仍在外面。

5. 可以直接執行別人 repo 裡的 GATES.md 嗎?

不可以盲跑。先用 --status 檢查,再閱讀每個 command 與被呼叫 script;CHECK: 會用你的環境權限執行。

6. Stop hook 會不會讓 Agent 永遠卡住?

官方設計有六次無語義進展的 release guard。但過嚴 gate 仍可能增加數輪重試,所以必須另外設定整體預算、停止與 handoff 規則。

7. 三次 A/B 重跑夠嗎?

只夠 pilot。它可能暴露流程錯誤與初步變異;要做一般化結論,必須增加 task diversity、重跑數與預先定義的不確定性分析。

8. 應該先開 ledger、tree,還是 Stop hook?

先 ledger。先證明 gate 能觀察真正 outcome,再視跨元件需求加 tree;Stop hook 最後才作為 Claude Code 的可選提醒層。

給新手的 5 個重點

  • 先寫 outcome,後寫 command;不要用「完成實作」這種活動名稱。
  • 每個 success marker 都只能在全部 assertion 後出現,negative gate 一定要有 positive control。
  • 先跑 --status、讀懂指令,再 --approve;交付前用 --reverify
  • 效益要由獨立 Hidden Oracle 判斷,不能用 Unlazy 自己的綠燈證明 Unlazy 有效。
  • 記住本文錨點:Done 不是一句話,而是一組可重跑證據。

想持續追蹤 Agent、模型與工作流,可瀏覽 AlphaLab AI 專區;若想把這類方法整理成自己的工作系統,也可查看 AlphaLab 課程

接著閱讀

左右滑動查看更多推薦

結語:先做一題小型 A/B,再決定是否擴大

Unlazy 的設計目標不是把 AI 神奇地變勤勞,而是把部分完成條件從語言承諾搬到可重跑命令;它是否改善你的結果,仍要測。今天就挑一個曾經「測試綠、交付卻漏東西」的任務:寫三個 outcome gate、準備一套 Agent 看不到的 Hidden Oracle,把 baseline 與 pinned Unlazy 各三次當成 workflow smoke pilot。若 hidden pass、UX/安全盲評與成本出現值得追查的探索訊號,再增加 task diversity 與 repetitions 做確認;若沒有,就保留 solo ledger,把 tree 與 hook 關掉。

ALPHALAB 社群

有問題?來 Telegram 聊

和 Terry、編輯、其他網友一起討論這篇文章。提問、分享觀點,回覆更即時。

加入 Telegram 討論

📩 訂閱 AlphaLab 電子報

每週最多三封:一封 Weekly 週報與最多兩封關鍵 Alpha Signal。

我們不會 spam,隨時可退訂。