D-20260707-01|決定性紀律:正確捨入白名單與 ESLint 防線¶
背景與驅動力¶
使用者問「程式內許多計算有小數,是合理使用還是疏忽?」全 src 盤點後判定:浮點本身是設計決定——ECMAScript 保證加減乘除、Math.sqrt 與整數取捨函數正確捨入 = 跨引擎逐位元一致;風險在規格標 implementation-approximated 的函數(跨引擎可差 1 ulp=P2P 物理分岔源)。盤點漏網兩類五處(Math.cbrt 與 ** 冪運算)全修。
考慮過的選項¶
- 全面整數定點化:僅用在浮點做不到之處(TrueSkill 定點、經濟 bigint、hash 邊界量化)、不擴大——與 rapier deterministic-compat 同模型。
- 正確捨入白名單 + 禁近似函數(採納)。
決定¶
- 正確捨入白名單運算 = 加減乘除、
Math.sqrt、整數取捨(round/floor/ceil/trunc/abs/min/max);禁 implementation-approximated 數學函數與**冪運算子(規格屬 pow 語意近似)。替代法:連乘、線性化、定次 Newton(deterministicCbrt= 定次 32 輪、僅用白名單運算)。 - ESLint 決定性防線:物理模組禁
**與**=、Math黑名單 23 成員(implementation-approximated 全集 +random);tripwire 級(別名繞過靠複審把關)、範圍隨站別擴充至 ledger、matchmaking、network-sync。 - 運算紀律入 canon:程式架構/physics-engine.md determinism 表補「運算白名單」列。
附帶決策¶
dt 權威 =1/60 秒精確(2026-07-05 定):TIME_STEP_X1000 的 16 為名目毫秒標示、非計算用,禁以 16ms 毫秒值除以 1000 回推(16ms=62.5Hz、會使所有乘 dt 公式快 4.2%);dt=1 除以 FIXED_FRAMERATE_HZ。釘死於 程式參數.md 與 程式架構.md。
後果與影響¶
P2P 物理決定性從約定升為「白名單 +lint 防線 +canon 落點」三層;與 D-20260524-03 的引擎鎖版、D-20260706-12 的定點化構成同族紀律。