歷史記錄 · 2026-08-14¶
重大重構里程碑¶
2026-08-14 ─ Mermaid 自然尺寸、決定性拆圖與無障礙檢視器(issue 000510)¶
決策檔:D-20260813-05
MkDocs Mermaid 改以 useMaxWidth: false 保留自然尺寸,內嵌圖提供鍵盤可聚焦的有界水平捲動;
成功渲染後才出現具名「放大查看」按鈕,原生 dialog 共用同一 SVG 並支援縮放、重設、Esc、
focus trap/return 與導覽清理,失敗仍保留原始碼。docs-map 生成圖改為 TB,超過 30 nodes
或 50 edges 時先依 weakly connected component、再依 canonical node ID 決定性分頁,跨頁邊
完整列出。手寫圖同步採相同門檻與 TD/TB 優先規範。
2026-08-14 ─ 工具鏈命令、文件與 CI 建立雙向 inventory(issue 000513)¶
決策檔:D-20260813-06
程式架構.md 補上 runtime、scripts、E2E 與 workflow 的分層定位;新增
程式架構/toolchain.md,逐一記錄正式 build/check/test/proof 入口、compound 子命令、
current execution 與精確 workflow evidence。repository contract test 以受測 selector 雙向比對
package scripts、文件表與 workflow,並驗證 required/conditional/scheduled/local 語意。
testing.md 同步區分 shipped canonical required profiles 與四個外部 authoring/resume/perf 旗標,
skip 與 unavailable 均不冒充 pass。
2026-08-14 ─ 終點與 KillZone 改採 chassis COM 掃掠判定(issue 000505)¶
RPn 從步末球形 containment 改成 authored surface frame 的無高度上限定向平面;每個 fixed step
以前一個到目前 chassis COM 的線段判斷正向通過,並以 finishArmed 防出生、teleport 或共面誤判。
KillZone 同步改為 segment-AABB entry,讓高速車輛即使兩個步末端點都在 trigger 外仍會觸發。
previous COM、armed 與完賽幀納入 snapshot、checksum 與 rollback current shape。
決策檔:D-20260814-01
2026-08-14 ─ 被動武器有效質量統一接入組車與 Rapier(issues 000492、000493)¶
被動武器的三因子係數改由單一 contract 推導;組車的 50–500g 與最重/最輕零件 50:1 檢核(超界錯誤定位最重/最輕零件)、VehicleSpec 總質量、sim part mass,以及 Rapier collider 的質量、重心與慣量來源, 全部使用相同的 weapon 有效質量。GLB PhysicsManifest 與 PartInstance 的烘焙原始質量不改寫。
既有決策:D-20260706-06
2026-08-14 ─ fluid weapon 與 projectile deploy zone 接線(issue 000477)¶
合法 fluid weapon 現在保留 density 對 mass/COM/慣量的貢獻,但跳過固體 fatigue 與熱交換合成。 launch projectile 保存 canonical volume/behavior/params,首次接觸合法場地表面後停用彈體並啟用 同索引預配置的圓形薄 sensor;面積由集中參數換算並鉗制。固定表面使用 world anchor,移動 Track Entity 使用 local anchor;碰車不部署、fall-limit 回收、entity 退役移除。source peer 與完整生命週期 進 SavedState v11 與 state hash,restore 不重做 raycast。
決策檔:D-20260814-02
2026-08-14 ─ 接觸破壞與磁力改採 canonical sub-mesh 材質(issue 000479)¶
碰撞事件現攜帶兩側實際 collider 材質,車輛與 destructible Track Entity 的 fatigue 不再讀主材質; corrosive zone 同樣從實際交疊 collider 選材質,並維持同 zone/part 單次計傷。磁力目標改按 vehicle、part 與 canonical collider key 排序,逐 passive sub-mesh 使用自己的 susceptibility 與世界 中心計算方向;聚合 impulse 仍施於剛體 COM,來源同步承受反作用力且不產生 torque。 fixed/kinematic steel Track Entity 也會對 active 車輛磁源產生反作用吸引。
2026-08-14 ─ 逐 Collider 六向衝撞接觸面積(issue 000489)¶
Stage 3 對每個 canonical collider/sub-mesh 烘焙 front、back、left、right、top、bottom 六向 投影面積;runtime 將實際 collider-local 接觸法線投影到六軸後加權,分別取得碰撞雙方的有效 接觸面積。PhysicsManifest 與 builtin 基線升為 v8,開發期不保留 v7 相容入口。
決策檔:D-20260814-03
2026-08-14 ─ 接觸點撞擊與持續剪切傷害(issue 000504)¶
新接觸改用 solver 前的 v + ω×r、方向 constraint effective mass 與真實接觸點計算法向
撞擊能量;持續接觸則以切向 impulse、solver 前 slip speed 與集中轉換係數計算剪切能量。
所有實體零件共用同一模型,不依武器名稱或種類加成;tire/roller 對固定場地仍只走既有磨耗
ledger,避免重複計傷。
決策檔:D-20260814-04
2026-08-14 ─ issue 000488 最終裁決¶
一般零件 broken 後於幀末退出物理,primary body 依剩餘 canonical collider 貢獻重算質量、
local COM 與主慣量並保留線/角速度。只有 chassis broken 令整車 physicsRetired;battery/motor
只停止功能並可繼續滑行或受撞完賽。PhysicsManifest 補版本化逐片純視覺 descriptor,SavedState v12
保存 per-part breakFrame 與 vehicle retirement,觀戰或 late join 可在 5 秒呈現期限內重建相同碎片。
決策檔:D-20260814-05
2026-08-14 ─ 場地碎片統一純視覺(issue 000514)¶
可破壞 Track Entity 在破壞當幀停用 intact body/colliders、運動、輸送與磁源,且不再預配置或
生成任何 fragment body/collider。PhysicsManifest/open4wd_version/builtin 基線升為 v9,場地
碎片改保存與車輛相同的版本化 index/seed/volume descriptor。SavedState v13 只保留 entity
fatigue/broken/breakFrame;觀戰、重播與 late join 依共用 5 秒生命與淡出參數重建純視覺呈現。
物理 body 最壞帳由 452 降至 388,512 上限餘量增為 124。
決策檔:D-20260814-06
2026-08-14 ─ Gameplay 動態剛體統一啟用 hard CCD(issue 000502)¶
所有 chassis compound、tire/roller hinge、active weapon actuator payload 與預配置/已釋放 projectile 統一由同一 factory 啟用 hard CCD;CCD substeps 集中初值為 2,soft prediction 初值為 0。 runtime 不按速度切換,也不新增限制 UGC 的全域牆厚規則。Rapier snapshot、body topology key 與 immutable world config 共同驗證這些 physics-version-pinned 設定;終點與 KillZone 仍由 issue 000505 的獨立 COM sweep 負責。
決策檔:D-20260814-07
2026-08-14 ─ Projectile LaunchExit 幾何離膛(issue 000503)¶
每顆 launch projectile 取得 source-weapon-local LaunchExit 距離;Stage 3 以 canonical convex
support 驗證正向、必要最外界與無阻擋 sweep。釋放後只暫時過濾 projectile 與來源 weapon part,
完整形狀越過平面加 1 mm 後永久恢復接觸,反彈可正常自傷。SavedState v14 保存 sourceCleared,
PhysicsManifest/open4wd_version/builtin 基線升為 v10;pre-launch 不保留 v9 fallback。
決策檔:D-20260814-08
2026-08-14 ─ 回合名次與失能終局(issue 000486)¶
回合名次改為已完賽、未完賽存活、未完賽失能、未完賽退出四區;已完賽成績鎖定,其餘區內依
圈數、checkpoint 約束的微米級 route 進度與 PeerId 排序。battery/motor broken 停止所有功能但
保留物理與 swept finish 資格;場上無未完賽存活車後才啟動單一 120 幀終局窗,全部失能車低速
連續 15 幀可提前結束。routeProgressUm 進 SavedState v15 與 state hash。
決策檔:D-20260814-09
2026-08-14 ─ 直接致毀破壞歸因(issue 000487)¶
新增 per-frame 量化 damage contribution ledger;target part 首次 broken 時依最大貢獻與 canonical
key 決定直接致毀來源。只對敵方玩家 owner 計件;自損、環境、自然過熱不給分,chassis retirement
不連帶計 intact part。完整 roster 計數進 SavedState v16、hash 與 required
RoundResult.destructionCounts,正式/本機/觀戰 Result 顯示同一可驗值。
決策檔:D-20260814-10
2026-08-14 ─ 技能停用改採每幀權威投影(issue 000491)¶
HUD 新增固定順序的 skillDisableReasons,每幀由回合禁用晶片、chip broken、battery/motor 功能
失能、chassis 退役/淘汰、退出與車況缺席推導。原因非空時所有槽位 disabled 且不亮 active;
RacePage 在停用邊沿釋放全部 hold,並於音效與 feedInput 前拒絕新 press。原因消失即可恢復,
不建立可能與權威車況漂移的 latch。
決策檔:D-20260814-11
2026-08-14 ─ 設定頁收斂八大正式分類(issue 000494)¶
SettingsPage 導覽改為顯示、音訊、遊戲行為、網路、隱私、維護、帳號、關於八個固定分類,預設
進入顯示;about 不再改寫成 maintenance,而是獨立承載六欄版本、MIT 授權、source/discussion
連結與治理事件真實空狀態。第九 developer 分類改由明確注入旗標控制,正式預設關閉;帳號分類
先建立穩定路由與未登入建立/匯入入口,PIN 與登出能力由 issue 000496 接續完成。
決策檔:D-20260814-12
2026-08-14 ─ 帳號 PIN 修改、登出與一次性助記詞(issue 000496)¶
IdentityData 的 PIN 變更改為接受並驗證目前 PIN,再以新 PIN 重加密;移除把舊 PIN 寫死為空字串 的開發期殘留。Settings Account 新增目前/新/確認 PIN 表單與正式登出入口,錯誤沿用既有 i18n 參數,成功後清除敏感欄位。Canon 同步移除事後查看助記詞:助記詞只在建檔時一次性顯示並驗證, 系統只保存 encrypted seed,不新增助記詞封存或 legacy migration。
決策檔:D-20260814-13
2026-08-14 ─ 顯示算圖與瀏覽器維護能力(issue 000495)¶
DisplaySettings 新增 50%–100% 任意整數 renderScalePercent 與獨立 antialias;50/75/100 只作
快捷值。O4ThreeStage 只縮放 3D drawing buffer,並同時受 8M 像素、GPU renderbuffer/texture
dimension 限制,CSS、HUD、文字與 hit target 維持原生解析度;安全截斷會回報實際生效比例。
Maintenance provider 另以 Cache Storage 列出/有界清除正式主題,並以 Storage estimate 顯示
usage/quota;不支援時明確降級,不製造假資料。
決策檔:D-20260814-14
2026-08-14 ─ 紙本備份純驗證與秘密輸入守衛(issue 000497)¶
Account 新增使用者主動啟動的紙本備份驗證:先以不改 profile 的 PIN 純驗證,再停止舊 online generation、transport、provider 健康檢查與 provider DMCA,守衛成立後才掛載 autocomplete off 的 助記詞輸入。KeyManager 只做 normalize/checksum/PeerId 比較並回 match/mismatch,不走 recovery、 不保存輸入或驗證時間。各退出路徑清除狀態並只建立全新 generation;賽事、match、launch 或 ledger 寫入中拒絕進入。刪除本機身分前可使用同一流程,仍保留具明確不可復原勾選的覆寫刪除。
決策檔:D-20260814-15
2026-08-14 ─ Onboarding 正式鏈 mutation 集中授權(issue 000500)¶
玩家主動正式鏈寫入集中登錄為 fail-closed policy:車位購買、UGC 評分/撤回、檢舉、仲裁投票 與創作者發布都必須完成四步 onboarding。編輯器在計費與 canonical finalize 前提供同源提示, provider 邊界仍重新驗證;首頁持續顯示下一個可恢復步驟。本機草稿/比賽/讀取不受影響,已 開始賽事與仲裁的協定收尾只保留具名且附理由的 allowlist。
決策檔:D-20260814-16
2026-08-14 ─ Onboarding 採單人本機結果里程碑(issue 000501)¶
第三步移除不存在的 Bot,改為完整進行一場單人本機測試直到產生 canonical
LocalMatchSummary。completed、duration-limit、eliminated 都完成里程碑,不要求對手、
獲勝、名次或抵達終點;DNF 語意不變。載入/賽前/runtime 中止、直接離開及 mode 不相符摘要
不完成,Bot 若未來新增必須另立功能設計。
決策檔:D-20260814-17
2026-08-14 ─ 玩家賽事歷史採有界 cold lazy pagination(issue 000498)¶
玩家正式賽事歷史不再只讀 hot window:API 先讀 hot,再按 quarter 倒序延遲載入 cold,以
matchId 去重並固定排序。單頁預設 20/上限 50、每次最多掃描 4 partitions;達上限回傳不透明
續載游標與 partial,不靜默截斷。冷區塊缺失會保留既有列、失敗 partition 與原續載位置供重試。
online-ready 首頁新增四語載入、續載、部分與失敗介面,每列沿用正式結果頁。
決策檔:D-20260814-18
2026-08-14 ─ 鏈重生採完整來源檢查點證明(issue 000499)¶
鏈重生不再以裸 initialStateCid 當出身證明。新鏈改帶 closed InitialCheckpointProof:由來源
genesis signer 起逐代驗 checkpoint authority、來源 ledger domain 簽章、canonical state 與
所有引用 blocks,並以 ceremony minimum 鎖定防回退切點。Browser deployment composition root
與 pinning one-shot genesis 都只接受 ordinary/rebirth 互斥分支,失敗不得 fallback。
Pinning 另提供只封裝實際引用 blocks 的 self-contained bundle 產生與離線驗證;genesis 前預載
已驗 blocks,新鏈位址不得等於來源。Public receipt 直接改為 version 2,明示模式與公開 cut point,
不保留 pre-launch 未公開 schema 相容層。
決策檔:D-20260814-19
2026-08-14 ─ 多人可驗算起跑格(issue 000507)¶
起跑 slot 不再由房主 members[] 或車輛載入順序決定。全 participant 在 roster、規則、逐回合
場地 manifest 與 series identity 鎖定後,先簽 commitment、全收齊再揭露 32-byte nonce,合成不含
startedAt 的 gridSeed;缺席、替換、簽章或 context 不符都不開賽。同 context 重試重用 nonce,
不能取消後重抽。車輛拓撲改依 PeerId canonical order 建立,slot 由 proof 本地重算並跨回合 cyclic
rotation;RP1 上採同縱向、左右對稱 0.18m cell,超寬拒絕。match-start、matchId、RoomSession 與
MatchResult 全部綁完整 proof,UI 顯示儀式階段、取消原因與缺席 PeerId;pre-launch 不保留舊 shape。
決策檔:D-20260814-20
2026-08-14 ─ 整車零件質量比依正式資產校準(issue 000518)¶
50:1 admission 接線後由真實 canonical Chromium 旅程發現官方 speed 車約為 249.12:1,造成
shipped content 無法開賽。保留同一硬性 admission,但將具名 VEHICLE_PART_MASS_RATIO_MAX
依三組正式 loadout 校準為 300:1;runtime 與 builtin GLB gate 改讀同一份 policy 值,並持續檢查
總質量與最重/最輕比例,不為官方資產建立例外。所有現況 canon 同步改為 300:1。
決策檔:D-20260814-21
2026-08-14 ─ 真實資產 CI 分層證據(issue 000508)¶
CI 新增 Chromium retries=0 的 shipped canonical required profile,以 repository 內正式 GLB
完成組裝、載入、進賽與 local result;reporter 對 required title 的 missing/skipped fail closed。
Nightly 與 release 另跑同一成品 profile 及有界首幀效能採樣。約 1.6GB、位於工作區外部 authoring 目錄(未入 repo)的
Editor authoring 原檔維持獨立 profile:availability checker 逐筆驗 manifest hash,外部根全缺時
明示 unavailable,部分缺失或漂移失敗;canonical 成品不得代替 authoring bytes。自然抵達終點
仍由 issue 000116 追蹤,不以 duration-limit result 冒充。
決策檔:D-20260814-22
2026-08-14 ─ Ready 提交驗證與自動倒數(issue 000523)¶
等待房移除房主開賽按鈕,host 與 participant 都以可撤銷的簽章 ReadyDeclaration 鎖定逐回合 車輛;全員 Ready 後互驗同一 ReadySet 的版本、實際 manifests、結構、資產版本與可驗算起跑 證明,完整 LockedStartPackage 複製到各端後才自動倒數。加入/移除只重建集合層,保留未變動 玩家的個人 Ready;設定變更才清除全員。倒數斷線不補位、不重連、不重抽格位,只有至少 2 名 且占原 roster 嚴格多數的 survivor 能沿用同一 package 開賽;房主繼任亦不得更換 package 或 deadline。preloading 的 loadout 改為鎖定資料的第二道驗證與帳本參與證明。
決策檔:D-20260814-23
2026-08-14 ─ 決定性 E2E 禁止重試並重基線 hard CCD 場景(issue 000509)¶
Playwright determinism suite 明確固定 retries: 0,golden mismatch 首次失敗即紅燈,錯誤同時
輸出 project、seed、frames、actual/expected checksum。此閘門立即揭露 hard CCD 物理 major
生效後仍沿用舊 checksum;Node 與 Chromium/mobile Chromium 同 seed 雙跑均得到一致的新值,
故 canonical scene 升為 canonical-two-car-v2 並重基線。一般 UI E2E 仍保留全域 retry,未放寬
決定性比較。
延續決策:D-20260814-07
2026-08-14 ─ 產品 SCSS 全面納入 cascade layer(issue 000511)¶
98 份產品 SCSS 的 emitted declaration 全面收斂至既有 cascade 契約:Default token 與全域基底進
base,頁面、元件及共用產品樣式進 components,focus 等不變式維持 safety。新增
check:style-layers 以 PostCSS AST fail closed 掃描完整 src/**/*.scss;例外只能用精確檔案路徑
與非空理由集中登錄,禁止 glob 或檔內逃逸,現行例外為零。CI、token generator 與主題 consumer
契約同步接線,避免 unlayered author CSS 再次無條件壓過 theme-default/theme。
延續決策:D-20260723-01
2026-08-14 ─ 材質名稱與玩法說明四語系接線(issue 000480)¶
31 種 canonical 材質全部補齊繁中、簡中、英文與日文的穩定 name/description 鍵,並由
共用 resolver 組成「本地化名稱(canonical id)— 本地化用途」。零件主材質、子網格覆寫、
場地 entity 選單及材質驗證訊息統一採用同一顯示契約;表單值與 canonical 排序仍只使用 id,
不受語系影響。未知 id 保留原始值以維持 fail-safe 診斷。
延續決策:D-20260520-01
2026-08-14 ─ 初始 CSS 預算與 Garage route-lazy 樣式(issue 000512)¶
首屏 CSS 口徑明確化為 production styles[-hash].css raw bytes ≤ 50 KiB;Angular bundle budget
與 build artifact checker 雙重 fail closed,不再用 development 未最佳化產物判定超標。Garage
專用高還原樣式從 global 移出,由單一 SCSS 權威生成根層靜態 CSS,依 base path 只在 Garage
route 掛載、離頁移除,且進 install precache 維持首次離線可達。production 初始 CSS 由
44.93 kB 降至 27.14 kB,e2e-pages raw 產物為 33,409/51,200 bytes。
2026-08-14 ─ Pre-launch 自有版本統一為 v1(issue 000533)¶
生命週期規則擴及所有 Open4WD 自有 schema、wire、snapshot、receipt、persistence、tooling
manifest 與 asset authority:pre_launch 的完整 current shape 一律維持 v1,內部候選改用
candidate_epoch、digest、CID、golden 或明確 revision。Main 的 24 個 authority、27 個 builtin
GLB metadata、pinning receipt/vendor manifest 與 signaling attachment 已重設並同步;current
canon 加入機器可讀清單,CI 會拒絕新增自有 v2+,但不誤報 glTF 2.0、Circuit Relay v2、UUID v4
等外部標準。歷史 ADR 的功能內容不變,僅由新決策修訂其未公開版本數字。
決策檔:D-20260814-24
2026-08-14 ─ 共識數學防線擴及新邊界(issue 000531)¶
ESLint 的禁用近似數學集合擴至 PhysicsManifest、canonical editor pipeline、mount assembly、
match terminal 與 ledger admission。既有 Math.hypot/Math.pow/Math.sin/Math.cos/
Math.log2/** 改為明示平方和、固定多項式與整數 bit-length,Editor reopen 仍因只做可編輯
反向投影而明確排除。新增 behavior contract 逐一注入禁用運算,防止未來 lint glob 靜默退縮。
2026-08-14 ─ Profile 密封網路授權(issue 000516)¶
TURN credential 從裝置全域 PIN 密文移入 active profile 的 network-authority sealed domain;同一
current shape 同時預留 pinning API token 與長期 signaling credential 的獨立 slots。公開 endpoint、
mode、priority、providerId 與 writeEnabled 仍屬未登入可編輯的裝置偏好,短期 token/socket/grant
只留 session。換 PIN 不重封,profile 切換、登出、跨分頁撤銷、刪除與 shell dispose 都清除明文,
且此 domain 不進本機備份。pre-launch 不保留舊全域 TURN 密文 reader 或 migration。
決策檔:D-20260814-25
2026-08-14 ─ AppShell 動態依賴窄契約(issue 000532)¶
AppShell 的線上全鏈仍以 dynamic import 延遲載入,但正式 loader 改為只投影實際消費的
peer discovery、identity、browser ports、app factory、race、room、spectator chat 與 chat
成員。獨立 AppShell 測試的各分組 double 以同一 production-owned 契約 satisfies,新增無關
export 不需同步,新增被消費依賴但漏改 double 則由 TypeScript 直接指出,不再延後到 Vitest
啟動逾時或缺 export 才發現。