D-20260703-03|房間 pin 檢查點政策:正式檢查點+72 小時上限+idle guard¶
背景與驅動力¶
版本規範原文寫房間 pin「host 觀察到的 log head」,把兩個不同物件畫上等號——檢查點是 24 小時間隔的治理多簽 LedgerCheckpointEvent,log head 只是任意日誌頭。另外升版自動套用與 24 小時強制升版沒有「比賽中」防護:minor 兩分鐘後自動 skipWaiting+reload,賽中 reload 等於異常斷線扣信譽 +forfeit。三輪複審再補一問:pin 可以多舊?
考慮過的選項¶
- pin 任意 log head:與全 corpus 檢查點用語衝突、無天然 sync 錨點,否決。
- pin 時效不設上限:惡意 host 可 pin 遠古檢查點,讓 unusable 資產在該房復活,否決。
- 正式檢查點 +staleness 上限 +idle guard(採納)。
決定¶
- 房間 pin 對象 =host 已同步的最新
LedgerCheckpointEvent,非任意 log head;B 軸版本閘門對 pinned 快照計算,最多 24 小時舊正是「新增事件不中途踢人」的設計意圖。 - 與
economy_config的 freshness 政策明文分開:economy 為開賽前讀最新並驗全員相等;B 軸為 pin 後不追新。 - 新常數
ROOM_PINNED_CHECKPOINT_MAX_AGE_HOURS=72(初估,登記於 程式參數.md);preRaceVersionCheck拒絕過舊 pin。 - 升版套用 idle guard:自動套用與強制升版只在 idle(非比賽中、非房間內)觸發;賽中或房中發現新版只提示、延後至離開後的下一個 idle 時點。
後果與影響¶
遠古檢查點復活 unusable 資產的路徑封死;升 patch 不再把人打成斷線扣信譽。idle guard 的非 idle 集合其後在部署資訊二輪擴充納入「Stage 2 編輯中」(編輯內容僅存 session 記憶體、reload 即毀)。細節權威見 版本規範.md 與 賽內機制.md。