iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
AI Engineering

同一把尺,30 天橫評 AI Agent Skill:從單篇實測到一份能查的選用指南系列 第 14 篇

Day 14 | superpowers:把「除錯先查根因」寫成規則的技能包

  • 分享至 

  • xImage
  •  

今天想介紹 superpowers,官方 marketplace 裡的一個技能包,很紅,我自己平常也開著用。它要解決的問題很具體:工程師都知道「修 bug 前要先找根因」「動手寫程式前要先想清楚需求」這些道理,但道理歸道理,趕時間的時候還是會抄捷徑。superpowers 的做法,是把這些原本只存在於資深工程師經驗裡的判斷,寫成一套會在每次對話自動生效的明文規則。

superpowers 技能包:14 個技能,1 條鐵律

這個包能幫你做什麼

打開 skills/ 目錄,裡面有 14 個技能,對應開發流程的三個階段:

  • 決定方法:brainstorming(動手前先釐清需求)、writing-plans(把需求變成計畫)、systematic-debugging(拿到 bug 先做根因調查)。
  • 照著方法做:executing-plans、subagent-driven-development、test-driven-development、using-git-worktrees。
  • 決定怎麼收:requesting-code-review、receiving-code-review、verification-before-completion、finishing-a-development-branch。

這幾個技能各自處理的情境也講得很具體。例如 receiving-code-review 的用途是「收到 code review 意見時,先判斷意見合不合理,再決定要不要照做」,特別提醒「不是表演式的照單全收」;dispatching-parallel-agents 用在「兩個以上互不相依的任務」,教的是怎麼判斷任務能不能拆開平行處理;verification-before-completion 則是在「要宣稱工作完成、修好了、測試過了」之前,先強制要求真的跑一次驗證指令,不能憑印象下結論。這套包想解決的,是很多工程紀律其實大家都「知道」,但知道跟每次都做到,中間有一段落差。

另外兩個是特殊角色:using-superpowers 是整套的入口,負責在每次對話一開始就把「該用哪個技能」的判斷邏輯釘進系統提示;writing-skills 則是給想自己擴充這套技能包的人用的。這些技能不是各自獨立、想到哪個用哪個——using-superpowers 裡有一條「Skill Priority」規則,講明「多個技能都適用時,決定方法的技能要排在前面,再讓執行類技能落實」,設計上是一整套會互相接力的系統。

今天先介紹 systematic-debugging,因為修 bug 是最泛用的任務類型,也最容易講清楚它到底在教什麼、值不值得用。其他幾個(test-driven-development、writing-plans、verification-before-completion)留到之後找合適的任務再介紹。

systematic-debugging 在教什麼

它的核心主張,原文照抄:「Iron Law: NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST」——沒完成根因調查,不准提修法。具體拆成四個階段:

  • Phase 1 根因調查:讀懂錯誤訊息、穩定重現、檢查最近改了什麼;多元件系統要先加診斷紀錄,看問題出在哪一層,再往上追資料流。
  • Phase 2 找模式:比對能動的類似程式碼,列出所有差異,不假設「這應該不重要」。
  • Phase 3 假設與測試:提出單一假設,做最小改動驗證,錯了就換假設,不要在同一個地方疊加修法。
  • Phase 4 落地:先寫一個會失敗的測試,只修根因,驗證,如果連續 3 次修不好就要停下來懷疑架構本身,不是繼續猜第 4 次。

比較特別的是它還內建一張「合理化清單」,列出十幾種「聽起來很合理但其實是在偷懶」的念頭,每一條配一句反駁:例如「這只是個簡單問題」對應「問題也是任務,一樣要照流程」,「我先看一下 git/檔案就好」對應「檔案沒有對話脈絡,一樣要照流程」。這張清單本身就說明了這個技能的設計立場:除錯最大的敵人不是不會查,是「想直接動手改一行試試看」的衝動。

systematic-debugging 的四個階段

這套規則怎麼確保自己會被用到

光有一份寫得很好的除錯指南沒有用,如果沒人記得去讀它。superpowers 處理這件事的方式,是靠 using-superpowers 這個入口技能,在每次對話一開始就把調度規則寫進系統提示,而不是留著等人「有需要再查」。它的用字很重:「IF A SKILL APPLIES TO YOUR TASK, YOU DO NOT HAVE A CHOICE. YOU MUST USE IT. This is not negotiable. You cannot rationalize your way out of this.」——如果一個技能適用,沒有選擇,一定要用,不能商量。

具體的優先序寫得很清楚:「"Fix this bug" → superpowers:systematic-debugging first, then domain skills.」看到「修 bug」這種任務描述,先用 systematic-debugging,其他技能之後才輪得到。前面提過的合理化清單裡,也預先設想了最可能被用來迴避這條規則的念頭,例如「我先看一下 git/檔案就好」,反駁是「檔案沒有對話脈絡,一樣要照流程」。文件裡還特別列出不同 harness(Claude Code、Codex、Pi 等等)各自的操作說明,可以看出設計者很清楚「光靠文字寫死『你一定要用』」在不同工具上落實方式還是得個別處理。

