← 回首頁 WHY ENUMERATE THE INFINITE?

如果情境永遠窮舉不完,為什麼還要窮舉?

AI 工具 · 2026.07 – 09 · 規則設計、MCP 開發、測試

產季提前結束、天候異常、品質未達出貨標準,都可能讓生鮮電商一次取消整批訂單,還要補購物金作為補償。主副單結構加上三種券型與折抵上限,人工逐張計算要花數天,金額算錯就會變成客訴。我起初照傳統方式盤出 12 條退款規則,後來決定換一種做法:不做後台按鈕,也不把所有情境寫死成 if else。我自己開發一支 AI 工具,遇到沒有把握的訂單就停下來問人;確認後的通則再經審核寫回規則。

0 單元測試,全數通過
0 自己寫的 MCP 工具
12+7 退款規則+必停情境
數天 → 數分鐘 每批的處理時間
CANCEL & REFUND COPILOT RULES AT RUNTIME, NOT UPFRONT 12 退款規則 6 硬防護 7 必停情境 沒見過的單 → AI 停下 → 問人 → 答案變規則 教會系統承認自己不會
MASS CANCELLATIONS WEATHER · SEASON END · QUALITY 取消一批 訂單 × 單一 vs 拆單 × 券型 × 上限規則 數天的 人工 計算 每筆退款手算、手寫備註、手轉購物金 —— 慢,偶爾還錯

CHALLENGE 01

一批取消單,為什麼要算上好幾天?

真正耗時的是退款金額。 訂單分成單一訂單與主副單(拆單);優惠券有折數型、面額型、單品折扣碼三類;折數券又會依會員等級套用不同的折抵上限,超過上限退原價,未超過則退折後價。三個維度交叉後,每張訂單都要人工查結構、加總關聯單、判斷上限、計算金額,再依序取消、補購物金、開發票、寫備註。整批處理往往要數天。

CHALLENGE 02

為什麼 12 條規則永遠不夠?

需求一開始很典型:營運希望後台增加「批量轉購物金」按鈕。 我也先按傳統方式,把單一訂單、主單、副單,與無券、折數券達標/未達標、面額券、折扣碼交叉展開,整理出 12 條退款規則。接著出現三個警訊:

  • 需求書附的範例就有計算錯誤。 按照同一份文件的規則驗算,其中一個例子會多退錢。
  • 我也曾誤判兩次。 兩條原本被我判定為漏洞的情境,查過真實資料後證明是誤會,我也公開撤回。
  • 每輪討論都會再長出例外。 整組全取消時要不要退券?跨產線的券如何分攤?主單金額為零、付款掛在副單時怎麼處理?盤了三輪,清單越來越長,對完整性的信心反而越低。

每次會議都在增加規則,卻沒有增加同等程度的信心。 即使開發前盤得再細,上線後仍可能遇到一張從未見過的訂單。

AI 可以幫我更快展開情境,卻無法證明清單已經完整。PM 和 AI 一起窮舉,本質上仍是窮舉。

THE ROAD I TRIED FIRST ENUMERATE EVERYTHING R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 ? ? ? ? ? ? 12 條規則寫好了… 問號一直長出來 需求書自己的範例多退錢 我撤回了自己兩條判定 每輪盤點都長出新洞 窮舉是一場慢慢輸的比賽 —— 每次會議增加規則、減少信心

TURN

轉念:讓情境自己走進來

盤到第三輪,我把問題反過來:與其花數週猜完所有特殊情境,不如在使用者真的遇到那張訂單時,再由人與 AI 一起確認。

傳統做法是在需求階段定完情境,再寫成一連串 if else;日後每出現新例外,就要改程式、測試、重新部署。這個案子改用另一種結構:不做後台按鈕,營運透過對話說明要處理的訂單,由 AI 呼叫受控工具執行。流程如下:

  1. 營運把要取消的訂單編號給 AI(一批最多 60 張)。
  2. AI 逐張查結構與優惠、按規則算金額,給一張預覽表:可處理/必停/不在範圍。
  3. 營運確認一次後,AI 逐張連續執行四步(取消 → 補購物金 → 開發票 → 寫客服備註),中途不再問。
  4. 全部跑完回報一張表,每張四格,列出需人工的。

關鍵是「必停」:遇到規則未涵蓋的訂單,AI 不猜、不算,也不執行,而是請營運先向客服確認。若答案可以成為通則,AI 會開 PR 更新規則,再由我審核;下次遇到同類訂單,就能直接套用。

需求確認不再只發生在開發前,而是持續運作的迴圈。 系統上線時不必假裝全知,但必須知道何時停下來。

THE FLIP LET EDGE CASES WALK IN BY THEMSELVES 訂單 進來 符合規則? 是 執行 4 步 報告 否 AI 停下 問人 通則? → PR 人審過 → 變成規則 → 下次不再問 需求確認不再是階段,它變成迴圈。

