松田研究室
FindingID: p3-tier1-bit-exact
Status: stable / task 2026-09 第 5 回ゼミ milestones — M2 Tier1 (A1-A4)
← Findings Index
2026-09 第 5 回ゼミ milestones · M2 · Tier1 (bit-exact)

M2 Tier1 (A1-A4 bit-exact) 12.5k gate v1+v2 — 棄却維持 (v1: Δ-5.0%だが2σ未達+PSNR guard抵触 / v2 n=5 radix ballot上: PSNR分離は反証、wallclockは効果量≤1%で判定不能)

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&gt;off 3 / on&lt;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>。

negativerank: mediumrejected-v2-wallclock-inconclusive-psnr-guard-resolved第 1 軸第 3 軸m2tier1ssim-clearraster-grad-clearbackward-uniformlazy-c3-scratchgpu-gatelegorejectedatomic-nondeterminismpsnr-guardv2-regaten5radix-ballot-baselinecontamination-retry
Δ PSNR
v1 (n=3): on **36.140 dB** (36.165/36.097/36.157) vs off **36.205 dB** (36.201/36.195/36.219) = **-0.065 dB**、n=3 全 pair で on < off の完全分離、task 指定 guard (on mean ≥ off mean - 0.05 dB) に **抵触**。config header の絶対 guard (36.202 ± 0.1 dB) では両 arm とも帯内で pass — 2 guard の定義差は本文 §1 参照。final splats は on 407,775 / off 408,721 (-0.23%)。<br><strong>v2 (n=5、r1→r6 置換後)</strong>: on **36.1982 dB** (36.218/36.159/36.196/36.221/36.197) vs off **36.1704 dB** (36.112/36.220/36.102/36.237/36.181) = **+0.0278 dB**、guard に **pass**。5 pair の符号は on&gt;off (r1,r3,r5) / on&lt;off (r2,r4) の**混在**で系統性なし — off 側の散らばり (36.102-36.237) が on 側 (36.159-36.221) より大きく、v1 の系統分離とは対照的。v2 の結果は「PSNR 散らばりは atomic 非決定性の床であり flag 由来ではない」という読みを支持し、v1 の「静かな壊れ」仮説を反証する
Δ Wallclock
v1 (n=3) mean (train elapsed, internal timer): **155.40 → 147.64s = -4.99%**、σ off 2.56% / on 0.55% (比 4.66×)、有意閾値 max(2σ_off,1%) = 5.11%、実測 Δ は**閾値の 97.7%、0.12 pt 差で未達**。<br><strong>v2 (n=5、新 baseline 127.4s 上、r1→r6 置換後)</strong>: off **127.386s** (σ 0.527%) → on **125.972s** (σ 0.956%) = **-1.11%**、有意閾値 max(2σ_off,1%) = 1.054%、実測 Δ は**閾値の 105%、0.06 pt 差で形式上通過**。ただし感度分析 3 通り (汚染 r1 込み生データ Δ-0.30%/不通過、r1→r6 置換後 n=5 Δ-1.11%/通過、両試行を n=6 として残す Δ-0.15%/不通過) のうち<strong>通過するのは 1 通りのみ</strong>で判定が 1 点の去就に依存する。σ 非対称は v1 が off 側 4.66× だったのに対し v2 は on 側 (n=5 で 1.81×、r1 の両試行を含む n=6 で見ると **5.40×**) と<strong>逆転しており、両 gate とも分散構造が clean ではない</strong>。v1 (-7.76s) と v2 (-1.41s) の絶対削減量が 5.5× 食い違う点は、A1-A4 が host 側 memset/alloc 除去 (per-iter 削減量はほぼ一定のはず) である以上、<strong>v1 の -4.99% は off arm の汚染 (σ2.56%) で膨らんでいた可能性が高く、真の効果量は ~1% 前後 = 本 harness の n=5 分解能未満</strong>という解釈と整合する
Impact
M2 Tier1 の 4 flag (A1 SSIM memset 除去 / A2 work_grad blit 化 / A3 backward uniform set_bytes 化 / A4 lazy C3 scratch) を全 ON/全 OFF の 2 arm にまとめ gate した。v1 (n=3, 旧 baseline): train elapsed (internal timer) off 155.40s (σ 2.56%) → on 147.64s (σ 0.55%) = -4.99%、3 pair 全てで on が速い一貫した方向を示したが有意閾値 max(2σoff, 1%) = 5.11% を 0.12 pt 差で下回り不通過。同時に PSNR は on 側で完全分離 (mean Δ -0.065 dB) し task 指定 guard に抵触した。v2 (n=5, 2026-08-30 M4 radix ballot 採用後の新 baseline 127.4s 上で再 gate): PSNR は mean **+0.028 dB**、5 pair 中 on>off 3 / on<off 2 の符号混在で v1 の系統分離は再現せず、「A1/A2 chained path の静かな壊れ」仮説は反証された。wallclock は r1 pair の load 汚染 (on-r1 走行中に load1 が 9.09 まで spike) を検知し 1 回だけ再実行 (r6 で置換、元 log は `*-CONTAMINATED-*` として保存) した後の値で Δ **-1.11%**、有意閾値 1.05% を 0.06 pt 差で形式上通過する。しかし①汚染 r1 を生のまま使うと Δ-0.30% (不通過)、②両方の r1 試行を n=6 として残すと Δ-0.15% (不通過) と1 点の去就で判定が反転する脆い passであり、さらに③置換先の r6 自身が事前登録した再実行条件 (自 arm 他値から3σ超) を独立 load 証拠の裏付けなしに 10.3σ で踏む (条件だけでは停止しない除外連鎖になる設計上の欠陥が判明)。advisor レビューの指摘により、0.06pt の脆い pass を根拠に default flip して M7 最終スタック・卒論数値の土台にするのは不適切と判断し、棄却を維持した (根拠は v1 の「PSNR guard 抵触」から v2 の「wallclock 効果量 ≤1% で本 harness (n=5) の分解能未満、判定不能」に変わった)。両 gate とも `cargo test --workspace` (A1 sentinel probe / A2+A3 4 組合せ parity / A4 self-heal 含む) は全 pass — 実装レベルの correctness bug は一貫して否定的。結論: 棄却維持、4 flag の default は変更しない、config.rs は一切触らない。
01