規則寫得這麼完整,理論上該是這類技能包最值得學的一課——用系統提示層級的強制力,取代「希望使用者記得用」的僥倖。這也是今天想實際測一次的地方:這套調度機制,在真的碰到規則指名的情境時,實際的把握度有多高。

using-superpowers 的強制調度規則

找一個真的能檢驗根因的 bug 來試

要驗證「先查根因再修」這件事有沒有發生差別,需要一個修法看起來很直覺、但真正的根因藏在別處的 bug。我寫了一段簡化過的 session 管理程式:

class SessionManager:
    def __init__(self):
        self.sessions = {}

    def create_session(self, user_id, seed_actions=[]):
        history = seed_actions
        history.append(f"login:{user_id}")
        self.sessions[user_id] = history
        return history

    def log(self, user_id, action):
        self.sessions[user_id].append(action)

    def report(self, user_id):
        return self.sessions[user_id]

create_session 用了 Python 一個經典陷阱:可變的預設參數 seed_actions=[] 只在函式定義時建立一次,之後所有沒有明確傳入 seed_actions 的呼叫,都會共用同一個 list。實際重現:alice 登入、操作一次,接著 bob 登入,兩人的紀錄變成完全一樣的合併結果,連後來新建的第三個帳號也會被污染。

這剛好符合 systematic-debugging 自己講的使用時機——「Use for ANY technical issue... Use this ESPECIALLY when... 'Just one quick fix' seems obvious」,一個看起來可以馬上改一行解決、但真正原因藏在「為什麼會共用」這層的問題,正是這個技能存在的理由。

測試用「使用者回報」的方式包裝任務,不提示原因:「這是我們一個簡化過的 session 管理程式,正常在跑。使用者回報一個很奇怪的問題:兩個不同帳號各自登入後,其中一個帳號的操作紀錄裡卻出現了另一個完全不相關帳號的紀錄。麻煩幫我修好這個問題,順便說明一下原因,並且證明你修好了。」一組在沒裝 superpowers 的環境跑,另一組先啟用這個 plugin,再用全新的 headless 行程跑一次,其他條件完全一樣。

兩組修法幾乎一模一樣

先講結果:兩組都正確找到了根因,也都用同一種寫法修好。

沒裝技能包那組的診斷:create_session 有兩個問題疊在一起——可變的預設參數 seed_actions=[] 只建立一次,所有沒傳參數的呼叫共用同一個物件;history = seed_actions 又沒有複製,所以存進去的其實就是那個共用的 list。修法是把預設值換成不可變的 (),再用 list(...) 複製一份。這組還另外寫了測試檔,先跑在修前的備份版本上確認 3 個測試全部失敗,再跑在修好的版本上確認全部通過,兩相對照才下結論。

裝了 superpowers 那組的診斷幾乎一字不差:同一個根因,同一個修法(seed_actions=() + list() 複製),連「呼叫端如果共用同一個 seed list 也會出事」這個附帶發現都一樣抓到了。這組也寫了測試,也做了修前修後對照,兩個測試在修前都失敗、修後都通過。兩邊的測試檔我都重新跑過一次,數字都對得上。

單看這個結果,「裝不裝這套技能包,最終產出沒有差別」——這本身是值得記的一點,但還不是這次測試最重要的部分。

規則說該發生什麼,跟我實測到的,中間斷在哪裡

調度規則在這次執行裡,並沒有真的被用到

兩組修得一樣好,讓人好奇裝了 superpowers 那組,systematic-debugging 的四階段流程到底有沒有真的跑過一遍。headless 模式的文字輸出看不出這件事,所以我去查了那次對話的完整紀錄——Claude Code 每次對話都會存一份 JSONL 逐輪記錄,可以看到每一步實際呼叫了什麼。

結果是沒有。搜尋整份記錄,Iron Law、Phase 1 這類只會出現在 systematic-debugging 技能檔案裡的字句,一次都沒出現過,代表這個技能的內容從頭到尾沒有被讀進去。技能包的名字出現了 9 次,但都只是 using-superpowers 那條調度規則裡列出的技能清單和「修 bug 先用這個」那條規則本身的文字,不是技能真正被呼叫後注入的內容。整段對話的六次工具呼叫——讀檔、重現問題、改程式碼、寫測試、兩次驗證——沒有一次是在讀取或叫用某個技能。第一步做的事,是直接讀檔案看程式碼,這正好對上規則裡預先設想、明講要攔下來的那條合理化:「我先看一下 git/檔案就好」對應「檔案沒有對話脈絡,一樣要照流程」。

換句話說:規則寫得斬釘截鐵、甚至預先設想了最可能的偷懶藉口,但這次實測下來,那個被明講禁止的捷徑還是被選走了,只是任務最後剛好做對,讓流程沒被照做這件事不容易從結果看出來。

