語意錨用單一字串、同義雙名讓引用修復退回人腦對應
結論
一個結構單位的語意名稱只能有一個 canonical 字串、所有引用使用同一字串。「決策收斂」跟「決策記錄 + scaffold 建議」都是語意名、都通過了「不用編號」的檢查 — 但兩個字串指同一個階段、語意引用的收益就漏了一半:工具掃描要掃兩個 pattern 才完整、漏配置一個就漏一半引用點;結構重排時、修復者要先在腦中建立「這兩個名字是同一個東西」的對應表、而這張表沒有寫在任何地方。
語意引用的承諾是「錨點穩定、且機器與人都能單次比對」。同義雙名保住了穩定、丟掉了單次比對 — 等於把 fact 寫成兩種拼法。
為什麼雙名會自然發生
雙名通常在不同檔案、不同時間寫下:標題在設計流程時取(描述產出物:「決策記錄 + scaffold 建議」)、引用在寫協作檔時取(描述階段角色:「決策收斂階段」)。每一次取名都在自己的當下語境裡合理、分裂要把兩個時間點的產物擺在一起才看得到 — 單檔 review 永遠只看到其中一個名字、所以雙名能安然通過所有單檔檢查。
偵測需要跨檔視角:把每個結構單位的「標題語意半邊」列成清單、grep 全部引用句、比對引用字串是否落在清單內。引用字串語意對、字面不在清單內、就是雙名。
反模式與修法
| 反模式 | 修法 |
|---|---|
| 標題「Stage 5:決策記錄 + scaffold 建議」、引用「決策收斂階段」 | 二選一、全 repo 統一(標題改「Stage 5:決策收斂(決策記錄 + scaffold 建議)」、引用維持「決策收斂」) |
| 「domain / event 切分」與「領域切分」混用 | 取標題語意半邊為 canonical、其餘出現點改寫 |
| 縮寫與全名並存當引用錨(「ops 階段」「操作維運階段」) | 全名為 canonical、縮寫只出現在已建立對應的同段內 |
修法的判斷次序:canonical 字串取「標題的語意半邊」(標題是該單位的 fact 所在);標題語意半邊太長不適合引用時、先改標題、再統一引用 — 標題改短是一次成本、引用各自簡寫是持續發散。
跟其他抽象層原則的關係
- #155 引用章節用語意標題、不用位置編號:本卡補 #155 的缺口。#155 把錨點從編號換成語意名稱、預設了「語意名稱是單一的」;雙名讓 #155 的修法只完成一半 — 錨點穩定了、可比對性沒跟上。三卡合起來是完整的引用紀律:#155 管引用端(錨什麼)、#156 管命名端的內容(名稱不含 derivation)、本卡管命名端的唯一性(一個單位一個字串)。
- #156 集合命名用角色、不內嵌數量:sibling。#156 處理名稱「內容」的 fact 純度、本卡處理名稱「數量」的唯一性 — 一個名稱可以通過 #156(不含成員數)仍違反本卡(有同義變體)。
- #44 Single Source of Truth:同一語意身分的兩個字串就是同一個 fact 的兩個源 — 比值的多源更隱蔽、因為兩個字串「語意上相等」、讀者看不出這是違規、只有工具比對才會痛。
- #84 Naming 是 iterated artifact:#84 的輪 3 明文檢查「同一個概念在不同檔案用同名嗎」、判讀徵兆也列了「同概念出現兩個以上名字、選一個改另一個」— 本卡是這個檢查項在「結構單位的標題與引用」場景的應用:被檢查的從變數名換成章節 / 階段的語意錨、檢查動作相同。
觸發 case
一份多階段訪談 skill 在一致性 audit 中被抓到兩處:階段標題寫「決策記錄 + scaffold 建議」、兩個協作檔的引用寫「決策收斂階段」;另一個階段的引用在「domain / event 切分」與「領域切分」之間混用。每個字串單獨檢查都合規(語意名、無編號、無數量)— audit reviewer 的原話是「語意可對上、但嚴格來說引用錨與標題語意半邊不同字串、下次重排時要靠人腦對應」。修法:標題語意半邊改成「決策收斂」、全 skill 引用統一;「領域切分」全部改寫為「domain / event 切分」。
判讀徵兆
- 寫引用句時、回頭看目標標題:引用字串跟標題語意半邊逐字相同嗎?語意相同、字面不同 = 雙名。
- 跨檔 review 可操作:列出所有結構單位的語意半邊、
rg每個單位的引用句、引用字串不在清單內的逐處判讀。 - 同單位的引用在不同檔案用不同說法、且沒有任何一處寫明對應 — 雙名已經發生、統一的成本隨引用點數量成長。