SSIM memset 削除 (A1) / work_grad clear の GPU blit 化 (A2) / backward uniform の set_bytes 化 (A3) / 未使用 C3 scratch の lazy grow 化 (A4) をまとめて 1 flag セット (全 ON/全 OFF) で gate した。<strong>v1 (n=3, 旧 baseline)</strong>: train elapsed 155.40 → 147.64s (-4.99%)、方向は 3 pair 全てで on が速く一貫していたが、有意閾値 <strong>max(2σ<sub>off</sub>, 1%) = 5.11%</strong> を <strong>0.12 pt 差で下回り</strong>不採用。加えて <strong>PSNR が on 側で 3/3 完全分離</strong> (Δ -0.065 dB) し guard に抵触。<strong>v2 (n=5, 2026-08-30 M4 radix ballot 採用後の新 baseline 127.4s 上で再 gate)</strong>: PSNR は mean **+0.028 dB**・5 pair 中符号混在 (on>off 3 / on<off 2) で <strong>v1 の系統分離は再現せず、「静かな壊れ」仮説は反証</strong>された。wallclock は Δ **-1.11%** で閾値 1.05% を 0.06 pt 差で形式上通過するが、汚染 pair の扱い方 (生データ Δ-0.30%、n=6 で残すと Δ-0.15%、いずれも不通過) に判定が強く依存する<strong>脆い pass</strong>であり、advisor レビューの指摘により <strong>棄却を維持</strong> (根拠は「PSNR guard 抵触」から「wallclock 効果量 ≤1% で本 harness の分解能未満、判定不能」に変更)。<code>cargo test --workspace</code> は両 gate とも全 pass。<strong>4 flag の default は HostMemset / HostBuffer / false のまま維持、config.rs は変更しない</strong>。
M2 Tier1 の 4 flag は docs/strategy/2026-08-next-phase-tasklist.md の A1-A4 表が「correctness surface ゼロ」と分類した施策で、CPU 側 memset/alloc/host buffer を GPU 側の blit/set_bytes/lazy grow に置き換えるだけの実行主体変更のはずだった。4 flag をまとめて 1 set (全 ON = arm B) / 全 OFF (arm A) として 12.5k Lego 同一 session 交互 A/B off→on→off→on→off→on (n=3) で gate した。wallclock は方向性が一貫し閾値に肉薄したが未達、PSNR は逆に閾値を明確に超えて悪化方向に分離した — wallclock で通し PSNR で落ちるという、この gate 群では初めてのパターン。
| 実行順 | arm | config | train elapsed (s) | PSNR (dB) | final splats |
|---|---|---|---|---|---|
| 1 | off (A) | t1-12500-off-r1 | 150.82 | 36.201 | 409,121 |
| 2 | on (B) | t1-12500-on-r1 | 148.11 | 36.165 | 408,516 |
| 3 | off (A) | t1-12500-off-r2 | 157.96 | 36.195 | 407,505 |
| 4 | on (B) | t1-12500-on-r2 | 146.70 | 36.097 | 405,175 |
| 5 | off (A) | t1-12500-off-r3 | 157.41 | 36.219 | 409,537 |
| 6 | on (B) | t1-12500-on-r3 | 148.10 | 36.157 | 409,633 |
| **mean** | **off** | — | **155.40** (σ 2.56%) | **36.205** | 408,721 |
| **mean** | **on** | — | **147.64** (σ 0.55%) | **36.140** | 407,775 |
| **Δ** | — | — | **-4.99%** | **-0.065** | -0.23% |
off 側 sample σ (n=3, n-1 分母) は 2.56% (p2-s3 の σ 定義と同じ式で `3.973 / 155.397` = 2.557%、p2-s3 の 3.33% / 1.18% を独立に再現できることで式の一致を確認済み)。有意閾値は max(2σ_off, 1%) = 5.11%。実測 Δ は -4.99%、閾値の 97.7% で 0.12 pt 差の僅差で未達。3 pair 全てで on が速い方向は一貫しており (off-r1>on-r1, off-r2>on-r2, off-r3>on-r3)、σ の非対称 (off 2.56% / on 0.55% = 4.66×、p2-s3 の採用ケースでの 2.8× より大きい) は「on 側が GPU 律速で host jitter に鈍い」という同型の機構の可能性も、host 側 CPU 競合の非対称汚染の可能性も両方説明できてしまい、本データだけでは切り分けられない (§3 の限界一覧を参照)。off-r1 (150.82s) は 3 本中最速で off 側平均を押し下げ σ を押し上げる方向に効いている ── p2-s3 が「残せば S3 に不利な側に倒すので採用する」とした基準に倣い、本 finding でも**除外していない**。
on の PSNR 3 値 (36.165 / 36.097 / 36.157) は off の 3 値 (36.201 / 36.195 / 36.219) を すべて下回る完全分離。mean Δ は -0.065 dB。本 task が指定した guard (on mean ≥ off mean - 0.05 dB) には抵触 (-0.065 < -0.05)。一方、gate config header が記す 絶対 guard (36.202 ± 0.1 dB) では on mean 36.140 / off mean 36.205 ともに帯内 [36.102, 36.302] で pass ── 出典によって guard の定義 (相対 -0.05dB vs 絶対 ±0.1dB) が食い違っており、どちらを A1-A4 のような bit-exact 施策に適用すべきかは本 finding では判定せず、**判断を main に返す**。ただし wallclock 側が既に閾値未達である以上、どちらの guard 読みを採っても本 gate の結論 (棄却) は変わらない。
kernels::ssim::tests::ssim_clear_shader_coverage_overwrites_sentinel (A1 の 0xCD sentinel probe)、kernels::rasterize::tests::backward_from_buf_grad_clear_and_uniform_variants_match (A2+A3 の `HostMemset`×`GpuBlit` / `HostBuffer`×`SetBytes` 4 組合せ勾配一致)、kernels::tile_bin::tests::lazy_c3_scratch_self_heals_after_late_tile_counting_flip (A4) を含め ワークスペース全体 86+70+8+8+7+1 件が全 pass。単体 test レベルでの correctness bug は否定的で、A1-A4 の bit-exact 主張自体は unit test の粒度では裏付けられる。
したがって PSNR の完全分離は「A1-A4 の kernel 実装が数学的に異なる値を出している」ことより、既存の atomic 非決定性 (`atomic_fetch_add` の dispatch 順序依存、`#5.31.x.future` で std=0.6dB と判明済み、p2-s3 でも final splats ±0.6% の chaos として観測済み) が A4 の scratch footprint 縮小 (2 世代 156MB → 必要時のみ確保) によるメモリレイアウト変化で増幅された可能性の方が高い、という仮説になる。ただし 本 gate は 4 flag を同時に切り替えているため、どの 1 flag (あるいは flag 間の相互作用) が PSNR 分離の原因かは切り分けられていない。p2-s3 の chaos (final splats +0.6%/-0.6% で方向不一致) と異なり、今回は 3/3 全て同方向に分離しており「純粋な無方向 chaos」とは言い切れない点が、この仮説だけで済ませてよいか慎重にすべき理由でもある。
| 実行順 | arm | run | train elapsed (s) | PSNR (dB) | run 窓内 load1 平均 / 最大 | 備考 |
|---|---|---|---|---|---|---|
| 1 | off (A) | t1v2-12500-off-r1 | 127.63 | 36.201 | 2.43 / 3.03 | **CONTAMINATED、破棄** (pair 相方の on-r1 で load spike検知、log保存済み) |
| 2 | on (B) | t1v2-12500-on-r1 | 133.57 | 36.145 | 4.60 / **9.09** | **CONTAMINATED、破棄** (走行中 load1 spike、事前登録条件(i)(ii)双方該当) |
| 3 | off (A) | t1v2-12500-off-r2 | 126.56 | 36.220 | 2.92 / 3.60 | 採用 |
| 4 | on (B) | t1v2-12500-on-r2 | 125.31 | 36.159 | 2.03 / 2.30 | 採用 |
| 5 | off (A) | t1v2-12500-off-r3 | 128.27 | 36.102 | 3.13 / 5.38 | 採用 |
| 6 | on (B) | t1v2-12500-on-r3 | 125.38 | 36.196 | 2.97 / 3.45 | 採用 |
| 7 | off (A) | t1v2-12500-off-r4 | 127.79 | 36.237 | 1.59 / 2.09 | 採用 |
| 8 | on (B) | t1v2-12500-on-r4 | 125.26 | 36.221 | 1.19 / 1.65 | 採用 |
| 9 | off (A) | t1v2-12500-off-r5 | 126.97 | 36.181 | 0.82 / 1.22 | 採用 |
| 10 | on (B) | t1v2-12500-on-r5 | 125.82 | 36.197 | 0.85 / 1.22 | 採用 |
| 11 (retry) | off (A) | t1v2-12500-off-r6 | 127.34 | 36.112 | 1.08 / 1.39 | r1 の代替として採用、独立 sampler 終始 clean |
| 12 (retry) | on (B) | t1v2-12500-on-r6 | 128.09 | 36.218 | 1.00 / 1.08 | r1 の代替として採用。ただし**この値自体が事前登録条件(ii)を10.3σで踏む**(下記 callout 参照)、条件(i)は不一致 (sampler は終始 ~1.0 で clean) |
| **mean (n=5、r1→r6 置換)** | **off** | — | **127.386** (σ 0.527%) | **36.1704** | — | — |
| **mean (n=5、r1→r6 置換)** | **on** | — | **125.972** (σ 0.956%) | **36.1982** | — | — |
| **Δ** | — | — | **-1.11%** | **+0.0278** | — | — |
n=5 (r1→r6 置換) では Δ **-1.11%** が有意閾値 max(2σ_off,1%)=**1.054%** を 0.06 pt 差で形式上通過する。しかし**この判定は極めて脆い**: ①汚染 r1 を除外せず生のまま使うと mean は off 127.444s / on 127.068s = Δ**-0.30%**で明確に不通過、②両方の r1 試行 (元 r1 + retry r6) を n=6 として両方残すと off 127.427s / on 127.238s = Δ**-0.15%**でこれも不通過。3 通りの扱いのうち pass するのは 1 通りのみで、1 点の去就 (含める/除外する/置換する) で判定が反転する。加えて置換先の r6 自身 (128.09s) は on arm の他 4 値 (125.26-125.82、mean 125.4425、sample σ 0.2564) から **10.32σ** 外れており、事前登録した再実行条件 (ii) (自 arm 内 3σ 超) を単独で踏む。r6 の独立 load sampler は走行中終始 ~1.0 で条件 (i) (load 証拠) とは不一致であり、「条件(ii) だけでは停止できない除外連鎖になる」設計上の欠陥であることが判明した (次に活かす教訓として下記に明記)。以上により、本 gate は wallclock を「pass」として採用の根拠にしない。
v1 は n=3 で on 側 3/3 が off 側 3/3 を完全に下回る系統的分離 (Δ -0.065 dB) を示し、A4 の scratch footprint 縮小による atomic 加算順序 chaos 増幅の疑いが残っていた。v2 (n=5) では mean Δ が **+0.0278 dB** で guard に明確に pass し、5 pair の符号は on>off (r1,r3,r5) / on<off (r2,r4) と混在、系統性は一切見られない。むしろ v2 では **off 側の散らばり (36.102-36.237、レンジ 0.135 dB) が on 側 (36.159-36.221、レンジ 0.062 dB) より大きい**という v1 と逆の非対称すら観測された。これは「PSNR の散らばりは既存の atomic 非決定性の床であって、A1-A4 の flag 由来ではない」という読みを直接支持し、v1 が示唆した「chained path の静かな壊れ」仮説を実質的に反証する。
A1-A4 は host 側 memset/alloc の除去 (CPU→GPU 実行主体変更) であり、per-iter の絶対削減量は radix scatter の実装 (GPU 側 sort) と独立にほぼ一定のはずである。しかし v1 の絶対削減量は 155.40→147.64s = **-7.76s**、v2 は 127.386→125.972s = **-1.41s** で **5.5 倍の食い違い**がある。v1 の off 側 σ は 2.56% (session 内で最も不安定な arm) だったのに対し v2 の off 側 σ は 0.527% と大幅に改善しており、v1 の -4.99% (閾値 5.11% に肉薄) は off arm 汚染で見かけ上膨らんでいた可能性が高く、A1-A4 の真の効果量は ~1% 前後 = 本 harness (n=5) の分解能未満、という解釈と整合する。この解釈が正しければ、v1 は「惜しくも閾値未達だった有望施策」ではなく「もともと ~1% 程度の施策だった」ことになる — 採否の結論 (棄却) は変わらないが、位置づけの理解としては v2 の方が正確である。
v1 は off 側が不安定 (σ 比 4.66×、off が大きい)、v2 は逆に **on 側が不安定** (n=5 で 1.81×、r1 の両試行を残した n=6 で見ると **5.40×**、いずれも on が大きい)。両 gate を通じて「どちらか一方の arm が異常に安定/不安定」という非対称パターンが繰り返し観測されており、この config family (A1-A4 flag toggle、12.5k Lego、depth2 pipelining) 特有の何らかの host-GPU 相互作用ジッタが疑われるが、本 finding の範囲では特定できていない。次に同系列の gate を組む際は 4 flag を個別に切り分けた計測で σ の出自を追うことを推奨する。
事前登録した条件 (ii) (「自 arm 他値から 3σ 超」単独で再実行トリガー) は、置換後の r6 自身がこれを 10.3σ で踏むという形で**自己言及的な問題**を露呈した。r6 の独立 load sampler は終始 clean (~1.0) であり、条件 (i) の裏付けが無いまま条件 (ii) のみで再実行を続けると、停止条件のない除外連鎖になり得る。**次回以降の gate driver / 判定規則では、条件 (i) (load 証拠) と条件 (ii) (統計的外れ値) の**両方が同時に成立する**ことを再実行の必須条件にする**べきである、という運用上の教訓を残す。今回はこの教訓が判明した時点 (追加の再実行はしない) で列を止め、n=5 の実測値をそのまま確定させて判断を返すという安全側の選択をした。
この finding が観測された / 言及している実験 run。