D-20260802-03|三平面連線與分割安全定稿¶
背景與驅動力¶
同一 PeerId 的等待房控制線、賽內 mesh 與觀戰串流可以各自斷線或恢復。若任一通道關閉都被解讀為全域離線,等待房繼任、race forfeit 與觀戰終局會互相污染;更嚴重的是 race partition 兩側若都先移除失聯者再縮小 quorum,可能各自形成不同 MatchResult。
考慮過的選項¶
- 由 room host 裁決 race roster:拒絕;等待房是中心化控制面,不是賽內共識權威。
- 另建 removal-certificate 簽章欄:拒絕;它可能與最終 candidate 的 disconnects 剪刀差。
- 三平面獨立世代,MatchResult signatures 兼作 removal certificate(採納):既有簽章已覆蓋完整 disconnects,live 與 fold 都能驗證。
決定¶
- 共用連線狀態形為
(peerId, plane, generation, status);plane 固定為room-control、race-mesh、spectator-stream。每次重綁遞增 generation,舊 generation 的 close 或 async 完成不得覆寫新通道。 - room-control 失效只觸發等待房生命週期/房主繼任;spectator-stream 失效只重新索取 source 並撥號,重建失敗才
source-unavailable;兩者都不改 race roster。 - spectator source 只從固定
room.membersparticipant roster 選出:初次取第一位在線者,重連從上一 source 後方循環;spectator 永不候選。每位 participant 都維持 presentation broadcaster/server,非 host 以room-state.spectators已 admission 名冊守門。每次成功索源遞增本地sourceEpoch;channel 一進 reconnecting 即拒絕舊 generation 訊息,防舊 source 回流。 - race-mesh
disconnected先維持既有 15 秒重連與 catch-up。正式 GO 後最終offline才進固定 original active roster 的嚴格多數守門:本端可達數至少floor(N/2)+1才能續賽;否則partition-void、停止模擬且不得結算。GO 前仍依 D-20260802-02 無懲罰取消。 - 含
reason: networkremoval 的 MatchResult,簽章門檻以 original active roster(ranking ∪ disconnects去重)計算,不以剩餘 finishers 計算;signer 仍只能是非 forfeit 完賽者。MatchResultEvent.signatures因覆蓋完整 candidate,直接兼作 removal certificate。 - 因此 3 人 2–1 需 2 簽、4 人 3–1 需 3 簽;4 人 2–2 與 2 人 1–1 都無法定稿。live admission、settlement runner 與 timeless fold 必須使用同一門檻函式。
後果與影響¶
等待房、比賽與觀戰故障不再互相放大;分割少數側不能靠縮小分母落帳。代價是 4 人賽只要一人 network forfeit,剩餘三人必須全數簽章;若多數側也缺任一簽章,該場 fail-closed 無事件。D-20260710-06 的「重連窗後即移除並按剩餘在場者 quorum」由本決策修訂;D-20260802-02 的 GO 前取消保持不變。