跳轉到

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 與歷史條目標題形成刻意的耦合——改標題會讓相關決策檔紅燈。這是有意的: 流水帳條目標題本來就被宣告為穩定錨(首批升格回寫時即記明「標題不動、錨點穩定」),本 規則等於替那條一直沒有守衛的不變式補上看守。真要改標題時,紅燈會逐一列出需要同步的 決策檔,成本可見且有界。