歷史記錄 · 2026-08-11¶
經濟正確性修復¶
2026-08-11 ─ Royalty 去重窗改以實際發放時間為錨(issue 000316)¶
修正同 (cid, player) 的 24 小時去重窗:只有 MatchResultEvent 實際鑄出該 UGC 的 royalty 時才更新錨點;窗內持續使用仍累加 totalUses、uniqueUsers 與單調的 lastUsedAt,但不再把下一次發放無限往後推。
Derived state 欄位由語意含糊的 recentUsers 正名為 lastRoyaltyAtByPlayer,checkpoint wire shape 同步更新。RoyaltyShare 新增已多簽的 triggerPlayer,讓 fold 能區分同場仍在窗內與已到期的玩家,只更新真正觸發發放的 (sourceCid, triggerPlayer),不從作者收款人或同場其他玩家近似推算。新增每 8 小時持續使用的迴歸:第 8/16/24 小時不重複發放,第 25 小時因已超過首次實際發放 24 小時而可再次鑄出。
場地物理正確性修復¶
2026-08-11 ─ fixed 跑道改以折線線段投影判定中心線(issue 000327)¶
修正 nearestOnRoute 把「到最近預採樣點的距離」誤當成「到 spline 中心線的距離」:現在逐條預採樣折線做夾限投影,並在投影位置連續插值 half-width、tangent 與 up。舊行為的誤差隨 RoutePoint 間距成長,100m 直線即使車正在中心線上也可能量得約 4.15m 偏離,錯誤觸發 b-soft 減速與 teleport;修正後只保留 spline 與其預採樣折線本身的近似誤差。
新增長直線最大採樣間隙迴歸,鎖住中心線距離、寬度/up 插值與回到走廊即解除減速三項語意。相同距離固定保留較前線段,退化線段採固定 fallback,維持共識決定性。
贊助共識守門修復¶
2026-08-11 ─ UGC 贊助政策由 builder 下沉至 live 與 fold(issue 000317)¶
將 sponsorship.min_amount_minor、builtin、仲裁黑名單、target record 存在與禁止自己贊助自己五項規則抽成 sponsorPolicyFailure 純函式,由 UX builder、live receive validator 與 deterministic fold reducer 共用。手工簽署事件不再能繞過官方 UI,以低於治理下限的金額或無效 target 污染 top-100 贊助榜。
stateless schema 維持只驗 exact shape、canonical CID、付款人與簽署者一致及簽章;需要 DerivedState 的規則不放進 admission,避免同步進度造成分歧。live 對未知 CID 採 defer 等待鏡像同步,其餘政策違規 reject;fold 對所有違規 no-op,保留歷史 append 的最後決定性防線。
結算收件資源界限修復¶
2026-08-11 ─ Settlement 重算快取改為有界 LRU(issue 000314)¶
修正 SettlementRecomputeGate 對每組 baseLogHeadCids 永久保留完整 DerivedState 與失敗嘗試計數,導致長時間正常比賽也會無界成長。成功 state 與 attempts 現在共用單一 512-entry LRU,命中會刷新順位,逐出時同步清除兩者;成功暖身後立即清除不再需要的 attempt 計數。
同時把未完成的非同步 deriveStateAt 限制為最多 8 筆。滿載時仍回 base-not-synced,下一次收到或重審相同事件時即可在空位釋出後接續,不把暫時資源壓力誤判成永久拒收。每個仍受追蹤的 frontier 維持最多 3 次暖身;所有限制只屬 live admission 資源管理,不改事件內容、settlement 算式或 deterministic fold。
規則執法契約¶
2026-08-11 ─ 規則執法契約與逐層 Conformance(issue 000330)¶
將既有規則追溯由「測試註解曾提到規則 ID」提升為結構化 rule-contracts.json:每條規則明列語意種類、必要執法層、實作 repo 與全域唯一測試契約。產生器要求 canon anchor 與契約一一對應,workspace checker 同時拒絕 ghost ID、錯誤 ownership、錯層、錯 contract、重複宣告及未呼叫正式 production boundary 的空殼測試。
ECON、MOD 與 LEDGER 共 205 條規則已完成逐層 conformance;跨 repo 的一次性 ledger genesis 由 pinning repo 自己持有 service 契約。live 增量 fold 與 full refold 另收斂到同一 foldLedgerEntrySafely 邊界,所有 business read 共用可直接測試的 fail-closed readiness predicate,anchor 衝突證據也由賽內正式路徑與測試共用同一純函式。舊的一般規則標註仍保留作可讀證據,但不再足以單獨通過 hard gate。
決策檔:D-20260811-01
Canonical PhysicsManifest 與一次性 Admission¶
2026-08-11 ─ Canonical PhysicsManifest 與一次性 Admission receipt(issue 000329)¶
將正式賽物理權威由 race runtime 直接讀取 GLB root/node extras,收斂為版本化 Canonical
PhysicsManifest。canonical finalizer 由實際幾何、材質、合法 empty 與已驗證作者宣告建立完整
manifest,嵌入 canonical GLB 並寫入 version/digest;UGC event 只保存 version/digest 參照。
首次看見 CID 時,content admission 在有界 Worker 內忽略 embedded manifest,從解碼後幾何與
作者宣告獨立重建並跑完整規則;digest、PhysicsFingerprint 或 event reference 任一不一致即拒收,
內容暫缺則 defer。成功後只在本機 IndexedDB 保存 (CID, version, digest) receipt;相同 CID
再次載入只驗 digest,不重做 manifest reconstruction。race runtime 改為只接收 typed
AdmittedAsset,不解析 raw extras、不跑 Wave A/B,也沒有缺欄 fallback。
開發期 asset schema 升為 open4wd_version=2,全部 27 個 builtin 由半成品來源協調正規化、
重烘 manifest 並同步 SHA/CID/provenance;不保留 v1 相容層。最大出貨零件、場地、27 資產
批次與 1,000 次 receipt hit 均加入效能 gate,底盤 mount 同時鎖為固定 18 個且恰有一個
Mount_Weapon。
決策檔:D-20260811-02
Track Entity 決定性 Runtime¶
2026-08-11 ─ Track Entity 決定性 Runtime 與預配置碎片池(issue 000332)¶
場地 decoration、kinematic move/conveyor、visual-only、destructible 與動態磁源全部收斂為 PhysicsManifest typed entity。world build 預配置 intact 與 fragment topology,賽中破壞只切換 enabled 狀態;fragment 依穩定 index、五秒壽命與 64-active FIFO 管理,狀態進 snapshot、checksum、觀戰與 viewport,不再由 runtime 回讀 raw extras 或臨時新增 body。
決策檔:D-20260811-03
逐 Collider 材質接觸¶
2026-08-11 ─ 場地材質、輪組接觸驅動與滾動阻力完整接線(issue 000333)¶
場地由單一固定摩擦 trimesh 改為按 (materialId, sourceNodeIndex) 分區的 collider,entity、fragment
與車輛零件也保留逐 proxy 材質。tire/roller 只依實際 contact manifold 的 normal impulse 傳遞
牽引與滾阻,無接觸時只可空轉;Grip 顯示改為標準柏油配對值並另列滾阻級別。
正式 part 改用 PhysicsManifest 的 deterministic convex proxies,不再以 AABB 猜外形。開發期重烘 27 個 builtin 並加入最大拓撲 benchmark、snapshot 與 conformance 驗證。
決策檔:D-20260811-04
能量域熱模型¶
2026-08-11 ─ 固定熱庫接觸、滑移熱與輪胎熱磨耗(issue 000334)¶
將所有發熱路徑統一為 J/W ledger,每個 part 每幀只用一次 backward Euler 解算;motor/battery 改依實際功率發熱,skill、burn、freeze 不再直接加溫。PhysicsManifest v4 烘焙熱容量、環境熱導、 weakest 熱限及逐 proxy 接觸熱欄位,同一 part 內被其他水密 region 完整包覆的三角面不算環境 散熱,跨零件裝配遮蔽則留待整車級 bake。
tire/roller 與 solid surface 依雙方材質 thermal exchange factor、baked area 及實際 normal impulse
導熱,實際切向 impulse × slip speed 轉為滑移熱。輪胎溫度相對環境至熱限線性放大行駛磨耗並可
直接熱壞;HUD 增加全車最熱輪胎的相對狀態,不顯示精確溫度。開發期升 open4wd_version=5、
builtin_assets_version=5、SavedState v7,27 個半成品 builtin 只作契約驗證,平衡仍以 synthetic
reference 校準。
決策檔:D-20260811-05
輪組二元損壞¶
2026-08-11 ─ 固定驅動份額、零抓地與回滾重建(issue 000336)¶
輪胎與導輪統一以不可逆 broken 作唯一狀態來源。破胎保留 body、collider、法向支撐與 Revolute,
但所有接觸摩擦改為 0/Min,解析牽引同步歸零並套額外滾阻;驅動以原始四輪固定分母,損壞輪
份額不重分配,因此總驅動依序為 100/75/50/25/0%。破損導輪保留拓撲,改施每幀有界軸向
制動。respawn 不修復,新回合全新 world 才重設。
SavedState v7 把 state-dependent 摩擦移出 immutable topology,改由 runtime hash 與 envelope
broken 雙向驗證,restore 後再重建;不一致原子拒絕。HUD 新增同幀可聚合的 PartBroken 文字提示,
以 FL/FR/RL/RR mount slot 標示,既有保留音效照常。兩項 K 值先以 synthetic fixture 定標,
半成品 builtin 不作平衡權威。
決策檔:D-20260811-06
相對氣流與決定性天候¶
2026-08-11 ─ 相對氣流六軸 Aero 與決定性 Weather Patch(issue 000331)¶
場地風由牛頓基準力改為 m/s 風速;body 由八向係數改為 ±X/±Y/±Z 六軸迎風面積與各向
壓力中心。runtime 以 COP 點的 wind - velocity 計算 drag,並正式接上 lift/downforce 與車重
force cap,因此無風移動車仍有空阻、靜止車也會受風。
Rain/snow patch 由 match、round 與 track manifest digest 派生 seed,使用整數 accumulator、 穩定 ordinal、固定八次候選、typed exposure 與 50 active 上限。patch 只修改 tire/roller 對 靜態 solid 的 friction/rolling resistance,重疊不疊乘,weather restitution 正式移除。 Physics engine 提供唯一 descriptors 給 participant、spectator、viewport 與 editor preview; scheduler 與 active state 進 SavedState v8/checksum/strict restore。
開發期維持唯一 open4wd_version=5,PhysicsManifest 升 v5,27 個半成品 builtin 同版重烘並
同步 provenance,不建立 fallback 或 migration catalog。最大八車/50 patch 加入 60Hz benchmark。
決策檔:D-20260811-07
玩家動態偏好與單一有效狀態¶
2026-08-11 ─ 玩家動態偏好與單一有效狀態(issue 000342)¶
顯示設定以 motionPreference: system | reduce 取代未實作的舊 boolean,不保留 migration 或
可覆蓋 OS 無障礙偏好的 full 模式。root-scope runtime 將玩家選擇與 OS media query 合併為
唯一 effective reduced motion,監聽 OS 即時變更,並投影 data-motion=reduce|full;靜態/SSG
初始 pending 採 reduce-safe,避免設定載入前先播放裝飾動畫。
CSS 特例、受控主題與 Home/Garage/Result 的展示車自轉共用此契約。展示車只停止角度增量,
恢復後從原角度續轉;比賽物理、Viewport render loop、Editor、必要相機、HUD、polling、network
與 spectator 更新不受影響。effectsQuality 維持獨立的效能/畫質軸。
決策檔:D-20260811-08
定點能量帳與全 SOC 線性供電¶
2026-08-11 ─ 定點能量帳、線性供電與 admission hard rules(issues 000325/000326/000323)¶
Motor/Battery 改用 PhysicsManifest v6 的整數 mW/mJ 欄位與 1/60 mJ runtime quantum;可供輸出
依 SOC 全區間線性下降,取消 mAh、固定 knee/reserve 與舊 drain 常數。駕駛先結帳,技能依已簽
event 順序結帳;allocation_pct 是除以 100 的整數百分比,不按總和正規化。效果能量、電池成本、
chip heat、battery heat 分帳,launch 只在成功 release 後結算。
電池幾何輸出上限與晶片總 allocation 兩條 hard rule 同時落到 finalizer/admission/runtime boundary,
以 PART-R-001/PHYS-R-001 conformance 看守。開發期升 open4wd_version=6、builtin assets v6、
SavedState v9,27 個半成品 builtin 全數重烘,不保留 runtime legacy fallback;HUD 同時顯示 SOC、
可供輸出比例與「輸出受限」。
決策檔:D-20260811-09
逐 Region 接觸耗散輪胎磨耗¶
2026-08-11 ─ 極速巡航與滑行輪胎不磨耗(issue 000324)¶
輪胎 fatigue 不再以 driveImpulseNs > 0 與全車重量近似啟動,改由本幀 canonical
solid contact 計算 rolling impulse × rolling speed 與 tangential impulse × slip speed;slip 以
獨立倍率放大。因此極速巡航、無驅動滑行與下坡仍會耗胎,無 solid contact 及真正
靜止則為零。rolling 只按實際施加且 stop-clamped 的 impulse 記帳,避免低速停止時多算。
壽命分母改為每個 tire material region 的體積 × ultimate strength × synthetic 容量係數,
輪殼等非胎面區不會擴充實際耗胎容量。溫度以相對環境至熱限的比例 r 套
1 + 2r² 有界放大。PhysicsManifest 與唯一資產 marker 同步升 v7,27 個半成品
builtin 只用於合約驗證與 synthetic 初值,不視為最終平衡基準。
決策檔:D-20260811-10
場地硬規則與 Receipt-Gated Runtime¶
2026-08-11 ─ 場地硬規則與 Receipt-Gated Runtime(issue 000328)¶
場地 route/lap mode、empty 關聯、重力/磁源、天氣、材質、entity 與幾何/資源上限正式收斂為
TRACK-R-001。canonical finalizer 與首次 CID admission 對實際 GLB 共用同一純 validator;只有
reject findings 是協定拒收,密度、窄路等 warning 仍只供編輯器提示。
首次 admission 必須獨立重建完整 TrackPhysicsManifest、核對 version/digest/schema,且 receipt
持久化成功後才發布 admitted manifest。正式 race asset boundary 同時核對 ledger record、embedded
reference 與本機 receipt,缺任一即拒絕;runtime 只消費 typed manifest,不重跑幾何或回讀 raw
extras。舊六欄 track PhysicsFingerprint 保留 fork 分類用途,不升格為物理權威;PhysicsManifest v7
已可完整承載資料,本次不再升版。
決策檔:D-20260811-11
作品贊助永久聚合¶
2026-08-11 ─ 作品贊助改為永久 UGC 聚合(issue 000319)¶
移除互不相連的作品 top-100 共識榜與贊助者 raw-log 榜。每筆有效贊助改在 target UgcRecord
永久累加 sponsoredTotalMinor、sponsorEventCount 與單調 lastSponsoredAt,隨 checkpoint 保存;
不保存無界贊助者集合或逐筆永久歷史。贊助金額仍全數燒毀,榜只代表作品支持度/能見度,
不代表作者收入。
作品榜改為查詢時掃全部 UGC 後排序並套 top-N,fold 不再裁掉榜外累計;近期創作者發現仍由
weeklyTopCreators 負責。人物軸 EconomyData.sponsorBoard() 與 scanEconomy.sponsorTotals 一併
移除。開發期直接採新 DerivedState 形狀,不保留舊 checkpoint fallback。
決策檔:D-20260811-12
經濟聚合不變式 property gate¶
2026-08-11 ─ 總鑄幣、月鑄幣與餘額下限納入 CI(issue 000318)¶
src/testing/property.spec.ts 新增固定 seed 的合法經濟事件序列測試,200 組 trace 混合
match mint、part/track upload、slot purchase、UGC sponsor 與 maintenance,並涵蓋跨月 rollover。
測試以獨立 oracle 逐步核對 totalMinted、totalBurned、monthMinted、月錨、全體餘額總和,
以及負餘額必須已使用首次上鏈額度且不低於該次上鏈費的下限。資料系統 §18 宣稱的三條經濟
聚合不變式至此有實際 CI 看守;#319 已移除的舊 sponsorship top-100 逐出不再另測。
結構化主題字型與 Runtime Namespace¶
2026-08-11 ─ 主題字型採 manifest 窄契約(issue 000339)¶
theme.json 新增可選 base/mono/display 字型角色,每個 face 只接受同主題 WOFF2、weight、
normal/italic style 與 OFL 1.1 授權檔;單主題最多 4 檔、合計 512 KiB。作者 CSS 的 raw
@font-face 維持禁止,runtime 以 theme id+role 產生全域唯一 family、固定 font-display: swap,
再映射既有字型 token。下載、解碼或缺 glyph 只回退 locale-aware stack,不使主題啟用失敗。
validator 除 schema、路徑、授權與 WOFF2 結構外,另在 CI 用 Chromium FontFace.load() 真實
解碼;Default 字型與授權列 precache,非 Default 維持 cache-first lazy。
決策檔:D-20260811-13
材質 Capability 與介面界限¶
2026-08-11 ─ 材質 Capability 與「介面嚴、外形寬」(issue 000337)¶
canonical 相容性由全零件共用的 ±15% 尺寸帶,改為 mount center、hinge axis/radius/width 與 mating normal 的逐 feature 絕對公差。輪徑、馬達總長、滾輪外徑、AABB、外殼比例與純視覺輪廓 不再是拒收門檻;公版 GLB 明確視為開發期半成品與視覺/平衡起點。schema-valid UGC 的極端但 合法組合由 runtime 的有限值 guard、clamp、budget 與決定性退化承擔。
材質效果改以實際 runtime consumer 定義:solid 接觸才使用 friction/restitution,輪組與 solid surface 才使用 rolling resistance;地表/entity 是固定溫度熱庫,不建立動態地面熱場。fluid 維持 sensor+deploy behavior,sticky 衰減不擴張為 3D viscosity、浮力或一般流體阻力。未來新增 能力必須同時補 runtime、測試與規格,不能只改材質參數就宣稱生效。
決策檔:D-20260811-14
Style API v1 Emitter 雙向完整性¶
2026-08-11 ─ Style API v1 emitter 雙向完整性(issue 000340)¶
移除無 production emitter 的 shell-accent/panel-corner,將既有 Garage atmosphere 暴露為
非互動、全 shell 覆蓋且不保證固定幾何的 garage-decoration,並把 hero-art-frame 原子更名為
Hero artwork viewport/clip surface 語意的 hero-art-surface。開發期不留 alias、不升 Style API v2。
themes:validate 新增 registry/emitter 雙向 gate,涵蓋 Angular HTML、component host metadata
與封閉 literal themePart input,排除 specs、fixtures、dist、generated;真正動態來源必須逐一提供
封閉映射。THEME_PARTS 成為唯一機器名錄,canon 不再手抄容易漂移的局部完整清單。
決策檔:D-20260811-15
經濟月流水與創作者收益衍生讀模型¶
2026-08-11 ─ 經濟月流水與創作者收益改為衍生讀模型(issue 000343)¶
移除 provider 端依 log heads memo 的全原始事件掃描。月流水改由 fold 在
monthlyFlowsByMonth 維護每 peer minted/burned,保留當月含往前 11 個 UTC 月;
創作者頁的累計收益改讀 lifetimeRoyaltyMintedByPeer,只計實際鑄出 royalty 且永久保留。
兩投影只在 reducer 接受事件時更新,拒絕/no-op 事件不入帳,並一併納入 canonical bigint codec、checkpoint GC 與 restart refold 一致性驗證。開發期直接採新 DerivedState 形狀,不保留缺欄舊 checkpoint fallback。
決策檔:D-20260811-16
專案生命週期與首次公開發布鏈¶
2026-08-11 ─ 專案生命週期與首次公開發布鏈定案¶
將 repo visibility、candidate maturity、runtime phase 與 live operating mode 拆成四條獨立軸;
正式相容義務由 runtime_phase=live 決定,不再以任一周邊 repo 是否公開推測。美術、正式 GLB、
驗證與 playtest 改為可交錯迭代,透過 Asset-ready 與 Pre-launch baseline 兩道 gate 收斂到同一
release subject,內部候選不挪用 public builtin 版本號。
首次公開鏈固定為 public specs+docs.open4wd.org → main source baseline → pinning → signaling →
turn → Ledger genesis/receipt/不同 identity replica → main release public/live → remote provenance
→ open4wd.org activation → workflow public。Docs 可索引並供閱讀、介紹與教學,但不是遊戲
runtime,不觸發 live。Main source baseline 與加入正式 Ledger 值後的 release SHA 明確分名;若
vendored path 在兩者之間改變,周邊同步與 provenance 必須重跑。
Main repo 成功轉 public 即不可逆進入 live。後續普通 rollback、參數回設、derive 重算或鏈重生都 維持 live,只依正常/緊急作業與既有版本、checkpoint、治理程序處理。
決策檔:D-20260811-17