D-20260727-01|sources 雙向硬閘¶
背景與驅動力¶
ADR 制度(D-20260724-03)把 sources 定義為
「日期+標題前段」,但驗證只做到「非空」。一個從未被機器執行的欄位定義,結果是資料一路
漂離規則:120 個決策檔中 16 條 sources 不符定義——多數是人類讀得懂的標題縮寫,一筆指向
corpus 內根本不存在的工作階段名,兩筆的前綴同時命中兩條條目。
同一個盲區還有更嚴重的後果:五個決策檔在完全沒有流水帳條目的情況下通過了全部檢查,直到
人工稽核才發現。次級候選依裁決併入既有決策時,當初只規定「原條目補 ID 引用」、未規定
parent 回填 sources,於是三筆併入只有條目端的單向引用——從決策檔那一側看不出它曾吸收
第二條條目。
考慮過的選項¶
- 維持
sources為敘述欄位,只加「每個決策至少被一條條目回引」的硬閘:能補住孤兒決策的 洞、成本為零,但sources會永遠是無法驗證的裝飾欄位,長期漂到沒人敢信。棄。 - 放寬定義以容納既有縮寫(例如改判子字串命中即可):等於把「人讀得懂」寫進規則,判斷 空間留給每個貢獻者——那正是漂移的來源。棄。
- 資料向既有定義收斂,並把
sources與回引升為雙向硬閘(採納)。
決定¶
sources每一筆都是某條歷史條目標題的字面前綴(比對時忽略空白與標點),且必須在 該日條目中唯一解析;撞名時補長到可區分為止。縮寫與工作階段名都不合格。- 雙向一致:
sources指到的條目必須以決策檔行回引該 id;條目回引的 id,其sources也必須列出該條目。 - 一次裁決吸收多條流水帳條目時,每一條都要進
sources,不留單向引用。 - frontmatter 的關聯性 metadata 允許回填與更正,決策本文仍不可變——本輪 18 個決策檔
的 19 條
sources依此執行,未動任何決策本文。 - 以上全部由
check:decisions執行,違反即紅燈;制度細節見 README.md。
後果與影響¶
決策層與流水帳層的連結第一次是機器驗證的雙向關係:孤兒決策、掛錯條目的回引、指向不存在
條目的 sources,都會在 CI 當場顯形,不再依賴人工稽核或一次性腳本。
代價是 sources 與歷史條目標題形成刻意的耦合——改標題會讓相關決策檔紅燈。這是有意的:
流水帳條目標題本來就被宣告為穩定錨(首批升格回寫時即記明「標題不動、錨點穩定」),本
規則等於替那條一直沒有守衛的不變式補上看守。真要改標題時,紅燈會逐一列出需要同步的
決策檔,成本可見且有界。