D-20260710-06|定稿=鏈上確認唯一出口+roster 共識輪¶
背景與驅動力¶
拍 13 race-runtime 同拍深讀複審(三路 agents、使用者裁決全修後再進拍 14)暴露結算與開賽協議多處破口:主提案者於 append 前誤報成功即死 = 樂觀定稿丟場;非主可搶發內部自洽的偽 candidate 收割多簽;loadout 交換各端獨立定案名單、剪刀差 = 開賽即決定性發散;WebRTC disconnected 即刻 forfeit 誤殺暫態網路抖動。
考慮過的選項¶
(流水帳未記錄替代方案;本決策以修正 / 收斂形式成立。)
決定¶
- 定稿回報改「鏈上確認唯一出口」(廢樂觀定稿)+ 提案週期重送 +
SettlementCancelMessage(決定性拒簽者過多 = 主動終局、transient 不計)。 - 結算收簽加提案者身分閘(
candidate.peerId= 本機觀測非 forfeit 完賽者之 PeerId byte-min)+ 本機觀測錨(rounds/loadouts 與自身賽內經歷、賽前交換提交比對)——堵偽 candidate 收割多簽。 - 提案 base=
deriveStateAt(baseLogHeadCid)(鏡像滯後 = 與背書端分歧、全員拒簽);回合終局快照 await 落地再取 head。 - 新增名單交叉核對共識輪:rosterHash 互驗、fail-closed——名單剪刀差在開賽前擋下。
- WebRTC
disconnected改 15 秒重連窗(暫態自癒、不再即刻 forfeit)。 - 現況見 流程/比賽結算.md、流程/比賽進行.md。
後果與影響¶
amends D-20260524-02:四訊息骨架與 30 秒 /5 秒窗保留,定稿出口翻修、訊息族補 cancel。雙主並行 append 由 fold 冪等閘(D-20260710-03)吸收轉良性;2–15 秒斷線的 state 級 catch-up sync 當輪留待後續協定設計。