D-20260708-03|fold 層統一決定性守門¶
背景與驅動力¶
ledger 儲存接線初版的收斂設計 =「live 拒收記 session 集、refold 沿用該集跳過」——但 session 集是本機私有狀態:同一條 log,先上線 peer 曾拒的超窗事件,晚同步的 peer 會照收 = 跨 peer derive 分叉面,違反「無論何時同步、收斂一致」。同輪並抓到 refold fire-and-forget 與後續 ingest 非同步交錯的 lost update 競態。里程碑 6b-2 同日複審修正。
考慮過的選項¶
- live 拒收記 session 集、refold 沿用(初版):本機私有狀態決定 fold 結果 = 跨 peer 分叉。
- fold 層統一決定性守門(採納):守門條件全部可由事件自身與時間推進判定。
決定¶
- fold 層統一決定性守門:shape 檢查 + 單簽 timeless 驗章 + 未來時戳排除——未來戳放行會把 consensus clock 推向未來、癱瘓全部 time-based derive;各誠實 peer 於各自 fold 時刻同判定 = 時間推進下收斂,近未來戳造成的檢查點重算兩造短暫不一致 → 拒簽重試 fail-closed。
- live 收件拒收只擋即時 fold 與通知;session 拒收集移除(業務級量化拒收 =apply 守門承接)。
- 狀態變更(ingest/refold)全走單一佇列序列化、讀取端 drain 佇列後讀,消滅 lost update。
- 現況見 程式架構/ledger.md。
後果與影響¶
「任何 peer 任何時點同步同一條 log= 同一個 state」自此為 fold 設計不變式;多簽事件的同型守門(D-20260708-05)與跨模組守門原則(D-20260709-02)皆承此而來。