核心原則

驗證工具的引入時機不該等推理徹底失敗。 靜態 CSS 推理或視覺截圖溝通連續失敗 ≥ 2 次、立刻主動提「我們啟個 server、我用 playwright 看 live DOM」 — 工具的價值是縮短診斷迴圈、不是最後手段。


為什麼要主動提工具

商業邏輯

執行者堅持靠推理 = 把使用者拖進「截圖 - 反饋 - 再試」的長循環。每輪都消耗使用者時間(看截圖、描述問題、回應)— 對使用者是負擔。

主動提工具切換 = 把循環從「視覺溝通」改成「程式量測」。執行者直接讀 live DOM、診斷一輪到位、使用者只需要在最終確認。

主動提的成本是「打一句話建議」、收益是「省 N 輪截圖溝通」。


這次任務的實際情境

觀察

drawer 在 form 內、不是 sibling 這個假設錯誤、靠推理 + 截圖溝通走了多輪:

溝通方式結果
1推理 + 寫 CSS + 使用者截圖回報失敗、看不出根因
2改 CSS + 使用者截圖回報失敗、累積錯誤假設
3加更多覆寫 + 使用者截圖回報失敗、使用者「思路錯了」
4「我啟個 server 看看」立刻發現 drawer 在 form 內

第 4 輪用 playwright browser_evaluate 讀 ancestor chain — 一個 query、一個答案、兩分鐘解。前三輪 ≈ 30 分鐘。

判讀

第 2 輪失敗時就應該主動提:

「我嘗試了兩次都失敗、根因可能在我對 DOM 結構的假設。要不要啟個 server、我用 playwright 直接讀 live DOM 確認?這樣比繼續用截圖溝通快。」

使用者啟 server、我跑 query、一輪解。

執行:主動提工具的 protocol

驗證工具該在這些時機主動提:

訊號應該提的工具
推理連續失敗 ≥ 2 次playwright browser_evaluate 讀 live DOM
不確定元素的真實位置getBoundingClientRect
不確定 computed style 套到什麼值getComputedStyle
不確定 framework 渲染後的 DOMplaywright snapshot
不確定跨 viewport 行為playwright 切換 viewport 重測

工具引入的成本與價值

內在屬性比較

方法起步成本每輪成本涵蓋
推理 + 截圖0高 — 截圖、描述、再試有限 — 看截圖看不到 DOM
瀏覽器 DevTools 手動查0中 — 切面板、讀中 — 互動成本高
Playwright browser_evaluate中 — 起 server低 — 寫一段 evaluate高 — 任意 JS query
Playwright 寫成測試中 — 起 server + 寫測試0 — 自動跑高 + 持續

「起步成本」是一次性、「每輪成本」是重複的。第 2 輪以後、playwright 的 ROI 已經正向。


主動提的具體話術

較差的提法

「要不要試試 playwright」

模糊、使用者不一定知道為什麼要試、可能答「先這樣吧」。

較好的提法

「我嘗試了兩次都失敗、根因可能不在 CSS、在我對 DOM 結構的假設。 要不要啟個 server(python3 -m http.server 8000 在 public/)、 我用 playwright browser_evaluate 直接讀 ancestor chain 確認? 這樣比繼續用截圖快很多。」

說明:

  • 為什麼提:兩次失敗、推理迴圈成本超過工具迴圈
  • 要使用者做什麼:啟 server、給一行指令
  • 我會做什麼:用 playwright evaluate 讀
  • 預期收益:縮短迴圈

使用者明確知道 trade-off、決定簡單。


工具迴圈的標準流程

11. 使用者啟 server(python3 -m http.server / hugo server)
22. 執行者 navigate 到目標頁面
33. 執行者寫 evaluate fn 讀真實狀態
44. 執行者根據結果定位根因
55. 執行者改 CSS / JS
66. 執行者再 evaluate 驗證修復
77. 使用者目視最後確認(可選)

整個流程多數步驟在執行者這邊、使用者只在頭尾參與 — 對使用者負擔輕。


設計取捨:驗證工具引入的時機

四種做法、各自機會成本不同。這個專案選 A(推理 ≥ 2 次失敗主動提)當預設、其他做法在特定情境合理。

本篇是 #42 2 次門檻 抽象原則在「驗證工具切換」這個面向的應用。

A:推理 ≥ 2 次失敗主動提工具切換(這個專案的預設)

  • 機制:靜態推理連續失敗 2 次、立刻提「啟個 server、我用 playwright 看 live DOM」+ 附啟用步驟與預期收益
  • 選 A 的理由:對使用者透明(看到 trade-off)、縮短診斷迴圈
  • 適合:CSS / DOM 行為跟預期不符的除錯
  • 代價:執行者要主動辨識「推理迴圈成本」與「工具迴圈成本」的交叉點

B:等使用者要求才用工具

  • 機制:執行者繼續推理、使用者覺得太慢時提
  • 跟 A 的取捨:B 對使用者更被動、A 主動;B 在使用者不知道有 playwright 選項時、會一直繼續
  • B 才合理的情境:使用者明確表達「想用推理練習」、把工具切換當成放棄

C:全程靜態推理、不用工具

  • 機制:堅持推理到底
  • C 是反模式:推理迴圈成本累積、最後可能需要 4-5 輪才解決
  • 看起來吸引人的原因:覺得用工具是「能力不足」、想撐到自己想出來
  • 實際發生的代價:時間成本指數放大(每輪推理基於前輪錯假設)、最後還是要切工具

D:一開始就用 playwright、不嘗試推理

  • 機制:跳過推理、直接用工具量
  • 跟 A 的取捨:D 跳過推理階段省去 2 次嘗試、但前期 setup 成本投入比例較高(簡單問題不值得)
  • D 比 A 好的情境:問題明確需要 live DOM 才能診斷(例如「framework 渲染後的結構」)— 推理本來就無法解

判讀徵兆

訊號應該主動提的工具提的話術重點
推理 + 截圖溝通 ≥ 2 輪playwright browser_evaluate我假設可能錯、用工具讀 live DOM 確認
修了 CSS 但使用者截圖看起來沒變playwright getComputedStyle確認 CSS 真的套到、不是 cache 問題
不確定哪個 viewport 下會有問題playwright 多 viewport 測一次跑多 viewport、找出哪個壞
互動狀態下行為不一致playwright 模擬互動 + 量測自動操作、量結果
修好了想固化規範playwright 寫測試把這次發現的契約寫成 expect、未來破壞會被抓

核心原則:工具引入時機是「推理迴圈成本超過工具迴圈成本」的點 — 大多在第 2 次推理失敗時。早一點提、雙方都省時間。

#68 驗收的時間軸 的關係:本卡是「debug 工具切換時機」、#68 是「驗收動作分散在四個時點」 — 兩者共用「動作該分配到哪個時點才有 ROI」這個結構。本卡的「第 2 次推理失敗就切工具」≈ #68 的「ship 前要設計 E2E case」 — 都是「把高 ROI 的動作放在對的時點、不要延後」。