D-20261029-02|forfeit 整場壓縮:斷線者不得分、總名次排末位¶
背景與驅動力¶
多回合比賽的總名次由各回合積分加總決定(D-20260630-02),並寫進 MatchResultEvent.ranking。ranking 在結算簽章範圍內,簽章端各自重算後逐位比對,TrueSkill、獎金名次與連勝都只讀這一份。
D-20260602-02 規定斷線者與主動棄賽者 forfeit,名次列在最後;D-20261029-01 定案「斷線車不應得分」,並讓網路斷線只進結算的 disconnects、不影響模擬層的回合名次。但總名次推導改版前只吃 rounds、不讀 disconnects:
- 斷線車在模擬中照常以預測輸入行駛,仍可能完賽並佔一個回合名次,所以照樣拿回合積分,總名次也可能排在完賽者之前。
- TrueSkill 以 ranking 中的實際位置評分,forfeit 者不在末位。
- 連勝讀
ranking[0];斷線者總積分第一時,真正的第一名完賽者拿不到連勝。 - 斷線車夾在 A、B 之間完賽時,A、B 的回合積分差被多拉開 1 分,兩人的相對名次因此可能改變,獎金名次也跟著變。
獎金與簽章資格已排除 forfeit 者,只有名次、積分與評分沒有排除。canon 的權威偽碼同樣只吃 rounds,且沒有定義「forfeit 者實際完賽的回合裡,其他人的回合積分怎麼算」。D-20261029-01 的「已知限制」把這點列為 issue 001122、另案處理。
2026-10-29 使用者裁決採選項 A,並審閱草稿後同意採納。
考慮過的選項¶
- A:整場 forfeit 壓縮(採納)。每個回合先移除 forfeit 者再計其他人的回合積分,forfeit 者排總名次末位。完全消除 A、B 相對名次被擾動的問題,判定只用簽章內資料;代價是 forfeit 者前面回合的成績作廢,但 canon 本來就規定 forfeit 整場。
- B:只把 forfeit 者移到總名次末位,回合積分不壓縮。改動最小,但斷線車夾在 A、B 之間的回合仍會讓兩人分差多 1,沒有解決擾動問題(否決)。
- C:只壓縮斷線當回合及之後的回合。
disconnectedAt是牆鐘,無法決定性地對應到回合(否決)。
forfeit 者之間的先後:
- 依
disconnectedAt早到晚,再依 PeerId(採納):與 流程/比賽進行.md 第 12.2 節「依斷線時間排序」一致。disconnectedAt由提案端填寫、受結算多簽背書,只影響 forfeit 者彼此在 TrueSkill 中的先後。 - 純 PeerId:中立,但要改寫比賽進行流程的文字(否決)。
決定¶
deriveTotalRanking(rounds, disconnects)同時讀rounds與disconnects。forfeit 者=disconnects中屬於開賽名單(首回合ranking)的玩家;同一玩家多筆紀錄取最早的disconnectedAt。開賽名單外的紀錄(倒數期間斷線、loadout 缺交)不進總名次。- 回合積分:每個回合先從
ranking移除 forfeit 者,非 forfeit 者依壓縮後的名次k得P − k + 1,P仍取開賽人數、不因 forfeit 縮減。forfeit 者整場 0 分。 - 總完成時間只計非 forfeit 者。
- 總名次=非 forfeit 者(積分高到低 → 總完成時間少到多 → PeerId 字典序),接著 forfeit 者(
disconnectedAt早到晚 → PeerId 字典序)。 - TrueSkill 與連勝讀同一份 ranking,forfeit 者在末位參與評分;獎金名次沿用 ranking 中非 forfeit 者的順序。
- 模擬層的
RoundResult.ranking不變,仍含全員;壓縮只發生在積分層。回合共識錨、state hash 與 sync wire 都不改。 - 依 專案生命週期.md 的
pre_launch,直接改寫 ranking 語意,不保留舊推導的相容層。
算式與現況規格見 算式表.md 第 20.1 節、賽內機制.md 第 3.2 節(LEDGER-R-084)。
後果與影響¶
- 斷線車在任何回合完賽都不再改變其他選手的回合積分差與相對名次,也拿不到連勝;第 1 名必為完賽者(全員 forfeit 時除外)。
MatchResultEvent.ranking是簽章欄位,推導改變後新舊版本的簽章端會互相拒簽;pre_launch階段直接改,不需相容。conformance 向量不受影響(ledger/signing-digest等 family 不經過總名次推導),determinism golden 不變。- pinning 的 vendored
ledger/derive-utils.ts與 barrel 需經vendor:sync同步。 - 結算摘要頁與賽後頁的總積分、各回合積分改用同一份推導;回合結束 HUD 的即時積分不壓縮,因為回合結束時整場 forfeit 名單尚未確定。
- 與既有決策的關係:
- amends D-20260630-02:回合積分的名次
k改為移除 forfeit 者後的名次,deriveTotalRanking增加disconnects輸入;積分制、tiebreak 與P恆定不變。 - amends D-20260602-02:「名次仍列最後」具體化為整場壓出回合積分、排在全部非 forfeit 者之後,彼此依斷線時間再依 PeerId;
finisherCount與經濟 void 規則不變。 - amends D-20261029-01:其「已知限制與後續」中的 issue 001122 由本決策解決。同節的 issue 001123 已於 2026-10-29 以實作修正(race-ready 後續回合扣除斷線者),沒有另立決策。D-20261029-01 的 H1 後已補上關聯說明,一併註明這兩點。