跳轉到

核心練習:先停下、存好,再安全地繼續

這題不用模型,也不會真的寄信或改資料。程式只把「假動作」寫進本機 JSON ledger,讓你先看懂安全骨架。

對應 Stage 7 — Agent 上線工程:可測、可看、可停、可恢復 核心練習 3。

🎯 學習目標

  • Human Approval(人工核准):敏感動作先暫停;人可以 approve 或 reject。
  • Checkpoint(檢查點):在等待核准時保存工作狀態。
  • Resume(續跑):程式重開後,從同一個 task ID 接著做。
  • Recovery(復原):狀態損壞或不相符時 fail closed,不猜下一步。
  • Idempotency(冪等):同一個 key 重跑很多次,假動作仍只執行一次。

先跑不花模型費的測試

在這個資料夾開 PowerShell,直接複製:

py -3.11 test.py

看到 8/8 passed,代表暫停、拒絕、核准、重開續跑、ledger 對帳、損壞狀態與「最多執行一次」都有離線測試。

親手走一次 pause → approve → resume

第一步只建立 checkpoint,不執行假動作:

py -3.11 starter.py start --action "publish draft" --key demo-001

你會看到 status 是 waiting_for_approval。現在關掉終端機也沒關係;狀態在 .cache/safe-execution-state.json。

第二步由人決定。核准:

py -3.11 starter.py resume --decision approve

再次執行同一行,ledger 仍只有一筆 demo-001。這就是最小的 idempotency 證據。

要練拒絕,先刪除這個練習自己建立的兩個 .cache/safe-execution-*.json,再用新 key start,最後執行:

py -3.11 starter.py resume --decision reject

看懂兩份檔案

檔案 它保存什麼 不應該放什麼
checkpoint state task ID、動作、狀態、核准結果、schema version API key、密碼、未遮罩的客戶資料
side-effect ledger 已執行的 idempotency key 與假動作 把「寫入成功」當成業務 Outcome 已正確

真正的系統通常把 state 放進有權限、備份、保留期限與版本控制的資料庫或 queue。這個 JSON 範例只教責任邊界,不是 production 儲存方案。

只改一件事

把 publish draft 改成 send reviewed summary,並換一個新的 key。先 reject,再確認 ledger 沒增加;重新 start 後 approve,再確認只增加一筆。

成功檢查

  • 沒有人核准時,ledger 不會出現假動作。
  • reject 後狀態是 cancelled,而且沒有副作用。
  • approve 後狀態是 completed。
  • 同一個 key resume 兩次,ledger 仍只有一筆。
  • ledger 與 checkpoint 打架時,程式會修復可證明的完成狀態,或停止請人處理;不會把已執行的動作標成 cancelled。
  • JSON 損壞或 key/action 不相符時,程式停止而不是猜測。

📚 必讀與學習資源

官方文件與連結查核:2026-08-31 UTC。

展開:為什麼 ledger 要先寫,checkpoint 才標成完成?

如果程式在兩次寫入中間斷掉,下次 resume 會先在 ledger 找同一個 idempotency key。找到就不重做假動作,只補上 completed checkpoint。這是教學用的最小 write-ahead 想法;真實跨服務交易仍要依資料庫、queue 或供應商 API 的一致性保證設計。

展開:常見錯誤與安全邊界
  • 把 approval 寫在工具執行後:已經寄出或付款,再問人就太晚了。
  • 只有 retry,沒有 idempotency key:網路 timeout 後重試可能重複副作用。
  • checkpoint 沒有 schema/程式版本:隔天部署新程式,舊 state 可能無法安全讀取。
  • 把完整 Prompt、token 或客戶資料塞進 state:state 也要做最小化、加密、權限與刪除設計。
  • 只看 status=completed:仍要用 Outcome Eval 確認外部結果真的正確。

下一步:回到 Stage 7 上線四步,再做 Deploy 練習。