[{"data":1,"prerenderedAt":375},["ShallowReactive",2],{"finding:p3-brush-sameday-lego-30k":3,"finding-runs:p3-brush-sameday-lego-30k":235,"finding-related:p3-brush-sameday-lego-30k":236},{"meta":4,"impact":40,"sections":47},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":16,"task_code":25,"commit":26,"branch":27,"config_paths":28,"related_runs":30,"related_findings":33},"p3-brush-sameday-lego-30k","brush 同日比較 Lego 30k — 本実装 392s vs brush 417s (0.94×)、PSNR は評価器次第で ±1.9 dB 反転","5 月の binary をそのまま使った brush (wgpu→Metal) と本実装の現行最終スタックを、2026-09-23 に同じ M4 Max で直列に 1 本ずつ Lego 30k 学習。wallclock は本実装が brush の 0.912× (process) \u002F 0.941× (trainer 内部値)。PSNR は、brush PLY と本実装 PLY を互いの評価器にかけると、どちらの評価器でもその renderer で学習した側が約 1.8〜1.9 dB 有利 (brush 評価器: brush 37.41 \u002F 本実装 35.58、splat eval q8: brush 34.57 \u002F 本実装 36.47)。「同じ評価器で測った 1 つの PSNR」では優劣を決められない。","2026-09 第 5 回ゼミ · brush 同日比較 · Lego 30k","2026-09-23","stable","experiment","mixed",[14,15],1,2,[17,18,19,20,21,22,23,24],"brush","same-day","lego-30k","wgpu","final-stack","cross-eval","renderer-coupling","seminar05","seminar05 brush 同日比較","e7fc835d45a0c3d9ac977673ed2cf43e7164843a","main",[29],"splat\u002Fconfigs\u002F2026-09-23-brush-sameday-lego-30k.toml",[31,32],"2026-09-23-brush-sameday-lego-30k","brush lego-30k (2026-09-23、\u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fbrush-sameday-20260923\u002Flego-30k\u002F)",[34,35,36,37,38,39],"m4-brush-bench","p3-final-stack-v2","p1-a-1-brush-eval-audit","p1-a-3-cross-eval-reproducer","p1-d-stage2-30k-results","p2-msplat-parity-lego",{"summary":41,"rank":42,"verdict":43,"delta_wallclock":44,"delta_psnr":45,"delta_splats":46},"同日・同機・直列・load 記録付きで Lego 30k を brush \u002F 本実装 1 本ずつ実行。学習時間は本実装 392.39s vs brush 417s (trainer 内部値、0.941×)、process wallclock では 395.07s vs 433.23s (0.912×)。PSNR は評価器依存が大きい: brush PLY を brush 評価器で測ると 37.41 dB、splat eval q8 で測ると 34.57 dB (-2.84 dB)。本実装 PLY は splat eval q8 で 36.47 dB、brush 評価器で 35.58 dB (-0.88 dB)。同じ評価器の中で比べると、splat eval では本実装 +1.90 dB、brush 評価器では本実装 -1.82 dB。どちらの評価器を『公式』にするかで優劣が入れ替わる。splats は brush 284,151 \u002F 本実装 485,825 (1.71×)。","high","same-day-speed-parity-plus-psnr-is-renderer-coupled","本実装 \u002F brush = 0.941× (trainer 内部 392.39s \u002F 417s) \u002F 0.912× (process 395.07s \u002F 433.23s)","splat eval q8: 本実装 +1.895 dB (36.465 vs 34.570)。brush 評価器: 本実装 -1.824 dB (35.582 vs 37.406)。各実装の自己評価: 本実装 -0.996 dB (36.418 vs 37.414)","485,825 vs 284,151 (1.71×)",[48,51,54,78,80,84,86,133,135,141,143,166,171,173,203,208,210,217,219],{"type":49,"text":50},"lead","5 月の brush 記録 (\u003Ccode>m4-brush-bench\u003C\u002Fcode>: 9m08s \u002F 37.40 dB) は load 記録がなく、日付も違ったので、\u003Cstrong>2026-09-23 に同じ M4 Max で brush と本実装を直列に 1 本ずつ\u003C\u002Fstrong> Lego 30k 学習させた。brush は 5 月と同じ binary と同じ引数。本実装は \u003Ccode>2026-08-31-final-lego-30k.toml\u003C\u002Fcode> を run 名・run_dir・日付だけ変えて複製した config。学習時間は本実装が brush の \u003Cstrong>0.94× (trainer 内部値) \u002F 0.91× (process)\u003C\u002Fstrong>。PSNR は \u003Cstrong>どちらの renderer で評価するかで本実装 +1.90 dB 〜 -1.82 dB と符号が反転\u003C\u002Fstrong>した。",{"type":52,"text":53},"heading","0. 計測環境",{"type":55,"items":56},"kv",[57,60,63,66,69,72,75],{"key":58,"value":59},"機体 \u002F 電源","M4 Max 36GB。`pmset -g batt` は driver 開始前・各 run 前後とも `AC Power` (作業開始時はバッテリー駆動だったが、smoke 前に AC 接続を確認)",{"key":61,"value":62},"GPU 専有","`pgrep -fl \"splat|brush|msplat\"` 空を確認してから開始。本 driver 以外の GPU run なし。Docker の Virtualization VM が常駐しているが CPU 0.5% 程度で idle",{"key":64,"value":65},"disk","`df -h \u002F` 空き 16GiB (開始時) → 15GiB (終了時)",{"key":67,"value":68},"本実装 binary","`splat\u002Ftarget\u002Frelease\u002Fsplat` sha256 `c804b349223ffc68e9e1101d79c5ea9f058dfa8d34620504b66aa0a3eb10aa13` (p3-final-stack-v2 と同一)。`cargo build --release -p splat-cli` は no-op (0.37s)。git rev e7fc835 (1565fcc 以降 splat\u002Fcrates・shaders に変更なし)。`[backend] BackendConfig` ログで radix_scatter=SimdBallot 等の default を確認",{"key":70,"value":71},"brush binary","`~\u002Fdev\u002Fbrush\u002Ftarget\u002Frelease\u002Fbrush` sha256 `c460b12aac29a8308bb9d0af7e2628e33da45c0320e2adda9d5be0b80e0c1616`、HEAD ce6ef3f、working tree clean、mtime 2026-05-23 01:43 (5 月 bench の 2 分前 = 5 月と同じ binary)。**再 build していない** (rustc 更新などで 5 月との比較条件が変わるのを避けるため)",{"key":73,"value":74},"driver","`splat\u002Fscripts\u002Fbrush-sameday-lego-30k.sh` (新規、gate-ab-n3.sh の流儀: AC 確認 → load1\u003C6.0 が 60s 続くまで quiesce → meta pre\u002Fpost → 10s load sampler (epoch load1 top3) → sentinel .DONE)。`nohup … \u003C \u002Fdev\u002Fnull & disown` で detach し、foreground の until loop で sentinel\u002Fmeta を polling",{"key":76,"value":77},"load (開始時)","`uptime` 2.79 2.64 2.42 (22:14)",{"type":52,"text":79},"1. 手順",{"type":81,"lang":82,"text":83},"code","bash","# (a) brush smoke (500 \u002F 3000 iter): eval 出力・PLY header・splat eval での読込を事前確認\n#     500 iter: brush 13.758 \u002F splat eval q8 13.747 \u002F raw 13.740 (差 0.01 dB)\n#     3000 iter: brush 27.070 \u002F splat eval q8 26.821 \u002F raw 26.655 (差 -0.25 dB、学習が進むほど開く — §4)\n# (b) 本番 (直列、driver 1 本)\nnohup sh splat\u002Fscripts\u002Fbrush-sameday-lego-30k.sh 2026-09-23-brush-sameday \\\n  > splat\u002Fruns-logs\u002F2026-09-23-brush-sameday-driver.log 2>&1 \u003C \u002Fdev\u002Fnull & disown\n#   ARM brush: 5 月 (m4-brush-bench.md) と同じ引数。export-path だけ \u002Ftmp から変更\nRUST_LOG=info ~\u002Fdev\u002Fbrush\u002Ftarget\u002Frelease\u002Fbrush \u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fdatasets\u002Fnerf_synthetic\u002Flego \\\n  --total-train-iters 30000 --eval-every 5000 --export-every 30000 --max-resolution 800 \\\n  --export-path \u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fbrush-sameday-20260923\u002Flego-30k\u002F --export-name 'export_{iter}.ply'\n#   ARM splat:\ntarget\u002Frelease\u002Fsplat train --config configs\u002F2026-09-23-brush-sameday-lego-30k.toml\n\n# (c) splat eval (本実装側の評価器、q8 が公式値) を両 PLY に\nDS=\u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fdatasets\u002Fnerf_synthetic\u002Flego\nfor P in \u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fbrush-sameday-20260923\u002Flego-30k\u002Fexport_30000.ply \\\n         runs\u002F2026-09-23-brush-sameday-lego-30k\u002Ffinal.ply; do\n  .\u002Ftarget\u002Frelease\u002Fsplat eval --ply $P --dataset $DS --split val --convention brush --quantize-8bit\n  .\u002Ftarget\u002Frelease\u002Fsplat eval --ply $P --dataset $DS --split val --convention brush\ndone   # → splat\u002Fruns-logs\u002F2026-09-23-brush-sameday-eval.log\n\n# (d) brush 評価器 (brush-train\u002Fsrc\u002Feval.rs) を両 PLY に: dataset を symlink で複製し、\n#     init.ply に評価したい PLY を置いて start-iter=29999 \u002F total=30000 で起動 (log は Took 0ns、最大 1 step の更新の後に eval 1 回)\n#     brush 自身の PLY で 37.406 dB (学習中の値 37.414 と差 0.008 dB) を確認し、この方法が使えることを確かめた\nW=\u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fbrush-sameday-20260923\nRUST_LOG=info ~\u002Fdev\u002Fbrush\u002Ftarget\u002Frelease\u002Fbrush $W\u002Fxeval-{brushply,splatply}\u002Flego \\\n  --start-iter 29999 --total-train-iters 30000 --eval-every 30000 --export-every 1000000 \\\n  --max-resolution 800 --export-path $W\u002Fxeval-*\u002Fout\u002F\n",{"type":52,"text":85},"2. 結果 (Lego 30k、n=1 ずつ、2026-09-23 同日・同機・直列)",{"type":87,"columns":88,"align":98,"rows":101,"caption":132},"table",[89,90,91,92,93,94,95,96,97],"実装","学習時間 (trainer 内部)","process wallclock","自己評価 PSNR","splat eval q8 (本実装評価器)","splat eval raw","brush 評価器","final splats","run 中 load1 (10s sampler)",[99,100,100,100,100,100,100,100,99],"left","right",[102,112,122],[103,104,105,106,107,108,109,110,111],"brush (wgpu→Metal, ce6ef3f)","417s (`Took FormattedDuration(417s)`、6 回の eval を含む)","433.23s","37.414 (brush 内蔵 eval、val 100 views、q8)","34.570","32.163","37.406 (§1(d) の再評価)","284,151","0.88–2.20 (mean 1.52、n=43)",[113,114,115,116,117,118,119,120,121],"本実装 (最終スタック)","392.39s (`training done in`)","395.07s","36.418 (trainer 内蔵 `mean val`、premultiplied)","**36.465**","36.418","35.582","485,825","1.79–2.88 (mean 2.19、n=39)",[123,124,125,126,127,128,129,130,131],"本実装 \u002F brush、差分","**0.941×**","**0.912×**","-0.996 dB (raw 36.418 基準。本実装の q8 36.465 で揃えると -0.949 dB)","**+1.895 dB**","+4.255 dB","**-1.824 dB**","1.71×","—","val split 100 views (brush は `transforms_val.json` を優先して読み、log に `100 eval views` と出る。本実装も `--split val`)。brush の『Took』は整数秒で丸められており、学習中の eval 6 回 (1 回あたり約 1s) を含む。本実装の `training done in` には最終 val eval を含まない。比の分子と分母で含むものが違うので、両方の比を載せた。自己評価列は brush が q8 (clamp なし)、本実装が trainer 内蔵の raw。process wallclock は driver の meta (`date +%s.%N` の pre\u002Fpost 差) で、brush は起動・autotune cache 読込・PLY export も含む。",{"type":52,"text":134},"3. 学習時間比の読み方",{"type":136,"items":137},"list",[138,139,140],"trainer 内部値の比 \u003Cstrong>0.941×\u003C\u002Fstrong>、process wallclock の比 \u003Cstrong>0.912×\u003C\u002Fstrong>。どちらで見ても本実装が 6〜9% 速い。n=1 ずつなので、この差は run 間ばらつき (p3-final-stack-v2 の 12.5k n=3 で σ1.7%、30k n=2 で r1\u002Fr2 差 16.8%) と同じくらいの大きさ。\u003Cstrong>『同等〜わずかに速い』までは言えるが、『速い』とは断定できない\u003C\u002Fstrong>","本実装 392.39s は p3-final-stack-v2 §10 の r1 (413.56s) より 5.1% 速い。1000-iter 区間ごとに比べると 0–12k と 24k–30k は ±2% で一致し、差は 12k–24k の区間に集中している (8\u002F31 r1 の方が 6〜19% 遅い)。8\u002F31 r1 のこの区間には load 汚染があったと推定される。PSNR (self 36.418 vs 36.457、q8 36.465 vs 36.501) と splats (485,825 vs 490,866) は a-10 の σ±0.32 dB 以内で一致","splat 数は本実装が brush の 1.71× なので、splat あたりの throughput に直すと本実装側がさらに有利になる。ただし avg splats (台形積分) は brush 側で出していないので、throughput 比は算出していない",{"type":52,"text":142},"4. PSNR: 評価器と学習元の組み合わせで決まる (renderer coupling)",{"type":87,"columns":144,"align":149,"rows":150,"caption":165},[145,146,147,148],"評価器 \\ PLY","brush PLY","本実装 PLY","差 (本実装 - brush)",[99,100,100,100],[151,155,158,161],[152,153,119,154],"brush 評価器 (brush-train eval.rs、bg=0、q8)","**37.406**","-1.824",[156,107,117,157],"splat eval --convention brush --quantize-8bit","+1.895",[159,108,118,160],"splat eval --convention brush (raw)","+4.255",[162,163,164,131],"その評価器で学習した側から見た、他方の評価器にかけたときの低下","-2.836 (brush→splat q8)","-0.883 (splat q8→brush)","両評価器とも GT は premultiplied、bg=0、8-bit roundtrip、val 100 views。違いは (a) renderer 本体 (brush: cubecl\u002Fwgpu kernel、本実装: Metal kernel) と (b) \u003Cstrong>clamp の有無\u003C\u002Fstrong> — splat eval の q8 は \u003Ccode>r.clamp(0,1)\u003C\u002Fcode> してから丸める (\u003Ccode>splat-cli\u002Fsrc\u002Fcmd\u002Feval.rs:250\u003C\u002Fcode>) のに対し、brush の eval.rs は clamp せずに \u003Ccode>(x*255).round()\u002F255\u003C\u002Fcode> する (brush の render 出力の内部で clamp されているかは未確認)。本実装 PLY の brush 評価器 35.58 dB には、clamp しないことで overshoot 分が罰される効果が一部含まれている可能性がある。どちらの評価器でも、その renderer で学習した PLY が約 1.8〜1.9 dB 有利になる。brush PLY を splat eval にかけると raw と q8 の差が 2.4 dB ある (本実装 PLY では 0.05 dB) ことから、本実装 renderer で brush PLY を描くと [0,1] 外に大きく overshoot する画素が多いとわかる。smoke では差が 500 iter 0.01 dB → 3000 iter 0.25 dB → 30k 2.84 dB と学習が進むほど開いた。原因は renderer の差 (小さい \u002F 高 SH 次数の splat の扱いなど) と clamp の有無の組み合わせと考えられる。cov2d blur は両者 0.3 で一致していることを確認済み。原因の特定は本 task の範囲外で、コードは変更していない。",{"type":167,"label":168,"variant":169,"text":170},"callout","『同じ評価器で測れば公平』は成り立たない","warn","依頼時の方針は『本実装の splat eval q8 を brush PLY にも適用すれば同一評価器比較になる』だった。しかし実測すると、評価器を brush 側に替えれば優劣が逆転する (本実装 +1.90 dB ↔ -1.82 dB)。p1-a-3 の convention coupling (学習と評価の convention が結びつく) と同じ形で、今回は \u003Cstrong>renderer の実装差 (と eval 時の clamp の扱い)\u003C\u002Fstrong> も学習と評価で結びつくことがわかった。過去 finding の『brush 自身 val 32.038 (q8: 34.484)』(p1-d-stage2 ほか) も、brush PLY を splat eval で測った値だと推定される (今回 32.163 \u002F 34.570 とほぼ一致)。\u003Cstrong>『本実装が brush を val で +x dB 上回った』という既存の主張は、本実装の評価器に有利な測り方である\u003C\u002Fstrong>ことに注意が必要。ゼミ資料では 2×2 表 (§4) をそのまま出すか、各実装の自己評価 (brush 37.41 \u002F 本実装 36.42、-1.0 dB) を併記するのが誠実。",{"type":52,"text":172},"5. 5 月の brush 値との差",{"type":87,"columns":174,"align":181,"rows":182,"caption":202},[175,176,177,178,179,180],"記録","brush build","wallclock","PSNR","splats","load 記録",[99,99,100,100,100,99],[183,189,195],[184,185,186,187,131,188],"2026-04-24 (brush-eval.md 試行 3)","v0.3.0 (3dgs-workspace\u002Fbrush、別 checkout)","384s (6m24s)","37.38","なし",[190,191,192,193,194,188],"2026-05-23 (m4-brush-bench)","ce6ef3f、本日と同一 binary","548s (9m08s)","37.397","284,323 (toml 側は 282,103 と記載、md と不一致)",[196,197,198,199,200,201],"**2026-09-23 (本 finding)**","ce6ef3f、同一 binary (sha256 c460b12a…)","**433.23s** (process) \u002F 417s (Took)","**37.414**","**284,151**","あり (0.88–2.20)","5 月→今日で wallclock -21% (548→433s)。PSNR (+0.017 dB) と splats (-0.06%) はほぼ同じなので、学習の軌跡は同じで throughput だけが違う。5 月の 548s が process wallclock か brush の Took 値かも記録されていない。",{"type":136,"items":204},[205,206,207],"\u003Cstrong>binary は同じ\u003C\u002Fstrong>: sha256 と mtime から 5 月と同じ binary と確認した。コード差はない","考えられる要因 (いずれも検証していない): (1) 5 月の run 中の同時実行 load \u002F 熱状態 \u002F 電源状態 — load 記録がなく判定できない。5 月の session は複数 job を並行することが多かった。(2) macOS 25.3→25.6 での Metal driver \u002F コンパイラ更新。(3) cubecl autotune cache の状態差 — ただし 5 月も m4-brush-bench.md の手順 3 で 1k smoke を先に走らせているので cache は温まっていたはずで、有力な説明ではない","4 月の 384s (別 checkout の v0.3.0) と 5 月の 548s も 43% 違っており、brush の wallclock は条件記録なしでは ±20〜40% 振れる。\u003Cstrong>5 月値は条件管理の弱い参考値とし、今日の load 記録付きの値 (433s \u002F 417s) を比較の基準にする\u003C\u002Fstrong>のが妥当",{"type":52,"text":209},"6. 汚染・信頼度",{"type":136,"items":211},[212,213,214,215,216],"brush window (22:15:10–22:22:23): load1 0.88–2.20、pre 2.23 \u002F post 1.80。途中に Spotlight.app (UI、17%CPU) と日本語 IME が一時的に top3 に出た (ユーザーの操作)。mds_stores の重い indexing は検出されなかった","本実装 window (22:23:13–22:29:48): load1 1.79–2.88、pre 2.59 \u002F post 2.97。\u003Cstrong>終盤約 65s (≈iter 25k 以降) で XProtectRemediator* (macOS のマルウェアスキャン、1 本あたり約 90%CPU、trustd 併走) が動いた\u003C\u002Fstrong>。1000-iter 区間の ms\u002Fiter は 27k–30k で 8\u002F31 r1 と -0.8〜-1.5% 一致しており、目に見える遅延はなかった (CPU 側の処理で GPU-bound の学習とは競合が小さい)。ただし最大 1% 程度の影響は否定できない","両 run とも quiesce gate (load1\u003C6.0 が 60s) を通過。load の最大は 2.88 で、過去の汚染事例 (load 5.77〜24) より十分低い","PSNR \u002F splats は load に依存しない量で、再評価 (§1(d)) でも brush 37.406 と学習中の値 37.414 が 0.008 dB で一致した。wallclock は n=1 ずつで σ が出せない。\u003Cstrong>比 0.91〜0.94× は『同等〜わずかに速い』と読む\u003C\u002Fstrong>","brush 学習開始前に smoke を 2 本 (500 \u002F 3000 iter、計 20s ほど) 走らせたため、brush の autotune cache は温まった状態で本番を始めている。本実装側に同様の cache はない",{"type":52,"text":218},"7. 成果物",{"type":55,"items":220},[221,224,226,229,232],{"key":222,"value":223},"config","`splat\u002Fconfigs\u002F2026-09-23-brush-sameday-lego-30k.toml` (2026-08-31-final-lego-30k.toml から name \u002F description \u002F run_dir \u002F created とヘッダ comment だけ変更。`splat check` ok)",{"key":73,"value":225},"`splat\u002Fscripts\u002Fbrush-sameday-lego-30k.sh`",{"key":227,"value":228},"logs","`splat\u002Fruns-logs\u002F2026-09-23-brush-sameday-{driver,brush,splat,eval}.log`、`-{brush,splat}.meta`、`-loadsamples.log`、`.DONE`",{"key":230,"value":231},"本実装 run","`splat\u002Fruns\u002F2026-09-23-brush-sameday-lego-30k\u002F{final.ply,result.toml,config.toml}`",{"key":233,"value":234},"brush 成果物 (repo 外)","`\u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fbrush-sameday-20260923\u002F` — `lego-30k\u002Fexport_30000.ply`、`smoke\u002F` (500\u002F3000 iter)、`xeval-{brushply,splatply}\u002F` (brush 評価器による再評価の symlink dataset と log)",[],[237,272,296,322,343,360],{"id":35,"title":238,"date":239,"status":10,"polarity":240,"category":11,"axes":241,"tags":243,"task_code":256,"related_runs":257,"delta_psnr":267,"delta_wallclock":268,"rank":42,"verdict":269,"impact_summary":270,"detail_path":271},"M7 v2 — 最終スタック独立再計測 (post S4b) は session 汚染で +6.4%、paired control 122.77s を維持。多 scene (ficus\u002Fmaterials\u002Fdrums) で退行なし確認","2026-08-31","neutral",[14,242],3,[244,245,246,21,247,248,249,250,251,252,253,254,255],"m7","m7v2","seminar05-milestones","msplat-parity","pareto-v3b","multi-scene","regression-check","measurement-methodology","session-contamination","ficus","materials","drums","2026-09-seminar05-milestones M7 v2 (最終スタック独立再計測の再実施 + 多 scene 退行チェック)",[258,259,260,261,262,263,264,265,266],"finalv2-12500-r1","finalv2-12500-r2","finalv2-12500-r3","multiscene-ficus-30k","multiscene-materials-30k","multiscene-drums-30k","multiscene-ficus-30k-q","multiscene-materials-30k-q","multiscene-ficus-30k-q2","Part1: finalv2 self-eval n=3 mean **36.257dB** (σ0.10%)、brush cross-eval q8 n=3 mean **36.289dB** (σ0.11%、M7比+0.04dB)。Part2 (§6、load汚染下 n=1): ficus -0.020dB \u002F materials -0.027dB \u002F drums -0.010dB (いずれも a-10 σ±0.32dB の1\u002F10以下、退行なし)。PSNR は load非依存の量なので §14 の静穏再実行でも §6 の値 (ficus 34.261dB \u002F materials 29.998dB) から変更しない。§14 の追加観測: materials は baseline\u002F§6\u002F静穏の3 runでPSNR range **0.028dB** (安定)。ficus は §6\u002Fq1\u002Fq2 の3 runで range **1.443dB** (34.261\u002F32.836\u002F34.279、a-10 のLego range 0.885dBの1.6倍) — config\u002FRNG起因は排除済み、a-10のGPU非決定性の一事例と推測されるが、実用上の帰結は「a-10のσ±0.32dBをficusの退行判定に転用できない」というgate閾値の限界","Part1: as-measured 12.5k n=3 mean **130.657s** (σ1.727%、session汚染のためmilestones非採用)。paired control (S4b on-arm 122.768s \u002F rnd off-arm 122.6467s、相互0.13%一致) を現在値として維持。msplat等価gap **0.745×** (旧0.755×)、throughput **0.916×** (旧0.926×)。Part2 (§6、load汚染下): drums (load概ねクリーン) 3936s→687.85s=**5.72×**。ficus\u002Fmaterials は load汚染下で方向感のみ (≥3.7×\u002F≥4.4×)。§14 静穏再実行 (in-runサンプラーで確認): ficus 349.63s→**254-256s** (-27.3%〜-26.7%、q1\u002Fq2で再現)、materials 421.90s→**319.54s** (-24.3%)","measurement-methodology-finding-controls-retained-multiscene-no-regression","2026-09-seminar05-milestones M7 のフォローアップを実施した。**Part 1 (12.5k n=3 再計測)**: `2026-08-30-finalv2-12500-r{1,2,3}.toml` (final-12500-r{1,2,3}.toml の複製、backend flag 無指定で S4b flip 後の default = ssim_reduce=Gpu を含む全採用施策込み) を実行。各 run の `[backend] BackendConfig {...}` ログ行で `ssim_reduce: Gpu, radix_scatter: SimdBallot, refine_scratch_persist: true, refine_direct_write: true` を確認、AC 電源・pgrep 空・binary sha256\u002Fgit rev 不変 (`c804b349...`\u002F`9bb4ea5`) を series 前後で確認。**as-measured mean は 130.657s (σ1.727%)** — S4b flip で速くなるはずが M7 (124.39s) より遅いという逆方向の結果になった。追加調査で、(1) 10s 間隔 load sampler が r1 window 内で 5.77 まで load1 上昇 (iter6000-7000 相当のタイミング)、r2 window 内でも 4.22 まで上昇、(2) old M7 (r2-r4) と new (r1-r3) の 1000-iter segment ごとの ms\u002Fiter を突き合わせると iter0-3000 は new が -4〜-9% 速い (S4b の効果と整合) のに iter3000-12500 は new が一貫して +1.8〜+12.0% 遅い、(3) 実行後の `ps aux` で Finder (147%CPU)・別プロジェクト (otksynth) の Rust バイナリ・音声処理プロセスの実存を確認、という 3 系統の証拠が「同時実行された無関係なユーザープロセスによる session 汚染」を裏づけた。既存の汚染判定規約 (`p3-tier1-bit-exact.toml` §5「load 証拠 AND 自 arm 内 3σ 超」) はこの事例 (3 run 全体が相関して底上げされ、単一の outlier が無い) を検出できない構造的な穴であることも判明した (§2 に規約拡張案を記載)。**同日の paired control 2 本 (S4b gate on-arm 122.768s、`p3-refine-nondrain` off-arm 122.6467s — 後者は refine_gpu_snapshot という no-op field 追加のみの差で本 session の HEAD と事実上同一コード) が相互に 0.13% で一致**しており、この 2 点を「現在の真値」の推定として採用し、milestones.md の「現在地」は上書きしない。brush cross-eval q8 PSNR (final.ply への `splat eval` 実行、load 非依存) は 3 run 平均 **36.289dB** (M7 の 36.249dB から +0.04dB、ノイズ帯)。avg splats (trapezoid 積分による自前算出) は 321,011 (M7 の 321,637 と 0.2% 差で一致、算出法の再現性を裏づけ)。msplat 等価 gap は control 値 (122.768s) ベースで **0.745×** (旧 0.755×)、throughput は **0.916×** (旧 0.926×) とわずかに改善。Pareto v3b (`docs\u002Ffigures\u002Fpareto-v3b-msplat-lego-final-stack-v2.png`) は 12.5k 点の x 座標を control 値、y 座標を finalv2 の brush cross-eval 実測に更新 (両者は異なる run 由来なので script docstring に明記)。**Part 2 (多 scene breakage screen)**: 2026-08-30 に採用された M4 (radix simd_ballot)・A7 (refine 3-pass 削減)・S4b (ssim_reduce=gpu) の 3 施策は全て Lego 12.5k gate のみを根拠にしており、他 scene での検証が無かった。`p1-axis1-phase-g-pareto-landscape.toml` §2 (G.3-alone 30k recipe、2026-05-25、[trainer]\u002F[refine]\u002F[adam] 節が現行 config と完全一致することを diff で確認済み) を baseline に、ficus (227k splats)・materials (355k splats)・drums (998k splats、Lego 407k の 2.5 倍で 3 施策が splat 数 non-uniform に依存する経路を初めてテストする scene) の 3 scene を n=1 で再計測した。**ΔPSNR は ficus -0.020dB \u002F materials -0.027dB \u002F drums -0.010dB で、いずれも `a-10-variance-baseline` の σ±0.32dB (Lego 30k での run-to-run noise floor) の 1\u002F10 以下** — 3 scene とも退行なし。M4\u002FA7\u002FS4b はいずれも理論上 PSNR に影響しない施策 (M4: sort parity bit-exact、A7: 書き込みロジック不変、S4b: gradient 非変更) のため、この結果は「今回の 3 施策の改善効果」ではなく「壊れていないことの確認」として設計通り。Δsplats も ficus +0.32% \u002F materials +1.50% \u002F drums -0.31% と小さい。wallclock は ficus (load 9.6-32.6 で終始汚染)・materials (load 7-27 で終始汚染) は方向感のみ (旧比 ≥3.7×\u002F≥4.4× 高速化) だが、**drums は iter 27000 まで load 0.8-5.5 とほぼクリーンで 3936s→687.85s = 5.72× 高速化を実測**、Lego の 2.5 倍規模の scene でも大幅改善が維持されることを確認した。","\u002Ffindings\u002Fp3-final-stack-v2\u002F",{"id":39,"title":273,"date":274,"status":10,"polarity":12,"category":11,"axes":275,"tags":276,"task_code":287,"related_runs":288,"delta_psnr":291,"delta_wallclock":292,"rank":42,"verdict":293,"impact_summary":294,"detail_path":295},"P2 msplat parity — 同日等価比較で msplat 30K = 167.7s \u002F 36.5 dB、gap は 12.5k で 2.10× (matched-wallclock 7.5k は 1.08× で brush +0.94 dB)","2026-08-16",[14,15],[277,278,279,280,281,22,282,283,284,285,286],"gap-sweep","phase-3","msplat","parity","baseline","eval-convention","thermal-interleave","lego","m4-max","thesis-ready","2026-08 msplat gap sweep Phase 3 (parity 再計測)",[289,290],"lego-parity-noprof-12500","lego-parity-noprof-7500","brush convention (同一 evaluator): 本実装 12.5k +1.79 dB \u002F 7.5k +0.94 dB (vs msplat 30K q8 34.47)。white-bg convention: msplat +1.09 dB (36.28 vs 本実装 12.5k 35.19)","msplat 30K 167.7s vs 本実装 12.5k 352.3s = **2.10×** (両者 profile なし・同日実測)。matched-wallclock: 7.5k 181.4s = 1.08×。従来の 1.53× (spike 値 220s 基準) は撤回","parity-established-gap-2.10x-convention-coupled-psnr","gap sweep の公式 gap 数値を \u003Cstrong>同日・同一条件の実測で確定\u003C\u002Fstrong>: Lego 12.5k vs msplat 30K の wallclock gap は \u003Cstrong>2.10×\u003C\u002Fstrong> (352.3s vs 167.7s、両者 profiling なし) — Phase 2 の 1.53× は spike の古い msplat 値 (219.8s) 起因の過小評価だった。一方 \u003Cstrong>matched-wallclock 断面 (本実装 7.5k = 181.4s、msplat の 1.08×)\u003C\u002Fstrong> では brush convention の同一 evaluator cross-eval で本実装が \u003Cstrong>+0.94 dB\u003C\u002Fstrong> (35.41 vs 34.47)。PSNR 比較は eval convention に強く依存し (white-bg では msplat +1.09 dB)、p1-a-3 の「訓練\u002F評価 convention coupling」を第三者実装との比較で再実証した。msplat の native 品質が spike 比 +1.05 dB 向上した主因は今回の対称条件 (同一 culled init.ply 5207 pts・train 100 view 全量・常時フル解像度) にあり、msplat 側の条件を今回初めて本実装と揃えた結果。卒論 §5 の direct comparison 表はこの数値で置き換える。","\u002Ffindings\u002Fp2-msplat-parity-lego\u002F",{"id":38,"title":297,"date":298,"status":10,"polarity":299,"category":11,"axes":300,"tags":301,"task_code":312,"related_runs":313,"delta_psnr":317,"delta_wallclock":318,"rank":42,"verdict":319,"impact_summary":320,"detail_path":321},"P1.D Stage 2 — Lego brushcompat + opacity decay 30k = 36.106 dB、splats -56% \u002F wallclock -32%","2026-05-25","positive",[14,15,242],[302,303,304,305,306,307,308,19,309,310,311],"p1","phase-d","milestone-m5","opacity-decay","brush-parity","win-win-win","premultiplied","stage-2","splat-efficient","axis-1-prep","P1.D Stage 2 (M5 Lego val pass)",[314,315,316],"lego-brushcompat-opacdecay-30k","lego-brushcompat-base-30k","lego-brushcompat-opacdecay-5k","+0.92 dB vs baseline 30k (35.184 → 36.106)","-32% vs baseline 30k (1h 02m 18s → 41m 54s)","accepted-decisive-win","Lego brushcompat + opacity decay 30k で training-time eval 36.106 dB (val 100 view, brush convention, raw)、independent eval 36.163 dB (brush q8)。baseline 30k (35.184 dB) を **+0.92 dB 上回り**、splats を 846,689 → 375,146 に **-55.6% 削減**、wallclock を 1h 02m → 41m 54s に **-32% 短縮**。これは trade-off と想定していた PSNR\u002Fsplats\u002Fwallclock が **完全 win-win-win** に。M5 個別 scene gate (Lego brush conv > 36 dB) を val で達成、brush 自身 val 32.038 dB を +4.07 dB 上回り、本実装が brush を decisive に超えた。test subset (n=36) も +0.75 dB 改善 (33.315 → 34.065)、brush paper test 37.40 との gap を -3.34 dB まで縮小。Stage 1 smoke 推定 (splats -11.6%) を 30k で -56% に拡大、opacity decay の効果は iter 累積で増大することを実証。次 step は multi-scene Phase D 7 scene re-chain (chain 完了後 schedule)、低 wallclock + 低 splats での M5 multi-scene parity 完遂を狙う。","\u002Ffindings\u002Fp1-d-stage2-30k-results\u002F",{"id":36,"title":323,"date":324,"status":10,"polarity":240,"category":325,"axes":326,"tags":327,"task_code":334,"related_runs":335,"delta_psnr":338,"delta_wallclock":339,"rank":42,"verdict":340,"impact_summary":341,"detail_path":342},"P1.A.1 brush eval audit — 数式定式化 + diff 観点 12 項目","2026-05-24","audit",[14,15],[302,328,17,325,329,330,331,332,308,333],"a-1","psnr","ssim","eval","alpha","convention","P1.A.1",[336,337],"brush-lego-sh3-30k (37.40 dB report)","splat-rs-lego-sh3-30k (24.879 dB)","N\u002FA (apparent gap mechanism の特定が主目的)","N\u002FA (audit task)","audit-complete","brush eval は (1) AlphaMode::Transparent で GT を α premultiply、(2) bg=Vec3::ZERO の黒背景に render、(3) composite_bg=None で premultiplied 同士を直接比較、(4) 8-bit roundtrip 後に MSE = mean((pred−gt)²) over H·W·3、(5) PSNR = 10·log10(1\u002FMSE)。これは NeRF Synthetic (RGBA で α=0 の透明領域が支配的) において **透明領域は pred=gt=0 で完全一致** となり、MSE 分母に 0 寄与が大量に入る → conventional 「白背景に composite してから PSNR」より高く出る。splat-rs 側の eval 規約を A.2 で確認し、A.3 で「同 convention 下での真の gap」を測定する必要あり。","\u002Ffindings\u002Fp1-a-1-brush-eval-audit\u002F",{"id":37,"title":344,"date":324,"status":10,"polarity":345,"category":11,"axes":346,"tags":347,"task_code":352,"related_runs":353,"delta_psnr":355,"delta_wallclock":356,"rank":42,"verdict":357,"impact_summary":358,"detail_path":359},"P1.A.3 cross-eval reproducer — brush convention で 24.879 → 1.67 dB に崩壊、主仮説 falsify","negative",[14,15,242],[302,348,349,306,331,333,329,308,350,351],"phase-a","milestone-m1","reproducer","falsified-hypothesis","P1.A.3 + P1.A.4",[354],"lego-sh3-30k (splat-rs 24.879 dB legacy\u002Fval)","-23.21 dB (brush convention 化で 24.879 → 1.667)","N\u002FA (eval only)","hypothesis-falsified-stronger-finding","splat-rs `final.ply` (24.879 dB legacy\u002Fval baseline) を brush 準拠 convention (premultiplied GT + bg=ZERO 比較 + 8-bit roundtrip) で再評価すると **1.67 dB に崩壊**。audit §6 が予測した +3〜+5 dB 底上げと逆方向に -23 dB。原因は trainer が white-bg target で学習されており、背景領域を opaque-white splat で埋めるよう収束した結果、brush 流の bg=ZERO 比較では背景 pixel 全体で MSE≈1 が systematic に乗る。`view_00.png` 目視確認 (背景は白い不透明領域) で機構を確定。**training と eval の convention は coupling しており、eval pipeline だけ揃える apparent-gap 仮説は不成立**。卒研 P1.M2\u002FM3 に向けては「training loss も brush 化 (RGBA 4ch L1 を α=0 領域で背景に penalty を吹かさない構造)」が必須要件。8-bit quantize 単体の impact はほぼ無視可能 (legacy 24.879 → 24.879、brush 1.605 → 1.667、+0.06 dB)。","\u002Ffindings\u002Fp1-a-3-cross-eval-reproducer\u002F",{"id":34,"title":361,"date":362,"status":10,"polarity":12,"category":11,"axes":363,"tags":364,"task_code":367,"related_runs":368,"delta_psnr":370,"delta_wallclock":371,"rank":42,"verdict":372,"impact_summary":373,"detail_path":374},"M4 Max 上 brush (wgpu→Metal) の 30k baseline — wgpu 抽象は自作より速かった","2026-05-23",[15],[365,17,20,281,285,366],"phase-2","abstraction-cost","A.3",[369],"lego-sh3-30k","+11.13 dB (brush 比優位)","−65.6% (brush の方が速い)","investigative","wgpu 抽象は自作 native より遅いはず、という想定が逆。同一 M4 Max 上で brush (wgpu) が 9m08s \u002F 37.40 dB、自作 (Metal 直) が 26m32s \u002F 26.27 dB。第 2 軸 (抽象コスト定量化) の主張を再 framing する必要が確定。","\u002Ffindings\u002Fm4-brush-bench\u002F",1790227327646]