跳轉到

歷史記錄 · 2026-07-04

月份索引歷史記錄

重大重構里程碑

2026-07-04 ─ 程式架構.md 首輪複審:模組名單五處對帳、rapier_version 舊宣稱修正、ui-mockups→ui 改名(中2細項4討論1、跨 3 檔)

乾淨面:Bug Bounty(資安 §10 離鏈自籌)/ SWR(pwa-offline /help/* 真有此桶)/ 60 機制庫(遊戲機制 §6)/ 31 材質 / MAX_SUBSTEPS: 4 全查證為真非 stale;§2.1 DeterministicWorld 與 physics-engine.md §2 雙表示 = 既定互指結構(:159)。修:

  • 中1 Rapier 版本鎖定舊宣稱(兩檔三處):§2.1 註「major bump 視同 protocol bump」+§2 段「升 Rapier major 版視同 protocol 升版」+physics-engine.md :66 同句——六欄位模型下 rapier_version獨立欄位、配對全等比對,任何版本差異即擋配對(非僅 major、與 protocol_version 無關)→ 三處改寫。
  • 中2 模組成員名單五處對帳(§3 依賴圖 / §4 矩陣 / §5 順序 / §9 tree / §9.1 表,以實際 27 檔為基準):environmental/ 幽靈模組移除(全 corpus 僅本檔 3 處、無 impl 檔無 src 對應;內容實住 physics-engine.md 每幀管線+遊戲機制 canon)/ ugc-rating/builtin-assets/ 補進 §3/§4/§5/§9(rating 入 layer 6 與 economy 同層〔royalty 乘數依賴〕、builtin 入 layer 3)/ §9 tree 補 5 目錄(ugc-rating / spectator / chat-system / builtin-assets / audio-system〔方向待定註〕)/ §5 step 2 parts-tree 廢名(project-resources 遺跡)→ builtin-assets / §9.1 pinning-service 對應 src/pinning-service/open-4wd-pinning repo(Go;client 端僅 interfaces PinningProvider、signaling-service 補雙落點(client src+模板 repo)。
  • 細項 4:§4 moderation「事件驅動黑名單」→「純仲裁 / 黑名單(純 derive 三振)」(07-02 改制殘漂)/ §7.4 刪 Jest(選型無此框架)/ §6.5 Replication Factor 補「(資料可得性)」+非 determinism 條件註 / ## 9.1 階層降為 ### 9.1
  • 討論裁決:ui-mockups/ui/(方案 A)——設計 mockup 已遷 美術資源/,正式頁面元件目錄以 mockup 為名誤導;§3/§4/§5/§9 四處+§13 尾註+testing.md coverage 表同改(歷史記錄與 美術資源 引用之 project-resources 封存路徑不動)。

程式架構首輪結案。

2026-07-04 ─ 主題系統新增(使用者提案定案落 spec:新 canon 主題系統.md + impl 程式架構/themes.md、跨 12 檔對接)

決策檔:D-20260704-01

動機(使用者提案):樣式/圖檔/圖示/LOGO/音樂與程式碼脫鉤——程式碼只保證流程與功能(只認 token 名與資產 key),外觀交給主題;個人選單選主題、主題可分類、逐主題留歷史(社群討論與累積的分辨單位)。討論兩輪定案:

  • 模型:token(CSS custom properties+資產 key)+ manifest(theme.json:id/內嵌多語系 name/category/authors/version/tokens/assets)+ fallback(主題只放要覆蓋的、缺項 runtime 落 default——同 i18n 缺 key 邏輯;default = fallback 骨幹、CI 驗完備、SW install 預快取;其他主題 lazy、首載不含)。
  • ⭐分類 = 資料非程式 enum(使用者裁:分類現在無法確定、必須可變更):categories.json 註冊表(id+i18nKey,顯示名走 dict themes.category.* 四語系);起始僅 basic,累積後 PR 加分類+改各主題 category 欄(演化 = 純資料 patch、零程式變更;分類變遷留各主題 git 歷史);粒度不限(「端午節」下逐年 duanwu-2026…永久可選)。機制一次完整、演化的是資料(非功能分期)。
  • ⭐資產依主題隔離(使用者裁):themes/<id>/ 自包含、磁碟零混放;共用靠 fallback、禁止跨主題引用;validate 雙向查(引用檔案存在+資料夾檔案全被引用防垃圾)。
  • 鐵則:只換皮不換語意/佈局;gameplay 資訊視覺保留 token THEME_RESERVED_TOKENS 不可覆蓋(CI+runtime 雙防);品牌錨點固定(OG/manifest icons=官方預設、app 內 LOGO 可主題化);純 client 資源 = patch、不上鏈不影響配對;主題 ⊥ i18n 正交。
  • 選用:settings「顯示」分類 DisplaySettings.themeId(預設 'default'、即時生效不需 reload、本地 persist 不上鏈)。
  • 社群 PR 同 語系清單 §10 模式(validate → review〔含資產授權聲明〕→ patch 隨版發)。
  • 紅利:BGM 主題化 = audio-system「音樂方向待定」的承接面(AudioService 留程式碼、音樂風格交給主題)。
  • 落檔:新 主題系統.md(§1–§10)+ 程式架構/themes.md(ThemeService/token 套用/fallback/SW/validate);對接:程式架構.md 五名單各 +themes/(§3/§4/§5/§9/§9.1,§9.1 順帶去「27 模組」歷史句)/版本規範 §3 純資源家族+§4 src/themes/→patch/遊戲機制 §9 顯示分類+settings.md(themeId ×4 處)/語系清單 §3+i18n.md §1 補 themes dict 分組/使用技術 §1 樣式改 CSS custom properties+§8 主題列/總覽.md 跨切面索引/程式參數表 §14 補 THEME_RESERVED_TOKENSTHEME_SIZE_MAX_MB=20(初估)/其他/audio-system.md §7 補承接列。順帶勘誤:語系清單 §16 與 i18n.md 的 i18n 常數指向 §16 → §15(本日稍早誤植)。

同日補:id 命名規則定案(新 §5.1、兩案討論):使用者問社群貢獻下 id 誰決定 → 我方原案「語意 id+先到先得+review 把關」→ 使用者提 純 UUID 案(自產、免仲裁、撞了重產)→ 評估:UUID 解命名仲裁但可讀性歸零(repo 目錄/PR diff/社群討論全變密文,撞使用者自己「歷史累積好分辨」目標;顯示名不唯一、失去人類消歧義層)→ 定案混合案 <slug>-<6 位自產隨機尾碼>(如 duanwu-2026-a1b2c3):保留 UUID 全部好處(自產、免仲裁、slug 不獨占 → 搶名無意義、先到先得與過泛名把關兩條規則整條免掉)+保住可讀性。自動檢核(使用者確認點):正則從字尾錨定 ^[a-z0-9]+(?:-[a-z0-9]+)*-[a-z0-9]{6}$+總長 ≤ 40——slug 長度不固定不影響機器檢核;唯一性硬保證 = 資料夾名即 id、CI 必紅;尾碼隨機性不需檢核(非隨機頂多提高重產機率)。生命週期:id 不可改(settings persist/討論/git 歷史三處錨)、僅授權/法律下架 → 登錄 themes/retired-ids.json 永久退役 CI 拒重用。落點:主題系統.md 新 §5.1+§3 補 retired-ids.json+§4/§5 範例改尾碼形+§7 補兩條+§9 step 1;themes.md §5 validate 同步。default = 唯一免尾碼保留 id。

2026-07-04 ─ 語系清單.md 首輪複審:i18n.md ngsw 孤例改自寫 SW、金額顯示方向勘誤(中1細項7、跨 2 檔)

決策檔:D-20260704-02

乾淨面:§1 常數對程式參數表;§10/§10.1/§14 patch 定級對版本規範 §3「純資源 → patch」+§4 src/i18n/ → patch;金額 /100 對經濟系統 §1(1 幣 = 100 minor units);§3 字典結構 = i18n.md §1 同構。修:

  • 中1 i18n.md §6 ngsw-config.json 孤例:全 corpus SW 為自寫(versioning.md §5 install/activate/fetch+SW_BYPASS_PATHSCACHE_NAME、pwa-offline §2 分路表、/reset.html),Angular ngsw 與自寫 SW 互斥 → i18n.md §6 改寫:/assets/i18n/*.json 全語系列入 install ASSETS_TO_CACHE 預快取+cache-first 分路+升版失效靠 CACHE_NAME 換名;語系清單 §6 step 5「PWA 快取該檔」→「全語系已於 SW install 預快取」(step 4 lazy load = runtime 記憶體載入)。
  • 細項 7:§8 金額 row 方向反(「÷100 顯示 minor unit」→「minor units ÷ 100 顯示幣、兩位小數」,economy.md formatCurrency)/ §9 切換步驟對齊 impl(localStorage 在 setLang 內、廣播先於 reload;原列 4 步順序錯)/ §13 補 production 顯示 [key](原只寫 dev raw key)/ §13「{param} 未傳」與 impl 分歧 → 改 impl 保留 placeholder(i18n.md ?? '' 空字串滅跡除錯不友善 → 缺該鍵保留 {param})/ §2 tagline 註「3–7 字」與實值「去中心化四驅競速」8 字自打 → 3–8 / §14「結構性變更 → minor」與版本規範 §4 path 表衝突 → 仍 patch / §16 常數列補值權威指向(程式參數表 §16)。

語系清單首輪結案。

同日二輪複審(文案事實 / 跨模組整合縫 / 偵測邊界 / 驗證基準四角度;中1細項5全修、跨 4 檔):⭐中1 /<lang>/ 前綴路由三檔未接——seo.md §6 已承諾語系化 URL(SSG 4 語系 × ~2500 路由+HREFLANG_MAP+sitemap alternates+hreflang 100% 目標),但 程式架構 §13 SPA 路由 13 條全無前綴(SEO 登陸 /ja/track/xxx = router 查無此路由)、語系清單 §6 偵測序不看 URL。使用者釐清「語系不是 JSON 動態切換嗎」→ 說明前綴 = 給爬蟲的門牌、非切換機制(hreflang 需每語言獨立 URL;運行時切換維持 JSON 動態不變),裁方案 A 補路由接縫:程式架構 §13 加前綴變體註(剝前綴 → setLang → 導無前綴路由;站內導航一律無前綴)/ 語系清單 §6 偵測序首位插「URL 前綴(若有)」/ i18n.md detectLang 補 URL 判斷 / seo.md §1 metadata 表補「未前綴形」註。細項 5detectLang 繁體判斷漏 zh-HK / zh-MO(原落 zh-CN 簡體)→ zh-Hant / zh-TW / zh-HK / zh-MO → zh-TW / i18n.md「= Protocol SUPPORTED_LANGS」誤標 → ui 常數、非 protocol / 驗證基準錯位:zh-TW = 撰寫源但 CI 基準 en(新 key 先進 zh-TW 會被反報「zh-TW 多 key」)→ 基準改 zh-TW + en 缺 key 升 error(en 是 fallback 鏈前提)/ §10.1 新增語系補「LangCode union」+「SSG / sitemap 語系來源同步」兩步 / §16 補 pwa-offline 列。觀察維持不動:zh-CN 缺 key fallback en(不做簡繁自動替換、中立)、description「~150 字元」註。語系清單二輪結案、無待辦。*

2026-07-04 ─ 使用技術.md 首輪複審:CSP 第四鏡清除、Pinning 技術棧正名 Go、SIMD/SAB 降級軸廢除(中3細項4、跨 3 檔)

乾淨面:TIME_STEP_X1000/INTEGER_SCALE 對上程式參數表;BIP39「12/24 詞」有 key-manager.md §69 明文調和(生成預設 24、恢復接受 12/24)非 drift;「OrbitDB v2 原生 LRU 裁剪」被 ledger.md §10 ComposedStorage(LRUStorage, IPFSBlockStorage) 證實;§16 六大介面與 interfaces.md 一致;Draco/KTX2 對上 UGC機制 §9.3 強制壓縮。修:

  • 中1 §13 CSP = 舊模型第四鏡(07-03 CSP 定案「三檔同修」漏網):固定域名白名單 connect-src wss://signaling.* wss://pinning.*(TLD 萬用非合法 CSP source)+缺 base-uri/form-action/upgrade-insecure-requests+worker-src 少 blob: → 廢重列、改指 security.md §3 CSP_META 權威+一行摘要(meta 注入 / connect-src scheme 級 / 無 frame-ancestors 風險接受)。
  • 中2 Pinning 技術棧正名:§9「Node.js + IPFS Helia 或等效」+§15 語言比重把 Pinning Server 算進 TypeScript——impl 權威 pinning-service.md = Go 管理 API + IPFS Kubo + IPFS Cluster(k8s)→ §9 改 Go 棧+指向、§15 TS 行改(前端+SW+Signaling 模板)+新增 Go 行。
  • 中3 SIMD/SAB 三重錯位廢除:security.md §6 COOP/COEP 註「為 SharedArrayBuffer(Rapier 多執行緒)必要」——(a) §6 是 pinning server header 清單、Rapier 跑在主站;(b) 主站 GH Pages 設不了 COOP/COEP(CSP header 限制家族兄弟項)→ 永無 cross-origin isolation、SAB 不可用;(c) Rapier deterministic build 與 SIMD/parallel feature 互斥 = 物理必然單執行緒、本就不需 SAB → 使用技術 §14 改「WASM 硬需求(不支援=不可玩);物理一律單執行緒確定性、不存在多執行緒降級軸;主站 SAB 本就不可用」+security.md 註改寫(pinning 通用強化、主站不適用)。
  • 細項 4:檔頭死指標「對應企劃書 §3+§8+各模組 spec.md」(企劃書全 repo 不存在、模組 spec.md = project-resources 舊構裸指標)→「權威細節見 程式架構.md 與 程式架構/.md」/ §12 SRI「第三方 CDN 資源」→「build 產物;runtime 無第三方 CDN」+ security.md §4「為所有第三方 JS/CSS 生成 SRI」同族漏網鏡同修 / §10「各 diagrams.md 圖表」→ 三分流實況(程式架構/程式流程/.md+流程/*.md)+流程.md 三處 legacy「diagrams.md」措辭(檔頭/§2 標題/表欄頭)同清 / §11 tools 表補 find-simplified-chinese.py(實際 13 支、表列 12)。

使用技術首輪結案。

同日二輪複審(完整性 / 自寫 vs 上游精度 / 幽靈功能三角度;中2細項6全修、單檔):⭐中1 §6 Ed25519 套件名錯@noble/ed25519 → 權威 key-manager.md @noble/curves/ed25519)+lib 名補齊(BIP39 = @scure/bip39、Argon2id = @noble/hashes/argon2、AES-GCM = WebCrypto crypto.subtle)/ ⭐中2 §4.2「Helia(玩家可選參與 auto-pin)」幽靈功能宣稱(全 corpus 無承接:settings = 選用節點、pwa-offline §6 = 自用快取 LRU、資料系統 §10 志願 = pinning 節點非瀏覽器)→「UGC 快取 pin / LRU 管理」/ 細項 6:§15 Rust 行精度(自寫 = anti-piracy §2 mesh 指紋標準化;Rapier = 上游預編 WASM、非本專案編譯)/ §8 補「配對評級 = TrueSkill(ts-trueskill、算式表 §20)」+「音訊 = Web Audio 四路 gain + HTMLAudioElement(方向待定、技術已定)」兩列 / §8 i18n 補 ICU 複數(intl-messageformat 類)+ Intl 格式化 / §10 測試補 fast-check fuzz(nightly,testing.md)/ §3 補「不可信 GLB 解析 = Sanitize Worker(Web Worker 隔離)」列(資安 §2.4 重大架構承諾原漏列)。使用技術二輪結案、無待辦。

2026-07-04 ─ 部署資訊.md 二輪複審執行:升版檢查檔名統一 /version.json、A2「不做草稿」drift 修齊(idle guard 納編輯中)、IndexedDB store 清單補完(跨 11 檔)

決策檔:D-20260704-03

二輪 findings 除域名遷移(中1、討論中)外全數執行:

  • 中2 升版檢查檔名漂移:權威 = /version.json(versioning.md §4/§7、SW_BYPASS_PATHS),但 部署資訊 §10 / 版本規範 §10 / 升版流程 §2+§5.2 寫 manifest.json——與 PWA manifest(§6.1)撞名、會抓錯檔(無 commit_hash、非 network-only)→ 四處統一 /version.json+「勿與 PWA manifest.json 混淆」註;升版流程 §5.2 範例改 fetch('/version.json', { cache: 'no-cache' })
  • 中3 versioning.md §5「其餘 cache-first」漏切導航:與權威 pwa-offline.md §2(導航/HTML = network-first)矛盾——HTML 落 cache-first 則升版後拉不到新 shell → 補「導航/HTML → network-first;其餘靜態 → cache-first;完整分路表以 pwa-offline §2 為準」。
  • ⭐A2「不做草稿」drift 修齊:版本規範 §8.2/§22、UGC機制 §10.1 寫「Stage 2 草稿存 local draft、強制 reload 無損」——但編輯器操作 A2 已裁不做持久化草稿(2026-05-28),此保護不存在、強制 reload = 毀工作 → idle guard 非 idle 集合納入「Stage 2 編輯中」(版本規範 §8.2 權威;§10、升版流程 §2/§5.3、versioning.md §5、部署資訊 §10 五鏡像同步),三處 local draft 句改「編輯內容僅存 session 記憶體」;UGC上傳流程 §5 補「草稿 = session 記憶體、無持久化;組裝 loadout 才有本地持久化」註;資料系統 §2「local:<uuid> 本機草稿」→「本機測試資產」(與 A2 用語撞名、實為本地測試車位資產非編輯器草稿);頁面線框 §3 車間操作列「儲存草稿」→「儲存」。
  • IndexedDB store 清單補完(盤點時撈出):pwa-offline §5 漏列 recent-teammates(chat-system 明文存此 store)、blocklist 落點只寫「同 recent-teammates 一層」無 store 名 → §5 補 recent-teammates / blocklist 兩 store(keyPath peerId)+ matchmaking §3.1 改明確 store 名。
  • 細項 1–7:部署 §6.1 start_url "/""./"(project pages base path 註)/ §9 CI 清單補「CSP <meta> 注入」步 / §14 補 dmca.md 列 / §13 災難表補「custom domain 失效」列(移除 repo 設定才恢復 github.io、非自動 fallback)/ §7.4 對齊 seo.md §4 實況(OrbitDB top-N、>50k 拆 sitemapindex、每日重生成)/ seo.md robots 例硬編 open4wd.org → {CANONICAL_BASE_URL} build 注入 / ⭐sitemap 每日重生成不得觸碰 /version.json(否則 commit_hash 天天變 = 全網假升版通知)——seo.md §4+部署 §7.4 雙 guard。

  • 同日補:頁面線框 §3 車間(組裝介面)四階段殘影清除(使用者裁「清」):右欄「上鏈費」與底部「上鏈 / 費用預估」(桌面)、「上鏈」(行動端)移除 → 組裝操作收斂為 測試 / 儲存——組裝 = 本地 loadout、不上鏈不燒幣(2026-05-31 已裁組裝獨立於三階段;UGC上傳流程 §5 對照表)。

同日中1 定案執行:§8 域名遷移全面改寫(討論多輪定案):原 7 行操作清單 → 五段程序——8.1 遷移性質 = 無資料搬運(content-addressed + 同一活網路跨 cutover、首播 ±30s 封死暗 peer 競態)+ origin storage 命運表(唯一不可逆損失點 = 無備份助記詞;本機測試資產玩家自留原始檔、不做應用內匯出)/ 8.2 預告期 ≥30 天 banner / 8.3 前置檢核 = pinning 帳本完整性驗證(健康抽查閘、非凍結快照)+ ⭐無識別子綁 origin CI 不變式(OrbitDB address / pubsub topic / bootstrap 不得含域名——「不用遷移」是設計不變式非自動性質)+ DNS T−1 先設 / 8.4 cutover = 遷移版 build 先上(major、CANONICAL_BASE_URL 對換)→ 複驗 → flip;唯一抖動窗 = TLS 憑證簽發(分鐘級)、abort = 移除設定回 github.io / 8.5 T+ = Search Console 改址 + 監看 pinning 同步尖峰 + 301 herding(path-preserving 301 → 舊 client fetch /version.json 拿新站檔 → commit_hash 不符 → 強制升版落新 origin)。seo.md §8 同步對齊(正向不需自建 redirect、meta refresh 僅反向棄用備援)。設計原則:瀏覽器儲存 = 快取/便利層、非 source of truth(帳本→P2P、身分→助記詞、內容→IPFS、code→git)。部署資訊二輪全結案。

同日三輪複審(自我一致性 / §8 宣稱查證 / runbook 完整性;中2細項7全修):⭐中1 §8.3-2 CI 不變式字面修正——「bootstrap 清單不得含域名」不可能成立(multiaddr 必含自有 hostname、裸 IP 反壞 TLS)→ 拆兩層:OrbitDB address / pubsub topic = 純內容派生、不含任何域名、不從 location.origin 派生;bootstrap / signaling / pinning 端點 hostname 與主站 origin 解耦(主站換域不需改任何端點;§11 補呼應註)/ ⭐中2 Lighthouse 門檻 drift——部署 §7.7(P90/A90/BP90/SEO95)vs seo.md §7(0.85/0.95/0.95+LCP/CLS)→ seo.md §7 為權威+補 best-practices ≥ 0.9(保留 BP 檢查),部署 §7.7 與 §9 改指標(同 §7.2/§7.3 不重列慣例)/ 細項 7:§3.4 pinning 職責補「訂閱檢查點自動 pin」+「下架與拒服務 §9」兩列(一輪改動回鏡)/ §7.5 JSON-LD 對齊 seo.md §3(首頁 @graph VideoGame+WebSite、場地 Game、創作者 Person;廢「Organization」誤記)/ §8.1 首播 ±30s 引用改 ledger.md §1(資料系統 §11 = P2P 訊息容差+事件無 nonce 劃界、非事件收件驗證本體)/ §8.2 補離線玩家底線註(onboarding 強制助記詞備份 = 底線、banner = best-effort)/ §8.4-5 補 herding CORS 驗證步(舊 origin fetch follow-301 跨源讀取依賴 GH Pages Access-Control-Allow-Origin: *)/ §9 補獨立每日 sitemap workflow 一行 / §2、§13 微指向(遷移程序見 §8;cold partition 歷史查詢)。部署資訊三輪結案、無待辦。