DESIGN

硬的放工具層,軟的放規則層

讓 AI 執行與金額有關的動作,風險不能只靠提示詞控制。因此我把安全限制放進架構:

  • 工具層有六條 AI 無法繞過的硬性防護:只處理指定產線、必須是已付款的真實訂單、排除公益與測試帳號、同單不能重複發購物金、已取消訂單不能再次取消。檢查寫在 SQL 層,不受對話內容影響。
  • 規則層放在 skill,透過 GitHub PR 由我審核:包含 12 條退款規則、7 種必停情境與報告格式。修改規則不用重寫或部署程式,但每次變更都有人檢查。
  • 每一筆寫入都有稽核紀錄:四個動作都寫進後台訂單編輯紀錄並綁定操作者帳號;權限採名單制,加人或停權只需一條 SQL 即可生效。

金額安全放在工具層,情境判斷放在規則層。 只有分開處理,系統才能同時保有安全與彈性。

HARD VS SOFT WHERE EACH KIND OF RULE LIVES 工具層 —— AI 繞不過 6 條硬防護:指定產線 · 已付款的真實單 · 排除公益 · 排除測試帳號 · 不重複發購物金 · 已取消不再取消 規則層 —— 人審核、好演進 12 條退款規則 + 7 種必停情境 + 報告格式 走 PR 修改、我審核 —— 不用重新部署 錢的安全是架構,情境判斷是內容

BUILD

這一支是我自己寫的

這個專案由我負責開發。 五支工具(查單、取消、補購物金、開發票、寫備註)、步驟防呆、權限表與稽核寫入,從規則設計到程式碼都由我完成,AI 是開發夥伴。

驗收標準也不是「跑得起來」。724 項單元測試全數通過,涵蓋 12 條規則與各種金額組合;測試機另外進行兩輪端對端測試,共使用 10 張真實結構的訂單,後台編輯紀錄也逐筆核對。過程中還修正一個既有 bug:補購物金的紀錄原本不會寫入建立人員。

I BUILT THIS ONE MYSELF PM AS THE DEVELOPER 5 MCP 工具 724 單元測試通過 2 輪 端對端 +1 既有 修掉 bug 每筆寫入都進後台編輯紀錄、掛操作者帳號 —— 全程可稽核

IMPACT

需求的問法變了

最直接的效益,是把數天的人工計算縮成數分鐘的批次執行;金額則由通過 724 項測試的規則計算,不再仰賴逐張手算。

更長期的改變,是營運看見另一種需求形狀。過去請工程做功能,PM 往往得在開發前列完所有情境,討論來回數週;現在團隊知道,有些內部工具可以先定義清楚邊界,也就是什麼絕對不能做、遇到不確定時如何停下來,再讓特殊情境在實際使用中逐步補齊。

這套做法不適用所有產品功能,但對例外多、變動快的內部流程,能明顯降低前期窮舉與後續改版的成本。

WHAT OPS LEARNED TO ASK FOR THE REQUEST ITSELF CHANGED 「幫我們做一顆按鈕」 所有情境事前定案 需求來回數週 「幫我們做一個 AI 工具」 定義邊界,不是每個情境 特殊情境遇到再解 數天人工 → 每批數分鐘 · 需求力氣花在邊界,不是枚舉

LESSONS

學到的東西

與其假設系統已經看過所有情境,不如先教會它何時承認不會。 能在沒把握時停下來,比永遠給出答案更安全;上線也不再是賭清單是否完整,而是開始累積經過確認的規則。

  • 需求盤點的力氣要優先花在邊界。 六條硬防護值得仔細討論;第十三條退款規則可以等真實案例出現,再依流程補進來。
  • 撤回誤判也要留下紀錄。 我盤錯的兩條規則,撤回時直接更新需求文件並附上驗證數據。規則如何被修正看得見,營運才敢把金額操作交給這套系統。
WHAT I KEEP 誠實勝過 全知 力氣花在 邊界,不是 枚舉 撤回自己的 公開撤回 會說「我沒把握」的系統,比永遠給答案的安全

STACK

技術架構

C#(掛在既有後台系統上的 5 支 MCP 工具,沿用現成的取消與發票服務)、Claude Skill(GitHub 版控+PR 審核)、名單制工具權限(SQL 生效、不用部署)、稽核雙寫(SQL 後台編輯紀錄+Mongo 操作 log)、724 項單元測試。

內部工具,原始碼不公開。

HOW IT WAS BUILT 5 支 MCP 工具 在後台 Skill Git + PR 審核 每支工具 權限名單 完整稽核 SQL + Mongo 權限改一列 SQL —— 60 秒生效,不用部署