跳至主要内容

ADR-017: RPT 以參數介面作為對外契約

ADR 編號: 017 狀態: 已採納 (Accepted) 提案日期: 2026-10-01 決策日期: 2026-10-01 最後修訂: 2026-10-04 決策者: 團隊 peer review:兩輪通過(第 1 輪 3 條 major,第 2 輪全數落實) 範圍: RPT 報表規格、/report、/us 引用 RPT 的方式、報表與 US 的測試分工

摘要​

RPT 與 US 的責任原本已經分開:US 以 depends_on 單向引用 RPT,範本與合成資料驗證不需要 US。但 RPT 範本只在「輸入與資料來源」以一段敘述帶過「參數」,沒有可對接的介面。US 引用報表時只能自行理解 RPT 內部,兩者因此容易耦合;同一份報表也難以給排程或對外 API 重用。

本決策讓 RPT 以參數介面作為唯一對外契約。US 與其他呼叫端只依參數介面產生文件,不依賴報表內部的資料取得與排版。

決策​

依賴分層​

層依賴測試方式
範本只依賴輸入模型合成輸入
資料 adapterDomain Model 與資料存取可重複的資料庫測試資料
參數介面呼叫端唯一依賴的契約參數規則、範圍、容量、錯誤契約
引用的 US只依賴參數介面畫面操作到參數的對應、授權、job/下載流程

參數分兩類​

  • 業務參數:使用者或呼叫流程選擇,例如期間、客戶、狀態、排序。
  • 呼叫情境:呼叫端依授權結果填入,使用者不能直接指定,包括可見資料範圍、快照時點、時區、語系、請求者。

RPT 不判斷誰有權限,只輸出呼叫情境給定範圍內的資料;缺少範圍時拒絕產生,不以「全部」代替。快照時點與時區一律為明確參數,不隱含使用伺服器時鐘或使用者語系。

資料範圍的驗證責任​

  • 範本階段以合成輸入驗證輸出。
  • 接入正式資料 adapter 後,由 RPT verify 以同時含範圍內外資料的可重複資料庫測試資料,經 adapter 實際查詢,驗證範圍條件確實套用於查詢。只驗證傳入的範圍值或已篩好的 fixtures 不能證明。
  • 引用的 US 只驗證呼叫情境填入正確,不重驗查詢與文件內容。

容量分三層​

層判定時點
參數上限(期間長度、選取數量)產生前
取數上限(實際筆數)adapter 受限取數,例如最多取上限加一筆
輸出上限(頁數、檔案大小)排版時

另區分處理門檻(超過時改走非同步)與硬上限(同步或非同步都拒絕);改走非同步不能突破硬上限。

2026-10-04 修訂:明訂執行方式(已採納)​

以上保留 2026-10-01 的決策歷史。本次修訂將處理門檻限定於 RPT 已宣告雙模式且自動選擇的情況; 每份 RPT 明訂 execution_modes、execution_default 與選擇規則,僅同步/僅非同步不設切換門檻。 允許更嚴格的模式專屬上限,超出只拒絕本次指定模式,不視為自動選擇或已建立 job; 共同硬上限仍對所有模式生效。可改選 async 的拒絕代碼只適用規格確實支援且符合 async 限制的情況。 容量硬上限對所有模式生效;等待逾時不自動授權建立 job、改模式或重試。 欄位及交付/取消責任的權威定義見報表規格指南「執行方式」 (docs-methodology/specs/report-specification.md)。產品 API 承接路由、授權及工作生命週期;HTML+CSS 繼續定義版面。

考量的方案:沿用隱含「超門檻必須非同步」會讓單一同步報表被迫建立背景流程; 把模式只留給產品 API 又使 RPT 無法表達支援邊界。因此由 RPT 定義允許的方式,由產品契約承接操作。 未採 US 流程時沿用專案既有產品需求與 API 規格,不虛構 US/Epic/SBE。

版次​

revision 是表單內容版次,涵蓋整份 RPT 契約:參數介面、計算、輸出內容或版面任一改變都遞增,並以 /impact 檢視引用的 US。是否修訂 US 依影響分析判定,不因參數形狀不變就推定無影響:

  • 參數介面不相容:修訂 US 的參數對應。
  • 呼叫端依賴的輸出語意改變(計算、欄位意義):修訂 US,並依 m-change-management.md 處理。
  • 分析後無影響:US 只更新記錄的 revision,屬追溯更新,不重述或重驗 RPT 內容、不觸發階段回退。

考量的方案​

方案結論理由
A. 維持現狀:參數只在「輸入與資料來源」敘述不採用US 沒有可對接的契約,只能理解 RPT 內部;變更影響無從判定
B. 參數介面作為 RPT 的正式一節(本決策)採用契約集中在權威指南與範本,不新增 rule 檔;rules 只加交叉引用
C. 另立獨立的報表介面規格文件不採用與 RPT 一對一,拆檔只增加同步負擔
D. 由 RPT 自行判斷權限不採用授權屬產品流程;RPT 判權會把 US 的責任拉回報表,並讓排程等無使用者情境無法表達

影響範圍​

檔案變更
docs-methodology/specs/report-specification.md「與 US 的責任」以參數介面為分界;新增「參數介面」節;驗證與交付補參數介面與兩段範圍驗證
docs-methodology/specs/README.mdRPT 範本新增「參數介面」節
.claude/skills/report/SKILL.md1.1.0:spec 先定參數介面;impl 入口只接受參數介面、依三層判定容量;verify 涵蓋參數介面與正式 adapter 範圍測試;status 新增該項
.claude/skills/us/SKILL.md引用 RPT 時記錄驗收時採用的 revision、參數對應與呼叫情境來源
.claude/rules/m-dev-guardrails.md、m-methodology.md交叉引用

非目標​

  • 不修改 evidence.py:helper 仍只核對指紋與 JUnit 結果,不判斷測試涵蓋的業務語意。
  • 不修改 /impl 的上游變更偵測。
  • 不在本決策中修訂既有 RPT。

審閱裁決​

審閱方未裁決以下待決點,已轉為 follow-up:

待決點處置
既有 RPT-001 是否補上參數介面FU-111
參數測試的涵蓋是否由 evidence helper 強制FU-112
/impl 上游變更偵測是否改為比對 US 記錄的 RPT revisionFU-113

相關文檔​

變更歷史​

日期內容
2026-10-01初版;第 1 輪依 3 條 major 補明正式 adapter 範圍測試責任、容量三層與處理門檻、版次與影響判定;第 2 輪通過
2026-10-04已採納執行方式修訂:RPT 明訂支援模式、預設、選擇規則與模式專屬上限的拒絕語意;保留原決策歷史。20261004-report-execution-modes 第二輪審閱通過