結果一樣好,但只有一邊被要求要照流程走

我們的觀點:這對你有什麼用

  • 裝了 superpowers,不代表某個技能這次真的會被用到。 它的強制力來自寫進系統提示的文字規則,不是程式碼層級的攔截,最終產出對不對,跟規則有沒有真的被照做是兩件事,光看結果分辨不出來。
  • 想確認某次任務有沒有真的用到技能,看有沒有照規則「announce」。 規則明講要說「Using [skill] to [purpose]」,這句話有沒有出現,是比「結果對不對」更可靠的檢查點。
  • 任務結果正確,不能反推流程有被遵守。 這次修法完全正確、測試也寫得很扎實,只看最終產物完全看不出技能其實被跳過了,要判斷流程對不對,得去翻對話紀錄。
  • 這類「文字規則」型的強制力,天生就有被繞過的空間,規則寫得再兇也一樣。 using-superpowers 那份文件已經用盡各種方式強調「不能商量」,也預先列出最可能的偷懶藉口逐條反駁,這次實測顯示,這些手段降低不了繞過的機率到零。如果工作流程真的需要「一定要照四階段除錯」這種保證,光裝這個技能包還不夠,得自己另外找方法驗證。
  • 值得養成的習慣,是偶爾翻一次對話紀錄,對照規則寫的跟實際做的是不是真的一致。 只看輸出容易覺得「兩邊差不多,應該有照規則走」,這次差異其實藏在過程裡,不是結果裡。
  • 這套技能包本身的設計價值不會因為這個發現而打折扣。 四階段除錯流程、合理化清單、「先寫失敗測試再修」這些內容本身寫得很扎實,值得自己讀一遍當作除錯 checklist;今天測到的問題是「強制力有多可靠」,不是「內容好不好」,兩者要分開看待。

誠實交代這次測試的限制

  • 樣本數是 1 個 bug、1 次執行,這次「技能沒被叫到」是不是常態、機率多高,沒有像 Day 13 那樣重跑幾十次去量,這是可以之後補的驗證。
  • 這次用的是 headless(claude -p)模式,互動模式下(一般在終端機裡打字對話)技能的呼叫行為有沒有不同,沒有對照測過。
  • 這個 bug 剛好是模型很熟悉的經典 Python 陷阱,兩邊都答對了,代表這次的題目沒能測出「照著四階段走」跟「憑直覺跳著做」在結果品質上的差異——如果換一個模型不那麼熟悉、需要真的多次假設驗證才能收斂的疑難雜症,兩者的落差可能會完全不同,這點留給以後用更難的題目測。
  • 判斷「技能沒被叫到」的依據是搜尋逐輪記錄裡有沒有出現技能檔案的特徵文字和工具呼叫,這是目前能拿到的最直接證據,但不是 Anthropic 官方公開文件對「技能已呼叫」的定義,換一個判斷方式結論可能需要重新確認。
  • 只測了「一次很直接的 bug 修復任務」這一種情境,using-superpowers 規則裡點名的另一種情境「Let's build X → 先用 brainstorming」完全沒測到,這條規則在別的任務類型上守不守得住,今天的結果沒辦法回答。
  • 沒有測到「規則真的被照做」時,最終品質會不會因此更好或更穩定。今天兩組結果一樣好,剛好是規則沒被照做也不影響品質的案例,不代表規則本身沒有價值——換一個模型不熟悉、容易走偏的疑難雜症,照著四階段走說不定能少繞很多路,只是這點今天沒有題目能測出來。

跟前面幾天放在一起看

這次的發現剛好跟這系列 Day 1 的第一個結論繞回了同一個點:「任務做對」跟「技能被叫到」是兩件獨立的事。Day 1 測的是自己維護的 Atomic Commit skill,裝了跟沒裝,成功率一樣,只是技能真正被叫到的次數少了一半;十四天後介紹 superpowers 這種號稱「不能商量」的強制調度技能包,得到的還是同一個結論,只是這次規則寫得更兇、更明確預告了會被繞過的方式,繞過還是照樣發生。這代表這件事不是哪個技能設計得不夠好,是「用文字規則要求模型一定要做某件事」這整個機制本身就有這個侷限,規則寫得越用力,也只是把被繞過的方式變得更難猜,不是把繞過的機率變成零。

superpowers 裡還有 test-driven-development、verification-before-completion、brainstorming 這些候選,之後找到合適的任務會再回來介紹。如果你也在用這套技能包,這篇最值得帶走的大概不是「systematic-debugging 好不好用」——它教的東西很扎實——是多一個習慣:偶爾回頭翻一次對話紀錄,看規則寫的跟實際做的這次是不是真的對得上。


上一篇
Day 13 | 性質測試最值得學的一課,不是「讓亂數幫你找 bug」
下一篇
Day 15 | test-driven-development:規定「沒有失敗的測試就不准寫程式」的技能
系列文
同一把尺,30 天橫評 AI Agent Skill:從單篇實測到一份能查的選用指南 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言