下游持有上游資料的 id 時,有兩條策略:凍結參照(寫死 id,後續操作直接使用)和活解析(以跨操作不變的識別鍵在查詢時動態解引用,取得當前有效的 id)。凍結參照在上游重建資料後失效;由測試餵資料的 stub 同時控制凍結值與回應資料,讓「id 失效」的狀態無法在測試中出現——這與 mock 遮蔽是不同層次的盲區,遮蔽來自假設而非協議。

概念位置

凍結與活解析的分野是狀態所有權問題:凍結參照假設上游資料的 id 在下游生命週期內不會改變,活解析承認 id 可能失效、改由穩定的業務鍵重新定位。這個區分跨越測試與領域設計——領域層決定哪些 id 會被上游操作重建(合併、拆分、歸檔),測試層要覆蓋「重建後舊 id 指向已刪除資料」的劇本。使用語意級假後端自身模擬重建行為,是讓這類劇本可測的前提。

可觀察訊號與例子

操作在特定條件後全部靜默失敗(回寫目標不存在),且單元測試全綠。典型案例:後端合併兩張單據時重建全部明細並更換 id,前端凍結的舊 id 全部指向已刪除資料(T.C5)。修復同樣受盲區支配——第一版只處理單據層 id、遺漏明細層,因為明細 id 在測試裡從未死過。

設計責任

測試設計要回答「哪些上游操作會讓凍結的 id 死亡」,並把每個死亡路徑做成測試劇本。用有狀態的假後端取代 stub(假後端自行模擬重建行為)才能讓活解析邏輯在測試中被真正驅動。「什麼會變、什麼不變」是事實問題——合法出處是可驗的契約文件或一次實測取證,推理與記憶都不算出處。跨邊界的 id 存活規則同時是領域設計的責任範圍。