我們派 AI 去推翻自己的結論,然後它們成功了
2026 年 8 月初,我們把六條脈衝攻擊的頭條結論交給獨立代理,唯一的指令是「證明它是錯的」。結果三條推翻、兩條降級、只有兩條站得住。
#結果
| 原結論 | 裁決 |
|---|---|
| 時間結構幾乎不影響總得手(15 格差 1.81 倍) | 說太滿 |
| 盲區的影響遠大於攻擊者參數選擇 | 說太滿 |
| 盲區超過 0.5–0.75 後脈衝不如持續作惡 | 推翻 |
| 加大稽核救不回有盲區的情況 | 推翻 |
| 一次被抓 = 永久除名 | 說太滿 |
| 等預算下 crude 策略勝過脈衝 | 推翻 |
六條裡三條推翻、兩條降級。 兩條保留下來的正向結論,都在我們的分析紀律裡寫成了規則。
#為什麼這麼容易錯
因為我們在寫報告時,下意識地把兩個相關的因子當成正交的維度。三組例子:
| 我們以為是 | 實際上 |
|---|---|
| 時間結構 vs 總得手 | 總得手 = 曝光 × 效率,兩者反向抵消 |
| 盲區 vs 抽樣率 | 三個因子是同一個乘積裡的項 |
| 時機 vs 作惡次數 | 我們的「等預算」沒有綁住預算 |
#最難查的一條:靠退化端點撐著的結論
「盲區的影響遠大於參數選擇」這條,複驗代理的發現是:
盲區與時間結構有強交互作用(雙因子分解 η² = 0.264,是時間結構主效應的 4 倍),所以「真正的變數是 X」這個句型本身不成立。
而且原始數字幾乎全靠一個退化的端點撐著:
| 排除 blind = 1.0 之後 | |
|---|---|
| pulse 的盲區效應 | 8.9 倍 → 3.28 倍 |
| patient 的盲區效應 | 54 倍 → 5.68 倍 |
如果量具在端點退化,量出來的數字最漂亮,也最沒有資訊。 這條後來被寫成分析紀律第二條。
#一個統計工具的 bug 被抓到
複驗過程中還抓到一個我們沒預期的問題:wilcoxon_signed_rank_exact 的常態近似分支重複計算了平手修正。
| n = 30,20 正 10 負 | |
| 程式說 | p = 0.0288(顯著) |
| 精確值 | p = 0.0987(不顯著) |
這不是研究者的錯,是工具的錯。但它的危險在於——它會安靜地把不顯著變成顯著。
同一批被查出來的還有:bootstrap CI 用 Python 內建的 hash() 當種子,所以同一份資料在不同行程跑出 53,478 與 1,628 兩個數字。
#三條保留下來的正向結論
複驗不是只有破壞。兩條結論經住了攻擊,而且它們比原來的六條更強:
#1. 偵測機率是單一乘積
P(抓到) = (1 − 盲區 β) × 抽樣率 p × 稽核準確率
三個因子共軸。這不是一個發現,是一條規則——但它是我們在三次不同的錯誤裡各自學到的。
實測支持:盲區 0.5 時稽核率 0.1 → 1.0 使攻擊者總得手下降 82%(Wilcoxon p = 5.5e-6);稽核 0.5 → 1.0 剛好抵銷 50% 盲區(配對差 0.03、p = 0.78)。
#2. 交互作用 η² = 0.264
盲區 × 時間結構的交互作用是時間結構主效應的 4 倍。這直接推翻「盲區是唯一真正的變數」這個句型。
#這個做法的成本
誠實地說明一下:
| 代理複驗花了什麼 | 每條結論一次獨立工作流,重讀原始 JSONL |
| 它會不會錯 | 會。 我們保留它的裁決權,不自動接受 |
| 它漏了什麼 | 兩條結論至今未被複驗(反應延遲、選擇性攻擊的集中度) |
最後一項很重要:複驗不是全知。 代理給了六條裁決,其中兩條我們自己標成「未複驗」,因為複驗代理也沒碰它們。

