Skip to content

v7.8.0

Choose a tag to compare

@z10000 z10000 released this 06 Sep 05:39
· 5 commits to main since this release

v7.8.0

The final consistency audit of Stage AV (loose surfaces v7.6.0, four-wheel friction brakes v7.7.0) and rulings on its seven carry-overs. The driving physics is unchanged down to the byte (the frozen benchmarks f0–f3, official-race verifyHash values and existing share URLs are all unchanged). (1) The HUD and race-report "friction-circle usage" is now normalized by the peak. The display is the normalized slip σ shown as a percentage; on tarmac the peak is at σ=1, so "100% = the limit" reads correctly, but on a loose surface the peak is at σ=3, so in v7.6.0/v7.7.0 a car running at maximum grip displayed 300%. On digging surfaces the display now divides by the actual peak σ of that surface’s tire law (exactly 3 with the built-in tires' default muDecay), so "100% = the peak, over 100% = sliding past the peak" reads the same on tarmac and on loose. It is a display-layer change: tarmac goes through the same expression as before, so its value is unchanged, and the physics state does not move (6 assertions added to the standing gate wf_av1_loose.mjs: 39 → 45, including that swapping the peak σ leaves the physics state bit-identical while only the display scales — on both the tarmac and the tabletop semi-implicit braking paths — and, as a static check on the source, that the only line reading sigPk is the display assignment). The race report's suitability label ("a lot of sliding" at a peak usage of 150% or more) is also judged on the normalized value. (2) We measured why four-wheel friction brakes brake weaker on the tabletop / mid-scale, and hand the fix over as a carry-forward. (The figures in this item come from a one-off measurement harness that is not shipped in the repository.) The mechanism written in v7.7.0 ("the semi-implicit wheel ODE uses a safe-side tire stiffness") is not the main cause — moving the damping to the local slope does not fix it (friction/motor ratio 0.758 → 0.685, computed from the actual final speed; the 0.77 printed by the standing gate uses the target final speed). The real cause is the operator split that freezes the ground-contact speed during the implicit update, and the error scales with the substep width. Conversely, the current tabletop / mid-scale precision-v2 engine brakes about 36% weaker on the tabletop and about 32% weaker at mid-scale than the reference solution with the motor brake (the explicit integration used before v4.0.0, converged to within 0.1% when the substep cap is raised from 256 to 4096; decelerations computed from the actual final speed: 2.34 vs 3.65 and 2.49 vs 3.65 m/s²), and running the current semi-implicit scheme with 4096 substeps converges to the reference — the difference is purely splitting error. This quantity was not part of the v4.0.0-era A/B characterization. A naive fix — predicting the change of ground speed from the previous substep and integrating the slip variable implicitly — brings the motor brake back to within −5% of the reference, but for four-wheel braking it turns into a period-2 numerical oscillation at the production substep width (the body is pushed forward in 22% of substeps), so it is not a valid measurement — a real fix has to solve the wheel–body coupling within the same substep. Because a fix changes the default tabletop v2 physics (and so the reproducibility of practice records), it is not implemented in this version; the mechanism and the numbers are recorded in §13.16 of the physics notes (adoption is a decision for a separate version). (3) The case where one wheel’s command turns drive-side during braking on LSD-equipped cars is left as is. The differential’s transfer cap is an absolute value (8, mass-normalized), so it happens where the axle’s braking force is small (the tabletop), but it happens with the default motor brake too (85 of 504 runs), the totals and energy invariants hold, and it is the same thing as differential wind-up in a real car. (4) The brake-split presets are not made drivetrain-dependent. That an FR car never loses a recovery cell while FF/AWD cars do (measured in v7.7.0) is now stated in the equipment selector’s tooltip and in the physics notes; a per-drivetrain default would make the same equipment name mean different things per car, unreadable in a record’s conditions. (5) The four deliberately unasserted lines of v7.6.0 (in physics_v2.js: CaTot, dFxdvw, kD and the reversing-mode CaF/CaR — the places that estimate the digging-inclusive longitudinal tire stiffness on the linear-region, safe side) were re-examined by breaking them one at a time across a sweep of 3 regimes × 2 surfaces (the built-in loose surface and a test surface whose digging ramp dig/digSat is 10× steeper, i.e. +37% longitudinal stiffness versus tarmac for the normal tire and +35% for the rain tire) × 3 grips × 3 car types × 4 commands × 3 steering states × 3 equipment sets = 1,944 traces (a harness that is not shipped): no non-finite values, no yaw blow-up and no surge of κ clamping, and although the trajectories do change (so the mutations are live), nothing detectable changed (the friction circle and dissipativity are structurally guaranteed quantities and cannot break in principle). They therefore stay unasserted — measured, and recorded as out of reach. (5') The v7.6.0 loose-surface sweep was widened once to 18 cells (3 corners × 2 angles × 3 car types, --full). The widening of the feasible region survives (drift runs that get round without breaking 74→754; cells with a solution 6/18→9/18), but the aggregate sign of "more deep-slip solutions" depends on the sweep (it falls 28→18 over the default 6 cells and rises 58→234 over 18 cells) — so expectation ② that v7.6.0 called "does not hold in aggregate" is grid-dependent just like ① (§13.15 of the physics notes corrected). (6) The "38 assertions" in the v7.6.0 changelog was a miscount (measured 39) and is corrected. (7) A design flaw in the standing gate wf_ap19_noise.mjs (sensor outlier rate) that made it go red about 5% of the time is fixed: the reference "true" reading was taken once with outlier injection still enabled and before seeding the random generator, so whenever that one reading happened to be an outlier, all 50,000 subsequent readings counted as "different" (observed during this audit in 1 of 4 full-suite runs and 1 of 12 standalone repeats). The reference is now read with outliers set to 0; after the fix it passed 20 consecutive runs. The product code under test is unchanged.

日本語

Stage AV(ルーズ路面 v7.6.0・4輪摩擦ブレーキ v7.7.0)の最終整合監査と、持ち越し 7 件の裁定です。走行物理は 1 バイトも変えていません(凍結ベンチ f0〜f3・公式レースの verifyHash・既存の共有 URL はすべて不変)。①HUD とレースレポートの「摩擦円使用率」をピークで正規化しました。この表示は正規化スリップ σ を百分率にしたもので、舗装ではピークが σ=1 なので「100%=限界」と読めますが、ルーズ路面はピークが σ=3 なので v7.6.0/v7.7.0 では最大グリップで走る車が 300% と出ていました。掘り込み路面ではその路面のタイヤ法則の実ピーク σ(出荷タイヤの既定 muDecay では 3 ちょうど)で割り、舗装でもルーズでも「100%=ピーク・100% 超=ピークを越えて滑走」と読めるようにしました。表示層だけの変更で、舗装は旧式と同じ式を通るので値は従来どおり、物理状態は動きません(常設ゲート wf_av1_loose.mjs に 6 アサート追加=39→45。ピーク σ を差し替えても物理状態が bit 一致し表示だけが比例して変わること(舗装と卓上の半陰的制動の両経路)、ソース上で sigPk を読む行が表示の代入だけであること(静的検査)まで固定しています)。レースレポートの適不適ラベル(摩擦円使用率のピーク ≥150% で「滑走が多い」)もこの正規化後の値で判定します。②卓上・中スケールで 4輪摩擦ブレーキが制動を「弱める」機序を測定し、修正は申し送りにしました(この項の数値はリポジトリに同梱していない一回限りの測定ハーネスによるものです)。v7.7.0 で「車輪 ODE の半陰的化がタイヤ剛性に安全側の値を使うため」と書いた機序は主因ではなく(減衰を局所勾配へ寄せても friction/motor 比は 0.758→0.685 と直りません。実終速で計算した値で、常設ゲートが印字する 0.77 は目標終速基準です)、真因は陰的更新の間に接地速度を凍結する作用素分割で、誤差は substep 幅に比例します。裏返せば現在の卓上/中スケールの精密 v2 は、参照解(v4.0.0 以前の原 explicit 積分。substep 上限を 256→4096 にしても 0.1% 以内で収束)よりモーターブレーキの制動が卓上で約 36%・中スケールで約 32% 弱い(実終速で計算した減速度 2.34 対 3.65・2.49 対 3.65 m/s²)ことになり、現行の半陰的化のまま substep を 4096 分割にすると参照解へ収束します=差は分割誤差そのものです。これは v4.0.0 当時の A/B 特性化に入っていなかった量です。接地速度の変化を前 substep から予測して滑り変数で陰的化する素朴な修正案は、モーターブレーキでは参照解の −5% まで戻りますが、4 輪制動では本番の substep 幅で周期 2 の数値振動になり(制動中に車体が前へ押される substep が 22%)測定として成立しません=修正には車輪と車体の連成を同じ substep で解く形が要ります。既定の卓上 v2 物理を変える(練習記録の再現性が変わる)ため本版では実装せず、機序と数値を物理解説 §13.16 に残しました(採否は別版の判断)。③LSD 装備車で制動中に片輪の指令が加速側へ回る件は変えません。差動の移送上限が絶対値(質量正規化 8)なので卓上のように軸制動力が小さい条件で起きますが、既定のモーターブレーキでも起きる差動モデルの性質(504 run 中 85 件)で、総量とエネルギーの不変条件は保たれており、実車のデフ巻き込みと同じ現象です。④ブレーキ配分のプリセットは駆動方式別にしません。FR は旋回復帰が 1 セルも悪化しないのに FF/4WD は復帰を失うセルがある(v7.7.0 実測)ことは、装備セレクタのツールチップと物理解説に明記しました。同じ装備名が車ごとに別物になると記録の条件が読めなくなるためです。⑤v7.6.0 で意図的に非アサートにした 4 行(physics_v2.js の CaTot・dFxdvw・kD・後退時の CaF/CaR=掘り込み込みのタイヤ縦剛性を線形域・安全側で見積もる箇所)を、3 領域 × 2 路面(出荷の loose と、掘り込みの立ち上がり勾配 dig/digSat を 10 倍=縦剛性で舗装比 +37%(normal タイヤ基準・rain では +35%)にした検査用路面)× 3 grip × 3 車種 × 4 指令 × 3 舵 × 3 装備=1,944 trace の掃引(同梱していないハーネス)で 1 行ずつ壊して再検査しましたが、非有限・ヨーの発散・κ クランプの多発は起きず、軌跡は変わる(=変異は生きている)のに検出できる量がありませんでした(摩擦円・散逸性は構造保証量なので原理的に破れません)。∴ 非アサートのままです(測定して届かないことを記録)。⑤'v7.6.0 のルーズ路面の掃引を 18 セル(3 コーナー × 2 角度 × 3 車種・--full)へ広げて 1 回だけ確かめました。成立域の拡大は保たれます(破綻せず回れるドリフト解 74→754 run・解を持つセル 6/18→9/18)が、「深い滑りで回れる解が増える」の合計の符号は掃引に依存します(既定 6 セルで 28→18 と減り、18 セルでは 58→234 と増える)=v7.6.0 で「合計では成り立たない」と書いた予想②も、①と同じく格子依存でした(物理解説 §13.15 を是正)。⑥ v7.6.0 の変更履歴の「38 アサート」は実測 39 の誤記だったので直しました。⑦ 常設ゲート wf_ap19_noise.mjs(センサーの外れ値率)が約 5% の確率で赤になる設計欠陥を直しました。基準となる真値の読みを、外れ値注入を有効にしたまま・シード前の乱数で 1 回読んでいたため、その 1 回が外れ値だと以後 50,000 回が「全部違う」と数えられていました(本版の監査で全ゲート 4 回中 1 回・単独反復 12 回中 1 回で実測)。基準読みは外れ値 0 で取るように改め、修正後は 20 回連続で緑です。検査対象の製品コードは無改変です。


Verifying this release yourself

cd Simulator
node wf_run_all.mjs        # the full assertion-gate suite

The suite runs from a fresh clone with no dependencies beyond Node.js.
The real-browser checks under Simulator/browser/ additionally need npm install and a display.