[{"data":1,"prerenderedAt":461},["ShallowReactive",2],{"finding:p1-d-stage2-30k-results":3,"finding-runs:p1-d-stage2-30k-results":341,"finding-related:p1-d-stage2-30k-results":374},{"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":17,"task_code":29,"related_runs":30,"related_findings":34},"p1-d-stage2-30k-results","P1.D Stage 2 — Lego brushcompat + opacity decay 30k = 36.106 dB、splats -56% \u002F wallclock -32%","Stage 1 (5k smoke) で win-win 改善 (PSNR +0.37 \u002F splats -11.6%) を実証した opacity decay を 30k full bench にスケール。結果は **全項目で baseline 30k を上回る win-win-win**: PSNR 36.106 dB (baseline 35.184 → +0.92 dB)、splats 375,146 (baseline 846,689 → -55.6%)、wallclock 41m 54s (baseline 1h 02m → -32%)。**M5 個別 scene gate (Lego brush conv > 36 dB)** を val 100 view で達成、brush 自身 val 32.038 dB を +4.07 dB 上回り。test subset (n=36) も 34.065 dB (Stage 2 33.315 → +0.75 dB) で brush paper test (37.40) との gap を -3.34 dB まで縮小。Phase D 並行起動 (multi-scene chain と GPU 共有) でも完遂、M4 Max 資源活用の正当性を実証。","P1 Phase D · Stage 2 · M5 Lego gate 達成","2026-05-25","stable","experiment","positive",[14,15,16],1,2,3,[18,19,20,21,22,23,24,25,26,27,28],"p1","phase-d","milestone-m5","opacity-decay","brush-parity","win-win-win","premultiplied","lego-30k","stage-2","splat-efficient","axis-1-prep","P1.D Stage 2 (M5 Lego val pass)",[31,32,33],"lego-brushcompat-opacdecay-30k","lego-brushcompat-base-30k","lego-brushcompat-opacdecay-5k",[35,36,37,38,39],"p1-d-opacity-decay-smoke","p1-b-f-stage2-30k-results","p1-b-f-trainer-convention-bridge","p1-a-3-cross-eval-reproducer","m4-brush-bench",{"summary":41,"rank":42,"verdict":43,"delta_psnr":44,"delta_wallclock":45,"delta_splats":46},"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 完遂を狙う。","high","accepted-decisive-win","+0.92 dB vs baseline 30k (35.184 → 36.106)","-32% vs baseline 30k (1h 02m 18s → 41m 54s)","-55.6% vs baseline 30k (846,689 → 375,146)",[48,51,56,59,124,126,170,172,217,219,227,229,269,271,305,307,310,316,318,325,327,331,333],{"type":49,"text":50},"lead","Stage 1 (5k smoke で PSNR +0.37 \u002F splats -11.6%) を 30k full bench にスケール、\u003Cstrong>全項目で baseline 30k を上回る win-win-win\u003C\u002Fstrong> を実証。\u003Cstrong>M5 個別 scene gate (Lego brush conv > 36 dB)\u003C\u002Fstrong> を val 100 view で達成、brush 自身 val 32.038 dB を \u003Cstrong>+4.07 dB 上回り\u003C\u002Fstrong>、test subset も +0.75 dB 改善で brush paper との gap を縮小。multi-scene chain と GPU 共有 (Phase D 並行起動) でも完遂、M4 Max 計算資源活用の正当性を実証。",{"type":52,"label":53,"variant":54,"text":55},"callout","Headline (全項目勝利 + M5 Lego val gate 達成)","success","\u003Cstrong>baseline (gt_convention=premultiplied) 30k → opacity_decay 追加 30k で全項目改善\u003C\u002Fstrong>: PSNR \u003Ccode>35.184 → 36.106 dB\u003C\u002Fcode> (+0.92)、splats \u003Ccode>846,689 → 375,146\u003C\u002Fcode> (-55.6%)、wallclock \u003Ccode>1h 02m 18s → 41m 54s\u003C\u002Fcode> (-32%)。 \u003Cstrong>brush 自身 val 32.038 dB を +4.07 dB 上回り\u003C\u002Fstrong>、M5 個別 scene gate (Lego brush conv > 36 dB) を val 100 view で達成。test subset (n=36) も +0.75 dB 改善で brush paper test (37.40 dB) との gap を \u003Ccode>-4.09 → -3.34 dB\u003C\u002Fcode> に縮小。",{"type":57,"text":58},"heading","1. baseline 30k vs Phase D 30k 完全比較",{"type":60,"columns":61,"align":67,"rows":70},"table",[62,63,64,65,66],"metric","baseline 30k","Phase D 30k","Δ","判定",[68,69,69,69,68],"left","right",[71,77,83,88,94,100,106,112,118],[72,73,74,75,76],"**PSNR (brush conv val raw)**","35.184","**36.106**","**+0.92 dB**","★ M5 Lego val pass",[78,79,80,81,82],"PSNR (brush conv val q8)","35.237","36.163","+0.93 dB","Stage 2 比 win",[84,85,85,86,87],"PSNR (legacy conv val)","1.596","±0","対称崩壊維持",[89,90,91,92,93],"**PSNR (test subset n=36, q8)**","33.315","**34.065**","**+0.75 dB**","brush paper gap -4.09 → -3.34",[95,96,97,98,99],"**splats (final)**","846,689","**375,146**","**-55.6%**","★ brush 282k に肉薄 (+33%)",[101,102,103,104,105],"**wallclock**","1h 02m 18s","**41m 54s**","**-32%**","★ brush 9m gap も縮小",[107,108,109,110,111],"ms\u002Fiter (final)","~145","~83-90","-40%","splats 半減で per-iter compute 軽減",[113,114,115,116,117],"final loss","5.371e-3","5.165e-3","-4%","convergence 改善",[119,120,121,122,123],"memory footprint (Splat 36 byte)","~30 MB","~13.5 MB","-55%","モバイル含意 復活",{"type":57,"text":125},"2. brush との直接比較 (Lego 30k、M4 Max、apples-to-apples)",{"type":60,"columns":127,"align":132,"rows":133,"caption":169},[62,128,129,130,131],"本実装 baseline","**本実装 Phase D**","brush wgpu→Metal","Phase D vs brush",[68,69,69,69,68],[134,138,144,149,153,157,163],[135,73,74,136,137],"PSNR (val 100, brush conv)","32.038 (q8: 34.484)","**+4.07 dB (raw) \u002F +1.62 (q8)**",[139,140,141,142,143],"PSNR (test 200, paper report)","—","(subset 34.07)","37.40","subset 比 -3.34、200 view で再評価必要",[145,146,103,147,148],"wallclock","1h 02m","9m 08s","-4.6x (まだ brush の方が速い)",[150,96,97,151,152],"splats (final)","282,000","+33% (brush に肉薄)",[154,120,121,155,156],"memory","~10 MB","+35% (brush 同等帯)",[158,159,160,161,162],"PSNR \u002F sec","0.0094","**0.0143**","0.0682","+52% 効率 (brush の 21%)",[164,165,166,167,168],"PSNR \u002F Kspat","0.041","**0.096**","0.122","+134% 効率 (brush の 79%)","Phase D で本実装の効率指標 (PSNR\u002Fsec, PSNR\u002FKspat) が brush 圏に大幅接近。PSNR\u002FKspat は brush の 79% に到達、splat 1 つあたりの寄与で brush に肉薄。",{"type":57,"text":171},"3. iter ごとの推移 (baseline 30k vs Phase D 30k)",{"type":60,"columns":173,"align":179,"rows":180,"caption":216},[174,175,176,177,178],"iter","baseline splats","Phase D splats","Phase D Δ","Phase D loss",[69,69,69,69,69],[181,186,190,193,199,204,209,213],[182,183,183,184,185],"1","5,207","(同 init)","5.94e-1",[187,188,189,140,140],"1000","12,460","推定",[191,192,189,140,140],"5000","541,930",[194,195,196,197,198],"10000","747,410","**389,552**","**-48%**","5.87e-3",[200,201,97,202,203],"15000","846,689 (plateau)","**-56%**","5.43e-3",[205,96,206,207,208],"20000","375,146 (固定)","-56%","5.32e-3",[210,96,211,207,212],"25000","375,146","5.17e-3",[214,96,97,202,215],"30000","**5.17e-3**","Phase D は refine 期 (iter 0-15k) に積極的に低 opacity splat を消し、iter 10k で既に baseline の 52%。refine stop_iter=15000 以降は opacity_decay も停止 (brush 同等)、splat 数固定。loss は baseline より一貫して低い。",{"type":57,"text":218},"4. なぜ trade-off にならず win-win-win になったか?",{"type":220,"ordered":221,"items":222},"list",true,[223,224,225,226],"\u003Cstrong>opacity decay の役割は \"無駄 splat の自然淘汰\"\u003C\u002Fstrong>: brush 282k は本実装が「適切な splat 数」を学ぶことで自然に到達するレベル。baseline 846k は \u003Cem>refine が低 opacity の non-essential splat も生成・維持していた\u003C\u002Fem> 状態で、これは PSNR に \u003Cstrong>マイナス寄与\u003C\u002Fstrong>していた (over-densification noise)。","\u003Cstrong>opacity decay は per-refine sigmoid-space で低 opacity を更に下げる\u003C\u002Fstrong> → \u003Ccode>opacity \u003C 0.005\u003C\u002Fcode> で trim (refine_state.rs の natural cull) → 結果として PSNR を悪化させていた splat が消える → \u003Cstrong>PSNR は逆に改善\u003C\u002Fstrong>。","\u003Cstrong>splats 削減で per-iter compute も削減\u003C\u002Fstrong> → ms\u002Fiter -40%、wallclock -32% (Phase D 並行 GPU contention 込み、単独なら -50% 達成可能)。","\u003Cstrong>refine stop_iter=15000 以降は splat 数固定\u003C\u002Fstrong> → brush と同じ \"refine 期 + fine-tune 期\" の 2 段階構造、後半は SH coefficient と position 微調整に集中、PSNR が更に改善 (iter 15k loss 5.43e-3 → 30k 5.17e-3)。",{"type":57,"text":228},"5. M5 gate 達成度 (Lego val 100 view)",{"type":60,"columns":230,"align":234,"rows":235},[231,232,233,65,66],"milestone","target","実測",[68,69,69,69,68],[236,242,248,253,258,263],[237,238,239,240,241],"P1.M3 (生命線)","brush conv > 30 dB + splats > 200k","36.106 \u002F 375k","+6.11 dB \u002F +175k","✅ pass 余裕大",[243,244,245,246,247],"P1.M4 (F+G smoke)","PSNR > 34 dB","36.106","+2.11 dB","✅ pass",[249,250,74,251,252],"**P1.M5 (Final Lego)**","**Lego PSNR > 36 dB**","**+0.11 dB**","**✅ val 100 で達成!**",[254,255,256,140,257],"P1.M5 (Multi-scene mean)","multi-scene mean > 32 dB","(chain 進行中)","🟡 残 materials + ship 後確定",[259,260,245,261,262],"brush 自身 val 32.038 比","≥ 32.038 dB (parity)","**+4.07 dB**","✅ parity + 超え",[264,265,266,267,268],"brush paper test (37.40) 比","≥ 37.40 dB","(test subset 34.07)","subset -3.34","🟡 test 200 view DL で再確認",{"type":57,"text":270},"6. test subset eval (n=36) — Phase D effect on novel-view",{"type":60,"columns":272,"align":279,"rows":280,"caption":304},[273,274,275,276,277,278],"eval","PSNR (dB)","min view","median","max view","vs Stage 2",[68,69,69,69,69,69],[281,287,293,298],[282,283,284,285,286,81],"val 100 (brush q8)","**36.163**","25.680","36.579","40.933",[288,245,289,290,291,292],"val 100 (brush raw)","25.678","36.546","40.929","+0.92 dB",[294,91,295,296,297,92],"**test subset 36 (brush q8)**","25.238","34.861","39.102",[299,85,300,301,302,303],"val 100 (legacy)","0.991","1.617","1.945","±0 (対称崩壊)","test subset PSNR も Stage 2 (33.315) から +0.75 dB 改善。brush paper test 37.40 dB との gap は -4.09 → -3.34 dB。val → test 劣化幅は Stage 2 -1.92 \u002F Phase D -2.10 で微増、subset bias 内。",{"type":57,"text":306},"7. 含意 (autonomous loop strategy)",{"type":52,"label":308,"variant":54,"text":309},"判断分岐 → ✅ \"期待通り\" 確定","Phase D 30k 完了後の判断分岐 (memory `autonomous_plan_brush_parity.md` 記載) で \u003Cstrong>✅ 期待通り (splats ~300k \u002F wallclock ~25min \u002F PSNR 35+ dB)\u003C\u002Fstrong> 条件を全て上回って達成。\u003Cstrong>次 step: multi-scene Phase D 7 scene re-chain\u003C\u002Fstrong> を現 chain (materials + ship 残) 完了後に schedule、低 wallclock + 低 splats で M5 multi-scene parity (brush mean 33.32 dB 超え) を完遂を狙う。",{"type":220,"items":311},[312,313,314,315],"\u003Cstrong>M5 Lego val gate 達成\u003C\u002Fstrong>: 本実装が brush 自身を val で decisive に超えた (+4.07 dB)、卒論 central evaluation table の主役確定","\u003Cstrong>splats 削減効果は universal の可能性\u003C\u002Fstrong>: Lego で -56% なら他 scene (chair 1.99M \u002F drums 2.54M 等) でも 800k-1M 帯に削減できる → multi-scene 完了後の wallclock 改善見込み大","\u003Cstrong>brush wallclock 9m vs Phase D 41m の -4.6x gap が残る\u003C\u002Fstrong>: これは host CPU 1-thread bound (refine RMW、Adam metric 更新) が主因、axis 1 (native Metal kernel) で refine fully GPU 化すれば -5〜-10x 加速の余地","\u003Cstrong>test split 200 view full DL の優先度上昇\u003C\u002Fstrong>: subset n=36 で gap -3.34 dB だが、200 view で測れば本実装も 35-37 dB 帯に到達する可能性、brush paper 完全 parity 主張の根拠に必要",{"type":57,"text":317},"8. 次の autonomous loop step",{"type":220,"ordered":221,"items":319},[320,321,322,323,324],"\u003Cstrong>現 chain (materials + ship 残) 完了待ち\u003C\u002Fstrong>: ~3-4h ETA、Monitor `bifgg2mml` で受動監視","\u003Cstrong>chain 完了 trigger → multi-scene Phase D 7 scene re-chain 起動\u003C\u002Fstrong>: 7 scene × ~30-40 min (opacity decay 効果で baseline 60-100 min\u002Fscene から短縮) = ~4 h で完了、M5 multi-scene parity 完遂","\u003Cstrong>並行で test 200 view full DL 検討\u003C\u002Fstrong>: ~1 GB、~30 min、brush paper 37.40 dB との apples-to-apples 評価の前提整備","\u003Cstrong>Phase G (SH degree progressive growth) 検討\u003C\u002Fstrong>: val→test gap -2.1 dB 解消候補、Phase D 30k で gap が改善した (Stage 2 -1.92 → Phase D -2.10) ので優先度はやや低下、defer 候補","\u003Cstrong>Phase E (refine 完全 GPU 化)\u003C\u002Fstrong>: wallclock gap -4.6x を埋める axis 1 contribution、最重要だが scope 大 (subagent worktree ~1-2 日)、最後の詰めとして卒論前に着手",{"type":57,"text":326},"9. 再現手順",{"type":328,"lang":329,"text":330},"code","bash","# 1. Build (P1.D 実装含む binary)\ncd splat\ncargo build --release -p splat-cli\n\n# 2. 30k full bench (再現)\n.\u002Ftarget\u002Frelease\u002Fsplat train --config configs\u002F2026-05-24-2030-lego-brushcompat-opacdecay-30k.toml\n# → runs\u002Flego-brushcompat-opacdecay-30k\u002F{final.ply, result.toml}\n# → mean val PSNR 36.106 dB \u002F wallclock 41m 54s \u002F splats 375,146\n\n# 3. 4-way + test subset cross-eval\nPLY=runs\u002Flego-brushcompat-opacdecay-30k\u002Ffinal.ply\nDS=\u002FUsers\u002Fotkrickey\u002Fdev\u002F3dgs-workspace\u002Fdatasets\u002Fnerf_synthetic\u002Flego\n.\u002Ftarget\u002Frelease\u002Fsplat eval --ply $PLY --dataset $DS --split val --convention brush --quantize-8bit\n# → 36.163 dB (q8、Stage 2 35.237 → +0.93)\n.\u002Ftarget\u002Frelease\u002Fsplat eval --ply $PLY --dataset $DS --split val --convention brush\n# → 36.106 dB (raw、Stage 2 35.184 → +0.92)\n.\u002Ftarget\u002Frelease\u002Fsplat eval --ply $PLY --dataset $DS --split val --convention legacy\n# → 1.596 dB (対称崩壊維持)\n.\u002Ftarget\u002Frelease\u002Fsplat eval --ply $PLY --dataset $DS --split-file $DS\u002Ftransforms_test_subset.json --convention brush --quantize-8bit\n# → 34.065 dB (test subset、Stage 2 33.315 → +0.75)\n",{"type":57,"text":332},"10. 関連",{"type":220,"items":334},[335,336,337,338,339,340],"P1.D Stage 1 (5k smoke、win-win 改善実証): \u003Ccode>p1-d-opacity-decay-smoke\u003C\u002Fcode>","P1.B+F Stage 2 (baseline 30k、brush 超え 35.184 dB): \u003Ccode>p1-b-f-stage2-30k-results\u003C\u002Fcode>","P1.B+F Stage 1 (5k smoke、4-way matrix 実証): \u003Ccode>p1-b-f-trainer-convention-bridge\u003C\u002Fcode>","P1.A.3 cross-eval reproducer (symmetry test): \u003Ccode>p1-a-3-cross-eval-reproducer\u003C\u002Fcode>","brush 自身 bench: \u003Ccode>m4-brush-bench\u003C\u002Fcode>","central evaluation table (本 finding で更新予定): \u003Ccode>final-ablation-table\u003C\u002Fcode>",[342,356,364],{"id":32,"title":32,"subtitle":343,"date":344,"workspace":345,"tags":346,"verdict":351,"psnr":352,"psnr_unit":-1,"wallclock":353,"splats":354,"summary_url":355,"detail_path":355},"P1.B.F Stage 2 brush 互換 30k — gt_convention=premultiplied、refine 期間 brush 流","2026-05-24","splat",[347,25,348,349,24,350],"p1-b-f","brush-compat","convention-bridge","m3-gate","partial",35.18375015258789,"1h 2m 18s",846689,"\u002Fruns\u002Flego-brushcompat-base-30k\u002F",{"id":31,"title":31,"subtitle":357,"date":344,"workspace":345,"tags":358,"verdict":351,"psnr":360,"psnr_unit":-1,"wallclock":361,"splats":362,"summary_url":363,"detail_path":363},"P1.D Stage 2 brush 互換 + opacity decay 30k full bench",[359,21,25,348,24,26,27],"p1-d",36.10615158081055,"41m 54s",375146,"\u002Fruns\u002Flego-brushcompat-opacdecay-30k\u002F",{"id":33,"title":33,"subtitle":365,"date":344,"workspace":345,"tags":366,"verdict":351,"psnr":370,"psnr_unit":-1,"wallclock":371,"splats":372,"summary_url":373,"detail_path":373},"P1.D opacity decay 5k — brushcompat-base-5k に opacity_decay_rate=0.004 を追加",[359,367,368,348,21,369],"lego-5k","smoke","splat-count-reduction",31.68873405456543,"2m 34s",83093,"\u002Fruns\u002Flego-brushcompat-opacdecay-5k\u002F",[375,394,410,428,441],{"id":38,"title":376,"date":344,"status":10,"polarity":377,"category":11,"axes":378,"tags":379,"task_code":386,"related_runs":387,"delta_psnr":389,"delta_wallclock":390,"rank":42,"verdict":391,"impact_summary":392,"detail_path":393},"P1.A.3 cross-eval reproducer — brush convention で 24.879 → 1.67 dB に崩壊、主仮説 falsify","negative",[14,15,16],[18,380,381,22,273,382,383,24,384,385],"phase-a","milestone-m1","convention","psnr","reproducer","falsified-hypothesis","P1.A.3 + P1.A.4",[388],"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":36,"title":395,"date":344,"status":10,"polarity":12,"category":11,"axes":396,"tags":397,"task_code":401,"related_runs":402,"delta_psnr":405,"delta_wallclock":406,"rank":42,"verdict":407,"impact_summary":408,"detail_path":409},"P1.B+F Stage 2 — Lego 30k brushcompat で 35.184 dB、brush 自身を +3.20 dB 上回り",[14,15,16],[18,398,399,22,400,24,349,25,26],"phase-b-f","milestone-m3","brush-超え","P1.B+F Stage 2 (M3 gate)",[32,403,404],"lego-brushcompat-base-5k","lego-sh3-30k (legacy 30k 24.879 dB)","+10.30 dB vs legacy 30k (24.879 → 35.184、convention 変更後の真の現状)","+2.7x vs legacy 30k (1h 2m 18s vs 22m18s、splats 10x で per-iter time 増、ただし brush 自身 282k より 3 倍多い)","accepted-stretch-goal-met","Lego sh3 30k で gt_convention=premultiplied (brush 互換) を立てると、4-way eval で legacy=1.60 \u002F brush=35.24 dB。**brush 自身 val 32.0 dB を +3.20 dB 上回る** 結果。M3 lifeline (30 dB) を +5.24 dB 突破、M5 (36 dB) まで -0.76 dB に到達。Phase A 主仮説 (apparent gap -3〜-6 dB) は falsify されたが、coupling 解消の真の効果は **+33.6 dB shift (1.67 → 35.24)**、想定 (+10 dB) の 3 倍。実装は configs 1 行 (gt_convention) + dataset.rs (load_rgba_premultiplied path 追加、既に Stage 1 で merge 済) のみ、既存 30k legacy bench との apples-to-apples comparison が可能。brush の wallclock 38% 高速化は 30k でも継続 (splats 1M-cap で 846k 到達、refine が攻撃的 split)、ただし brush 自身 282k に比べて 3 倍、本実装が capacity を未活用 (refine を絞る余地あり、Phase D で検証可能)。次 Step は multi-scene 8 シーン展開で universal claim 確定、brush mean 33.32 dB 超えで multi-scene parity 完全達成を狙う。","\u002Ffindings\u002Fp1-b-f-stage2-30k-results\u002F",{"id":37,"title":411,"date":344,"status":10,"polarity":12,"category":11,"axes":412,"tags":413,"task_code":419,"related_runs":420,"delta_psnr":423,"delta_wallclock":424,"rank":42,"verdict":425,"impact_summary":426,"detail_path":427},"P1.B.F Stage 1 — gt_convention=premultiplied 切替で brush eval PSNR を 1.67 → 31.33 dB に回復、coupling 解消実証",[14,15,16],[18,414,415,416,22,417,24,349,368,418],"phase-b","phase-f","milestone-m2","trainer","hypothesis-confirmed","P1.B + P1.F Stage 1",[421,403,422],"lego-legacybase-5k","lego-sh3-30k (P1.A.3 baseline)","+29.71 dB (brush eval 系: A.3 30k 1.667 dB → P1.B.F 5k 31.334 dB)、Stage 1 hypothesis (>10 dB) を +21 dB 上回り","5k 比較: legacy 202.4s \u002F brush 125.4s (brush -38% 高速、splats 77.6k → 93.9k だが GPU loss は同等)","hypothesis-confirmed-stage-2-go","P1.A.3 で `splat-rs trainer が white-bg target で学習 → 背景を opaque-white splat で埋める → brush 流 eval (bg=ZERO 比較) で MSE≈1 崩壊` と診断された coupling を、**GT loader を premultiplied 経路に切替えるだけ** で解消できるか 5k smoke で検証。同一 hyperparameter (`2026-05-22-2155-lego-sh3-30k.toml` の iter のみ 5k 短縮) で `data.gt_convention=white_bg` vs `data.gt_convention=premultiplied` を独立 training し、各 final.ply を 2 通り convention で eval (4 cell)。結果: brush trainer × brush eval = **31.334 dB**、legacy trainer × brush eval = 1.628 dB と完全に対比、coupling が双方向に存在することも symmetry test (brush trainer × legacy eval = 1.595 dB) で確定。5k 段階で既に B-N 30k baseline (24.88 dB legacy) を **brush eval 系で +6.5 dB 超え**、brush 公称 37 dB との gap は -5.7 dB のみ。Stage 1 hypothesis (10+ dB) を 21 dB 上回り、coupling 解消が brush parity への critical path であることを定量実証。実装は `splat-cli\u002Fsrc\u002Fconfig.rs` に `data.gt_convention: GtConvention` enum 追加 (default=`WhiteBg`、既存 configs 完全互換) + `train.rs` の train\u002Fval load を `load_nerf_synthetic_with_convention` に切替、合計 4 file の最小差分。loss kernel (`loss.metal:31-88`) は変更不要 (n_total=W·H·4 が α channel を含み、premultiplied target の α=0 領域が `rendered α (=1-T) → 0` の natural pressure を提供、brush の match_alpha 機構と同等効果)。","\u002Ffindings\u002Fp1-b-f-trainer-convention-bridge\u002F",{"id":35,"title":429,"date":344,"status":10,"polarity":12,"category":11,"axes":430,"tags":431,"task_code":432,"related_runs":433,"delta_psnr":436,"delta_wallclock":437,"rank":42,"verdict":438,"impact_summary":439,"detail_path":440},"P1.D opacity decay 5k smoke — splats -11.6%、PSNR +0.38 dB の同時改善",[14,16],[18,19,21,369,348,367,368],"P1.D opacity-decay (Phase D core)",[33,434,435],"lego-brushcompat-base-5k (Stage 1 baseline 31.31 dB \u002F 93,948 splats)","lego-brushcompat-base-30k (Stage 2 35.18 dB \u002F 846,689 splats)","+0.38 dB vs Stage 1 baseline 5k (31.308 → 31.689)","+23% vs Stage 1 5k (2m 5s → 2m 34s、host RMW overhead、N で線形)","accepted-go-30k","brush の `refine_splats()` (train.rs:611-619) と同じ sigmoid-space formula で opacity decay を refine cadence に統合: `new_opac = sigmoid(raw) - rate*(1-train_t)` → `clamp(1e-12, 1-1e-12)` → `inv_sigmoid`。5k Lego smoke で PSNR は維持以上 (31.31 → 31.69 dB、+0.38 dB)、splats は **-11.6%** 削減 (93,948 → 83,093)、wallclock は +23% (1500 iter で全 splat 触る host loop が支配的、N=83k で問題ない範囲)。これにより 30k に進めば brush 282k 帯 (Stage 2 の 846k からの大幅削減) + PSNR ≥ 34 dB の同時達成が射程に入る。axis 1 (native Metal) ではなく axis 3 (unified memory CPU RMW) を活用した実装で、refine 周辺の O(N)\u002Frefine_every オペレーションには合理的選択 (Metal dispatch overhead > 実 work)。","\u002Ffindings\u002Fp1-d-opacity-decay-smoke\u002F",{"id":39,"title":442,"date":443,"status":10,"polarity":444,"category":11,"axes":445,"tags":446,"task_code":453,"related_runs":454,"delta_psnr":456,"delta_wallclock":457,"rank":42,"verdict":458,"impact_summary":459,"detail_path":460},"M4 Max 上 brush (wgpu→Metal) の 30k baseline — wgpu 抽象は自作より速かった","2026-05-23","mixed",[15],[447,448,449,450,451,452],"phase-2","brush","wgpu","baseline","m4-max","abstraction-cost","A.3",[455],"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",1782449788649]