整合互斥規則集:抽共用 base、按層分離、把衝突顯性化成解析規則
論述基礎與限制
本卡抽自一次把三個彼此衝突的規則集整合成一套規則的實作:三個為不同神經類型(ADHD / 自閉 / 需求迴避)塑形 AI 輸出的 skill,各有一組規則、彼此部分重疊部分衝突,要合成一個不自我矛盾的 skill(見 神經多樣性方法論)。原則跨主題成立:把「規則集」換成互斥的 lint 規則、多來源的 API 契約、彼此拉扯的 stakeholder 需求、或任何「多套指令要合成一套」的情境,結構一樣。限制:本卡描述的是「規則可枚舉、衝突可逐條檢查」的規則集;規則集若本身模糊或動態演化,枚舉那一步會更難,但方向不變。
核心原則
整合多個部分重疊、部分衝突的規則集,要分層——別平鋪成一張清單。 平鋪的代價有兩個:共用的規則被重複寫 N 次(維護時漂移成 N 個略微不同的版本),衝突的規則互相抵消而沒人察覺(兩條看起來都合理的規則藏著一個矛盾,執行者踩到才發現)。分層把這兩個代價都消掉——共用的只寫一次,衝突的被逐一定位、指定處理方式。
分層是三步:
- 抽共用規則成永遠開啟的 base。 凡是每個規則集都要的規則,抽出來寫一次、當底層。門檻是「每個規則集都受益」,不是「多數規則集都有」——只有部分規則集要、另一部分可能反受其害的規則,留在它自己的層、不進 base(否則 base 就成了規則的聯集、把一個規則集的偏好強加給另一個)。這是 #44 SSoT 在「共用規則」維度的實例。
- 按作用層次把差異分到正交的層。 差異不是全部同構——有些規則管「輸出的形狀」,有些管「更上游的東西」(在案例裡是「任務用命令還是邀請提出」)。作用在不同層的規則多半正交、可自由疊加。判層要有一個可操作測試(案例裡是「把所有『要求對方做某事』的部分拿掉、規則還適用嗎」),但測試是啟發不是判準,會有騙過它的邊界案例。
- 把衝突逐一定位到「爭同一個決定」,顯性化成解析規則。 兩條規則若爭的是同一個決定(同一個位置只能取一個值),就是真衝突,要寫一條明確的解析規則(誰覆蓋誰),而不是讓它藏在清單裡。
反模式:平鋪清單讓衝突塌成隱形
把 N 個規則集的規則倒進一張清單,是 #125 Collapse 是隱形預設 在「規則集整合」surface 的具體形態:規則之間的「衝突維度」被 collapse 掉了。清單裡兩條規則「動作要用命令直給」和「動作要拿掉所有命令語氣」並排著,各自都合理,衝突只在執行者同時套用時才炸出來——而那時他已經在錯的組合上累積了成本。
分層的價值不是消除衝突,是讓每一組衝突從「藏在清單裡」變成「攤在檯面上、有指定的處理方式」。這跟 #75 主策略 + 補強策略 是一對:#75 講規則可以疊加(不衝突時怎麼組合),本卡講規則真的衝突時怎麼收斂。
招牌陷阱:把「搜尋結果」講成「結構定理」
分層會讓衝突變得可數,於是很容易接著宣稱「衝突只有一組」「其餘都能自由疊加」。這個宣稱幾乎總是被高估——它是搜尋不完整的產物,不是結構事實。
案例裡的初版方法論宣稱「硬衝突只有一組(動作措辭)、其餘規則不受影響」。一輪 steelman 審查(對抗性複核:預設宣稱錯、主動找反例)用作者自己的 enumeration 漏洞反證:作者在列「不受影響的規則」時,兩處都剛好漏掉了會衝突的那兩條規則——「只找到一組」是因為分析只檢查了最顯眼的那一組,沒有逐條枚舉所有規則對。實際上衝突不只一組,而且它們不是「有或無」,是排成一道光譜:從「需要一個全域開關」(衝突發生在每個位置)到「一次逐項讓步」(衝突只發生在少數規則交會處)。
這個陷阱是 #152 把設計選擇講成必然 的近親:「結構上只有一組衝突」把一個搜尋限制偽裝成結構定理,跟「天生就是」把設計選擇偽裝成自然法則同構——都躲過 review,因為它們讀起來像事實。修法一樣是還原真實地位:把「只有一組」改寫成「分析到目前只找到一組需要全域開關的」,明說這是枚舉的結果、不是不可能更多。
顯性化的真正價值也在這裡:它逼你逐條枚舉規則對,而枚舉那一步沒有機械方法、只能一條一條對。跳過枚舉、直接宣稱窮盡,就是 #126 多軸完整性 說的「單軸做深、systematic miss 對應軸」在規則整合上的樣子——衝突的完整性靠枚舉覆蓋,不靠把最顯眼那組分析得多透徹。
修法後的解析規則長什麼樣
衝突解析不是只有「覆蓋」一種力度。依「衝突發生在多少位置」決定:
- 全域開關:衝突發生在每一個某類位置上(案例裡每個動作的措辭),用一條全域規則一次解決最省——某 mode 開啟時,一律覆蓋另一條。
- 逐項讓步:衝突只發生在特定規則交會的少數位置,就地讓步比架全域開關划算——在那幾個點上,一條規則對另一條做局部退讓(案例裡「結尾給單一限時動作」對上「不施加時間壓力」,就地把限時動作改成可選起點)。
- 合成:兩條規則看似衝突、其實可以合成成一個同時滿足雙方的動作(案例裡「給單一路徑」對上「給真實選擇」,合成成「給選項、每項附一行判準」)。
要老實標明每一次讓步都是一次真實的規則退讓——「逐項讓步」和「全域開關」是同一種動作的不同幅度,差別只在覆蓋範圍,不是一個是妥協、一個不是。把小幅讓步說成「不算衝突、只是程度調節」,就又滑回把不利案例藏起來的老路。
跟其他原則的關係
| 原則 | 關係 |
|---|---|
| #44 SSoT:值的住址只能有一處 | base layer「共用規則只寫一次」是 SSoT 在規則集維度的實例;平鋪清單重複 N 次共用規則就是 SSoT 違反 |
| #75 主策略 + 補強策略:選擇不必互斥 | 一對 — #75 講規則不衝突時怎麼疊加,本卡講規則真的衝突時怎麼收斂;compose vs conflict 的兩半 |
| #125 Collapse 是隱形預設 | 平鋪規則清單把「衝突維度」collapse 掉、且因「一張清單比較簡潔」被當預設;本卡是 #125 在規則集整合 surface 的具體修法 |
| #152 教材把設計選擇講成選擇、不講成必然 | 招牌陷阱是它的近親 —「結構上只有一組衝突」把搜尋限制偽裝成結構定理,跟「天生就是」把設計選擇偽裝成自然法則同構、同樣躲過 review |
| #126 寫作 review 是多軸完整性、不是單軸深度 | 衝突的完整性靠逐條枚舉規則對(覆蓋)、不靠把最顯眼那組分析得多深;跳過枚舉直接宣稱窮盡就是單軸做深的 systematic miss |
| #90 L1 + L2 疊加時的訊號一致性 | 分層疊加後,各層對讀者講的話要一致;衝突解析(覆蓋 / 讓步)不能讓某層 silent 失效、留下 false confidence |
| #86 Capability gap 的三層對策階梯 | 同屬「分層 + 依情境選層」思路;#86 選對策層級,本卡選衝突解析的力度(全域開關 / 逐項讓步 / 合成) |
判讀徵兆
| 訊號 | 該做的事 |
|---|---|
| 要把多套規則 / 契約 / 需求合成一套、正打算倒進一張清單 | 先抽共用規則成 base(只寫一次)、把差異按作用層分開,別平鋪 |
| 一條「共用規則」其實只有部分規則集要、另一部分可能反受其害 | 它不屬於 base,退回它自己的層;base 的門檻是三者都受益、不是多數有 |
| 整合完宣稱「衝突只有一組」「其餘自由疊加」 | 這幾乎總是搜尋不完整——逐條枚舉所有規則對再說,並把「只有一組」改成「只找到一組」 |
| 想把一個小衝突歸成「不算衝突、只是程度調節」以保住「只有一組」 | 那是把不利案例藏起來;承認它是一次小幅讓步,跟全域覆蓋同類、只是幅度小 |
| 分層疊加後兩層對讀者講的話不一致 | 補一致性(見 #90):覆蓋 / 讓步後要讓每一層的訊號仍然對得上、不 silent 失效 |