本文

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 群では初めてのパターン。

0. 計測環境と binary provenance

電源 / 機体
AC 接続 (99% finishing charge 圏で終始安定)、GPU 権は main から付与済み。session 中 `pgrep -f "target/release/splat"` は他 agent の監視 loop 自身の argv 文字列に自己マッチする既知の false positive があり (自分の grep パターンを含む /bin/zsh -c ラッパー越しの誤検知)、実際の training process 二重起動ではなかったことを `ps -ef` / runs ディレクトリの mtime で個別に確認した
1 巡目の破棄
session 開始時に `cargo build --release` した binary (commit 97c1dd0 相当) で off-r1/on-r1/off-r2 まで走らせた時点で、main から「15:45 と 16:20 に main が M3 (`fa773b1`)/M4 (`864040a`) を release binary にマージ済み」と連絡が入った。on-r1 だけ 189.78s と他の on 値 (146-152s 台) から明確に外れており、binary 不整合 (実質的に 1 巡目内で 2 種類の binary が混在するリスク) と合わせて **1 巡目 4 run を全破棄**し、`cargo build --release` を再実行して 6 run を撮り直した
binary 一致性の確認
撮り直し後の binary は git rev `0247b2b` (`864040a` の M3/M4 merge + docs-only commit 1 本)、sha256 `ff46e94ed9b0361dbf8f6a556222067e8b12563dc98df52c1bf47a80ebfd8117`。`git diff 97c1dd0 0247b2b -- config.rs util.rs ssim.rs rasterize.rs tile_bin.rs` で `ssim_clear`/`raster_grad_clear`/`backward_uniform`/`lazy_c3_scratch` に関わる行の差分が無いことを確認し、以後の 6 run は**単一 binary で撮り直した**
他 agent の GPU 使用との重複確認
main から「15:00〜15:40 頃に別 agent の `splat bench` replay (計 6 回) が gate run と重なった可能性」の指摘を受けたが、本 gate の 6 run (14:53:20〜15:10:30、sandbox セッション内部時計) の run 窓と `runs/` 配下の新規ディレクトリを突き合わせ、この窓に自分の `t1-12500-*` 6 件以外の新規 run ディレクトリが生成されていないことを確認した。ただし **run 単位の load average は記録していない** ため、host 側 CPU 競合の有無そのものは事後確認できない (§3 の限界一覧を参照)
process wallclock の量子化
各 run は `nohup … & disown` で detach し、`while pgrep -f "release/splat train"; do sleep 30; done` で完了を待った。この 30s poll 間隔が実測 process wallclock を量子化し (off 3 本とも 182s、on 3 本とも 152s に丸まる)、真の train elapsed 差 (-4.99%) を見かけ上 -16% 相当に誇張する。p2-s3 は同期的 `date` 呼び出しで量子化誤差が無かったため、本 finding では **process wallclock 列を表から除外**し、内部 timer の `training done in X.XXs` (train elapsed) のみを判定に使う (詳細は §3 の限界一覧)
撮り直し 6 run の flag 実測確認
各 log の `[backend] BackendConfig { … }` 行から `ssim_clear`/`raster_grad_clear`/`backward_uniform`/`lazy_c3_scratch` を抽出し、off-r1/r2/r3 が `HostMemset, HostMemset, HostBuffer, false` (3/3)、on-r1/r2/r3 が `ShaderCoverage, GpuBlit, SetBytes, true` (3/3) であることを確認した。binary 差し替え後も意図した arm が正しく走っていることの直接証拠
1 巡目 (破棄分) の log
破棄した 1 巡目の集約 log (`runs-logs/t1-gate-ababab.log`、on-r1 189.78s を含む) は撮り直し後に削除済みで、**現存する artifact は無い**。本 finding 中の 189.78s / 150-166s 台の数値は本 session の transcript のみが出典であり、再検証はできない (p2-s3 は `s3-12500-abbaab-round1-CONTAMINATED-*.log` として破棄分を保存する規律だったが、本 gate ではそれを踏襲できなかった)

1. 実測 — 12.5k 同一 session 交互 A/B n=3

実行順armconfigtrain elapsed (s)PSNR (dB)final splats
1off (A)t1-12500-off-r1150.8236.201409,121
2on (B)t1-12500-on-r1148.1136.165408,516
3off (A)t1-12500-off-r2157.9636.195407,505
4on (B)t1-12500-on-r2146.7036.097405,175
5off (A)t1-12500-off-r3157.4136.219409,537
6on (B)t1-12500-on-r3148.1036.157409,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%
wallclock — 有意閾値に 0.12 pt 差で未達

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 でも**除外していない**。

PSNR — n=3 完全分離、task guard に抵触 (config header の絶対 guard とは食い違う)

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 の結論 (棄却) は変わらない。

2. bit-exact 主張と PSNR 分離の矛盾 — unit test では correctness bug を検出できず

cargo test --workspace は全 pass — A1/A2+A3/A4 の該当 test を個別確認

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 の粒度では裏付けられる。

bit-exact 主張と PSNR 分離の矛盾は未解決 — 仮説止まり

したがって 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」とは言い切れない点が、この仮説だけで済ませてよいか慎重にすべき理由でもある。

3. 既知の限界 (再 gate する場合に埋めるべき穴)

  • 4 flag 一括 gate のため個別寄与が不明 — task 指示により追加 run はしていない。PSNR 分離の原因が A1/A2/A3/A4 のどれか (または相互作用) かを切り分けるには 4 flag を独立に振る追加 gate が必要 (次の一手)
  • run 単位の load average を記録していない — p2-s3 が採用した `s3-gate-abbaab.sh` 相当の quiesce/load 記録を今回は省略した。σ 非対称 (4.66×) が host 側 CPU 競合由来かどうかを事後判定できない
  • process wallclock が 30s poll 量子化で無効 — 個別 run を同期的 `date` 呼び出しで起動する p2-s3 型の driver に戻すべき
  • PSNR guard の定義が 2 箇所で食い違う (task 指定の相対 -0.05dB vs config header の絶対 ±0.1dB) — J2 (visible-only Adam 等、非 bit-exact 施策向け) の -0.05dB 基準を bit-exact 施策にもそのまま適用してよいかは main の判断が必要
  • n=3 は前提通りだが、σ が閾値のごく近傍にある僅差の判定は n を増やす (n=5 以上) ことで解消できる可能性が高い

4. 結論と次の一手

結論 (v1 時点)
**棄却**。`splat/crates/splat-train-v1/src/config.rs` の `BackendConfig::default()` (`ssim_clear` / `raster_grad_clear` / `backward_uniform` / `lazy_c3_scratch`) は変更しない。code は一切触っていない
次の一手 (v1 時点の推奨、v2 で一部実施)
① A1/A2/A3/A4 を個別に ON にした 4 way 追加 gate で PSNR 分離の犯人を特定 (unit test は全 pass 済みなので実装修正ではなく計測)。② 個別 gate は load average 記録付きの `t1-gate-ababab.sh` 型 driver + 同期的 wallclock 計測に戻す。③ PSNR guard の定義 (相対 -0.05dB vs 絶対 ±0.1dB) の適用範囲を main に確認する。**v2 では②相当 (load sampler 付き driver) は実施したが①(4 way 切り分け) は未実施のまま** — wallclock が判定不能水準に落ちたため優先度が下がった、次の一手として引き続き有効

5. 再 gate v2 (n=5、2026-08-30 M4 radix ballot default 採用後の新 baseline 上)

発注理由
v1 gate の 2 つの弱点 — (a) off 側 σ 2.56% が異常に大きく閾値ぎりぎりの未達だった、(b) v1 実施後に M4 (radix scatter simd_ballot) が default 採用され 12.5k baseline が 155.40s→127.53s (-18%) に変わった — を踏まえ、同一 config family (A1-A4 の 4 flag のみ off/on 差替、他は不変) を `t1v2-12500-{off,on}-r{1..5}.toml` として複製し n=5 で新 baseline 上に再 gate した
電源 / 機体 / GPU 権
AC 接続 (`pmset -g batt` で series 通じて `AC Power`)、M4 Max。GPU 権は main から付与済み、`pgrep -fl "[t]arget/release/splat"` で他 agent の GPU run 無しを確認してから起動
ambient load
series 開始時 load1 ≈ 4.2、series 通じて 0.7〜9.1 の範囲で緩やかに低下 (v1/M4 gate が遭遇した 13〜22 の汚染クラスとは異なる、通常範囲)。launch 前に `LOAD_LIMIT=7.0`/`QUIESCE_MAX=30` (5min cap) に調整 (デフォルト `LOAD_LIMIT=6.0` は当日の ambient 5-6 の境界に近く、頻繁な quiesce 待ち超過を招く恐れがあったための調整、判断根拠は `runs-logs/t1v2-12500-predecision.log` に事前記録)
binary provenance
全 12 run (r1 汚染分含む) は単一 binary (commit `457aa68`、sha256 `a13b66977c70aeb04b66f9e60cfc067424c9d4ee2296ff355dd71f44098ac22f`、series 前後で不変を driver ログで確認)。Part 1 の `cargo test --workspace --release` を完全に終えてから `cargo build --release` で確定させ、series 中は build/test を一切実行していない (v1 が binary 差し替えで 1 巡目を全破棄した反省を踏まえた運用)
flag 実測確認 (12/12)
全 12 run の `[backend] BackendConfig { … }` から `radix_scatter=SimdBallot` (12/12、新 baseline の前提が成立していることの直接証拠) と、4 flag が off=`HostMemset,HostMemset,HostBuffer,false` (6/6) / on=`ShaderCoverage,GpuBlit,SetBytes,true` (6/6) であることを抽出確認
判定規則の事前登録 (データを見る前に固定)
採用条件は wallclock (Δ ≤ -max(2σ_off,1%)) と PSNR guard (on mean ≥ off mean - 0.05dB) の **AND**、片方のみ pass では flip せず保留とする。σ は n-1 分母・off mean 比の相対値。汚染疑いでの再実行条件は事前に (i) run 窓内 load1 平均が全体中央値の1.5倍超、または (ii) 個別 run が同 arm 内で他値から 3σ 超、のいずれかと定義し、破棄分は削除せず `*-CONTAMINATED-*` に rename して保存する、と定めた (`runs-logs/t1v2-12500-predecision.log` に全文記録)
driver
`gate-ab-n3.sh` を N 引数化した新規 `splat/scripts/gate-ab-n.sh` (`<off_prefix> <on_prefix> <run_prefix> [N=3]`) で n=5 を実行。r1 pair 再実行分は単発 `splat/scripts/retry-pair-r6.sh` で個別に実施 (quiesce/meta/log/独立 sampler の構造は driver と同型)
実行順armruntrain elapsed (s)PSNR (dB)run 窓内 load1 平均 / 最大備考
1off (A)t1v2-12500-off-r1127.6336.2012.43 / 3.03**CONTAMINATED、破棄** (pair 相方の on-r1 で load spike検知、log保存済み)
2on (B)t1v2-12500-on-r1133.5736.1454.60 / **9.09****CONTAMINATED、破棄** (走行中 load1 spike、事前登録条件(i)(ii)双方該当)
3off (A)t1v2-12500-off-r2126.5636.2202.92 / 3.60採用
4on (B)t1v2-12500-on-r2125.3136.1592.03 / 2.30採用
5off (A)t1v2-12500-off-r3128.2736.1023.13 / 5.38採用
6on (B)t1v2-12500-on-r3125.3836.1962.97 / 3.45採用
7off (A)t1v2-12500-off-r4127.7936.2371.59 / 2.09採用
8on (B)t1v2-12500-on-r4125.2636.2211.19 / 1.65採用
9off (A)t1v2-12500-off-r5126.9736.1810.82 / 1.22採用
10on (B)t1v2-12500-on-r5125.8236.1970.85 / 1.22採用
11 (retry)off (A)t1v2-12500-off-r6127.3436.1121.08 / 1.39r1 の代替として採用、独立 sampler 終始 clean
12 (retry)on (B)t1v2-12500-on-r6128.0936.2181.00 / 1.08r1 の代替として採用。ただし**この値自体が事前登録条件(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**——
wallclock — 0.06pt の形式上の pass だが、感度分析で脆さが露呈

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」として採用の根拠にしない。

PSNR guard — v1 の系統分離は再現せず、「静かな壊れ」仮説は反証

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 の静かな壊れ」仮説を実質的に反証する。

算術整合性チェック — v1 の Δ-4.99% は off arm 汚染で膨らんでいた可能性

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/v2 とも session 内 σ が clean でない (限界として明記)

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 を個別に切り分けた計測で σ の出自を追うことを推奨する。

教訓 — 再実行条件は load 証拠との一致を必須にすべきだった

事前登録した条件 (ii) (「自 arm 他値から 3σ 超」単独で再実行トリガー) は、置換後の r6 自身がこれを 10.3σ で踏むという形で**自己言及的な問題**を露呈した。r6 の独立 load sampler は終始 clean (~1.0) であり、条件 (i) の裏付けが無いまま条件 (ii) のみで再実行を続けると、停止条件のない除外連鎖になり得る。**次回以降の gate driver / 判定規則では、条件 (i) (load 証拠) と条件 (ii) (統計的外れ値) の**両方が同時に成立する**ことを再実行の必須条件にする**べきである、という運用上の教訓を残す。今回はこの教訓が判明した時点 (追加の再実行はしない) で列を止め、n=5 の実測値をそのまま確定させて判断を返すという安全側の選択をした。

6. v2 結論 — 棄却維持 (理由変更)、次の一手

結論
**棄却維持**。`splat/crates/splat-train-v1/src/config.rs` の `BackendConfig::default()` (`ssim_clear` / `raster_grad_clear` / `backward_uniform` / `lazy_c3_scratch`) は**変更しない**。`.rs` は一切触っていない。根拠は v1 の「PSNR guard 抵触」から v2 の「wallclock 効果量 ≤1% で本 harness (n=5) の分解能未満、判定不能 (0.06pt の pass は 1 点の去就に依存する脆いもの)」に変わった。PSNR 側の懸念 (v1 の系統分離、静かな壊れ疑い) は v2 で解消・反証された
test 確認
`cargo test -p splat-train-v1 --release --lib refine::tests` (16 件)、`pipelining_depth2_matches_off_across_refine_ticks_with_a7_direct_write` (1件)、`cargo test --workspace --release` (全 crate 188 unit test + doctest、0 failure) をいずれも series 前に確認済み (Part 1)。series 実行中に build/test は一切行っていない
規約 2 への申し送り (main 判断待ち)
`splat-metal/src/kernels/ssim.rs:33` 付近の `SsimClearKind::ShaderCoverage`、`rasterize.rs:125,144` 付近の `RasterGradClearKind::GpuBlit` / `BackwardUniformKind::SetBytes` の mirror enum doc がいずれも旧文言「gate 待ち、finding: p3-tier1-bit-exact (予定)」のまま残っている。棄却が確定した以上、規約 2 (「verdict が変わったら enum doc を同じ commit で更新」) に照らすと、この 3 enum の doc verdict を「棄却 (v1+v2 gate 実施済み、wallclock 効果量が harness 分解能未満で判定不能、PSNR guard 自体は解消)」に doc-only で追随させる必要がある。本 finding は `.rs` を変更しない指示のため未実施 — **main の判断で doc-only commit として別途処理してほしい**
次の一手
① 効果量が ~1% と判明した以上、A1-A4 を M7 最終スタック measurement に同梱評価する (単独 gate ではなく累積 ablation の 1 段として)、② より高い分解能が必要なら n=10 以上での再 gate、③ 4 flag 個別切り分けで v1/v2 に共通する σ 非対称の出自を追う、のいずれかを main に判断してもらう
02

関連する run

この finding が観測された / 言及している実験 run。

03

関連 finding

© 2026 大竹律輝 — 松田研究室