[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"finding:p2-c3-tile-counting":3,"finding-runs:p2-c3-tile-counting":242,"finding-related:p2-c3-tile-counting":267},{"meta":4,"impact":48,"sections":54},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":27,"commit":28,"branch":29,"config_paths":30,"related_runs":40,"related_findings":43},"p2-c3-tile-counting","C3 per-tile counting sort — parity PASS \u002F PSNR guard PASS だが replay 有意差なしで棄却 (数値つき)","worktree (`worktree-agent-a61d27ad0ed372418`) で実装済みの C3 (count → CPU exclusive scan → exact-size scatter → per-tile bitonic sort、msplat 風) を main へ統合し GPU gate を完遂。\u003Ccode>splat bench --parity\u003C\u002Fcode> で正しさを確認 (tile_offsets byte-exact、grad buffer 5 種すべて tol 1e-4 以内 PASS)、12.5k full run の PSNR guard も通過 (36.226→36.190 dB、-0.036 dB)。しかし fixed-workload replay bench (final regime n=10) では \u003Cstrong>+3.15% (むしろ僅かに遅い、閾値 max(2σ,1%)=4.45% 未満で非有意)\u003C\u002Fstrong>、radix_sort kernel 単体も +7.5% で speedup 仮説は不成立。CPU 側 exclusive scan が GPU パイプラインに同期点を挟むことが原因と推定。full run 単体では -8.8% と matching しない結果が出たが、これは既知の full-run 分散 (~10%) の confound と判断し gate 判定には使わない — bench harness (p2-bench-harness-calibration) 導入の価値をそのまま裏付けた。\u003Cstrong>default flip 見送り、flag として保持\u003C\u002Fstrong>。副次効果として sort key に \u003Ccode>splat_idx\u003C\u002Fcode> を含めたことで depth-tie 非決定性が解消 (sorted_idx tie-order ambiguity が原理的に消える)。","P2 gap sweep · C3 GPU gate · 棄却","2026-08-16","stable","experiment","negative",[14],1,[16,17,18,19,20,21,22,23,24,25,26],"gap-sweep","phase-2","c3","tile-binning","counting-sort","bitonic-sort","gpu-gate","rejected","bench-harness","lego","determinism","C3 per-tile counting sort worktree 統合 + GPU gate (2026-08-16 GPU 専有タスク)","32070c46","main",[31,32,33,34,35,36,37,38,39],"splat\u002Fconfigs\u002F2026-08-16-c3-parity-baseline.toml","splat\u002Fconfigs\u002F2026-08-16-c3-parity-candidate.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-final-global_radix.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-final-tile_counting.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-final-n10-global_radix.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-final-n10-tile_counting.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-iter5000-global_radix.toml","splat\u002Fconfigs\u002F2026-08-16-c3-bench-iter5000-tile_counting.toml","splat\u002Fconfigs\u002F2026-08-16-lego-c3-tile-counting-12500.toml",[41,42],"lego-c3-tile-counting-12500","lego-bench-calib-checkpoints",[44,45,46,47],"p2-bench-harness-calibration","p2-last-contributor","p2-c0-resident-binning","p2-gap-sweep-baseline",{"summary":49,"rank":50,"verdict":51,"delta_psnr":52,"delta_wallclock":53},"別 worktree で実装済みだった C3 (per-tile counting sort) を main の util.rs 分割後の構造 (bench harness commit fe68cfa 由来) に手で移植し統合。smoke compile + unit test 6 本 + 既存 106 test 全 pass、build warning 0。\u003Ccode>splat bench --parity\u003C\u002Fcode> で数学的正しさを確認 (tile_offsets byte-exact、5 grad buffer tol 1e-4 以内 PASS)。しかし fixed-workload replay (final checkpoint n=10) では \u003Cstrong>+3.15%\u003C\u002Fstrong> ― 閾値 max(2σ,1%)=4.45% 未満で有意な高速化なし。radix_sort kernel 単体も +7.5% 遅い。12.5k full run の PSNR guard は通過 (-0.036 dB) したが、同じ full run の wallclock は -8.8% と replay の非有意判定に矛盾しており、これは既知の full-run 分散 confound と判断し gate 判定には採用しない (むしろ bench harness の存在意義を裏付ける実例)。default flip は見送り、TileCounting は BackendConfig flag として保持 (正しさは証明済みなので将来 CPU scan を GPU 化する等の改良余地があれば再挑戦可能)。副次効果として sort key \u003Ccode>(depth_bits&lt;&lt;32)|splat_idx\u003C\u002Fcode> により depth-tie 非決定性を解消した。","medium","rejected-no-significant-speedup-flag-retained","12.5k full run PSNR guard: 36.226 → 36.190 dB = -0.036 dB (±0.1 dB guard 内、PASS)","replay bench final n=10: GlobalRadix 32.383ms\u002Fiter (σ2.23%) vs TileCounting 33.403ms\u002Fiter (σ4.60%) = **+3.15% (非有意、閾値 4.45%)**。iter5000 n=3: +0.38% (非有意)。radix_sort kernel 単体: final n=10 で 5721us→6151us (+7.5%)。full run 単体 (n=1): 360.96s→329.11s (-8.8%、非有意判定と矛盾、confound と判断し不採用)",[55,58,61,84,86,89,109,111,113,170,172,192,194,196,218,223,225,233,235],{"type":56,"text":57},"lead","Phase 2 完了時点 (finding: p2-last-contributor) で radix_sort が 13.5% (絶対) 残っていた。別 worktree (\u003Ccode>worktree-agent-a61d27ad0ed372418\u003C\u002Fcode>) で先行実装されていた C3 (msplat 風 per-tile counting sort: count → CPU exclusive scan → exact-size scatter → per-tile bitonic sort、threadgroup memory 32KB = 4096 要素上限、超過 tile がある frame は正しさ優先で GlobalRadix に全面フォールバック) を main へ統合し GPU gate を完遂した。",{"type":59,"text":60},"heading","1. 統合作業",{"type":62,"columns":63,"align":66,"rows":68},"table",[64,65],"項目","内容",[67,67],"left",[69,72,75,78,81],[70,71],"worktree","`worktree-agent-a61d27ad0ed372418` (branch 同名)、分岐元 c8e5881 (main は fe68cfa \u002F b053e35 の bench harness commit 2 本分先行)",[73,74],"conflict 要因","`apply_backend_config` が `cmd\u002Ftrain.rs` の private fn から `crates\u002Fsplat-cli\u002Fsrc\u002Futil.rs` の pub fn に抽出済みだった (bench harness 実装時)。tile_bin.rs \u002F tile_bin.metal \u002F config.rs は main 側で無変更だったため diff がそのまま apply、train.rs の C3 差分 (`tile_sort` destructuring + `use_tile_counting_sort` 配線 + `build_config_items` 2 行) のみ util.rs \u002F train.rs へ手で移植",[76,77],"smoke compile","MSL は runtime compile のため Rust build では未検証だった。`cargo test -p splat-metal tile_counting` (= `GpuTileBinner::new` 経由) で shader 構文を検証、6 test 一発で PASS (shader 構文エラーなし)",[79,80],"unit test","5 本 (`tile_counting_matches_legacy_synthetic` \u002F `_random_500k` \u002F `_fallback_on_oversized_tile` \u002F `_biased_single_tile_under_threshold` \u002F `_empty_input_routes_to_legacy`) + panic guard 1 本 (`resident_sorted_bufs_panics_after_tile_counting_sort`、BatchedTail 併用の防衛) 全 PASS。既存 106 test も無傷",[82,83],"build","`cargo build --release` warning 0、`cargo check --tests` clean",{"type":59,"text":85},"2. parity (正しさの証明)",{"type":87,"text":88},"paragraph","`splat bench --config c3-parity-baseline.toml --parity c3-parity-candidate.toml` (final checkpoint、409,660 splats、GPU loss path) で baseline (GlobalRadix) と candidate (TileCounting) の 1 iteration を比較。",{"type":62,"columns":90,"align":92,"rows":93},[64,91],"結果",[67,67],[94,97,100,103,106],[95,96],"loss_value","baseline=0.004210821 candidate=0.004210905 diff=8.4e-8",[98,99],"tile_offsets","**PASS (exact byte equality, n=2,500)** — per-tile count\u002Fscan は完全一致",[101,102],"means_grad \u002F log_scales_grad \u002F rot_quats_grad \u002F raw_opacities_grad \u002F sh_coeffs_grad","**全 5 種 PASS** (tol atol=1e-4 rtol=1e-4、max_abs_diff は 2.8e-5〜5.8e-8 の範囲)",[104,105],"sorted_idx (informational)","2,197 \u002F 969,279 要素差 = **0.227%** — sort key layout の違い (legacy `(tile_id&lt;&lt;32)|depth_bits` vs C3 `(depth_bits&lt;&lt;32)|splat_idx`) による tie-order 差であって誤りではない (既存 harness 規約により gate 対象外)",[107,108],"PARITY OVERALL","**PASS**",{"type":59,"text":110},"3. replay bench A\u002FB (final + iter5000 checkpoint)",{"type":87,"text":112},"`splat bench` で final checkpoint (409,660 splats) \u002F iter5000 checkpoint (373,933 splats) の 2 regime を各 n=3 で計測。final regime は有意性が閾値付近だったため n=10 に escalation した (n=3\u002Fn=5 の σ 推定自体がノイズを持つという p2-bench-harness-calibration の運用ガイドラインに従う)。",{"type":62,"columns":114,"align":124,"rows":126,"caption":169},[115,116,117,118,119,120,121,122,123],"regime","n","variant","median ms\u002Fiter","mean","σ_pct","delta (vs GlobalRadix)","閾値 max(2σ,1%)","判定",[67,125,67,125,125,125,125,125,67],"right",[127,135,144,149,156,161],[128,129,130,131,132,133,134,134,134],"final (409,660 splats)","3","GlobalRadix","30.496","31.053","3.16%","—",[136,129,137,138,139,140,141,142,143],"final","TileCounting","32.479","32.569","0.53%","+4.88%","6.32%","非有意 (境界付近)",[136,145,130,146,147,148,134,134,134],"10","32.503","32.383","2.23%",[136,145,137,150,151,152,153,154,155],"33.833","33.403","4.60%","**+3.15%**","**4.45%**","**非有意 (n=10 escalation で確定)**",[157,129,130,158,159,160,134,134,134],"iter5000 (373,933 splats)","30.313","30.526","2.15%",[162,129,137,163,164,165,166,167,168],"iter5000","31.185","30.641","3.66%","+0.38%","4.30%","非有意 (ほぼゼロ)","全 regime・全 n で delta は閾値未満 (有意な高速化なし)。n=3→n=10 escalation で delta は 4.88%→3.15% に縮小し、有意性はより弱まった (n=3 が過大評価だった可能性)。方向は一貫して TileCounting が僅かに遅いかタイ。",{"type":59,"text":171},"4. per-kernel: radix_sort\u002Fcounting-sort 区間そのものも高速化していない",{"type":62,"columns":173,"align":177,"rows":178,"caption":191},[115,116,174,175,176],"GlobalRadix avg_us\u002Fcall","TileCounting avg_us\u002Fcall","delta",[67,125,125,125,125],[179,183,187],[136,145,180,181,182],"5,721.4","6,150.9","+7.5%",[136,129,184,185,186],"5,771.6","5,846.0","+1.3%",[162,129,188,189,190],"5,578.3","5,726.8","+2.7%","`ts_fwd_radix_sort` timing label (variant 問わず sort dispatch 全体を包む) の avg_us\u002Fcall。C3 は count→CPU exclusive scan→scatter→bitonic の 4 段だが、CPU scan が GPU コマンドバッファの同期点を挟むため、per-tile bitonic sort 自体の理論的優位 (msplat 同様、binary search 抽出が不要) を CPU-GPU 往復コストが相殺している、と推定 (kernel 内訳の詳細分解は未実施、future work)。",{"type":59,"text":193},"5. 12.5k full run — PSNR guard PASS、しかし wallclock は replay と矛盾 (confound と判断)",{"type":87,"text":195},"同一 recipe (`lego-bench-calib-checkpoints` = 現行 default スタック resident C0\u002FC1 + last_contributor 2-BWD) で `tile_sort = \"tile_counting\"` のみ変えた 12.5k full run を 1 本実施。",{"type":62,"columns":197,"align":201,"rows":202},[198,199,200,176],"metric","baseline (lego-bench-calib-checkpoints)","C3 (lego-c3-tile-counting-12500)",[67,125,125,125],[203,208,213],[204,205,206,207],"PSNR (mean val, 100 views)","36.226 dB","36.190 dB","**-0.036 dB (±0.1 dB guard 内、PASS)**",[209,210,211,212],"final splats","409,660","405,293","-1.1%",[214,215,216,217],"training wallclock (log 実測)","360.96s","329.11s","-8.8%",{"type":219,"label":220,"variant":221,"text":222},"callout","wallclock -8.8% は gate 判定に使わない (bench harness の存在意義そのもの)","warning","full run 単体の wallclock delta (-8.8%) は、n=10 replay bench が示した「非有意 (+3.15%、むしろ僅かに遅い)」と方向が逆転している。p2-bench-harness-calibration finding が実測した通り full run 間には ~10% の分散 (dataset load \u002F refine cadence \u002F relocation 等の交絡) があり、n=1 の full run 比較はこの分散に完全に飲み込まれる規模の delta。今回の C3 は \u003Cstrong>replay bench (σ で統制された比較) が唯一の信頼できる速度判定材料\u003C\u002Fstrong>であり、full run 単体の数値だけで判断していれば誤って +8.8% の高速化を採用していたことになる — bench harness 導入の価値をそのまま裏付ける実例。",{"type":59,"text":224},"6. 判定",{"type":226,"items":227},"list",[228,229,230,231,232],"**verdict: 棄却 (数値つき) — default flip 見送り、TileCounting は BackendConfig flag として保持**","根拠: replay bench (統制された唯一の速度判定材料) で全 regime・全 n において有意な改善なし (n=10 final: +3.15% \u003C 閾値 4.45%)。radix_sort kernel 単体も一貫して同等かやや遅い","PSNR guard は通過 (-0.036 dB) — 品質面の懸念はない。実装の正しさも parity で証明済み (tile_offsets byte-exact、grad 5 種 tol 内)","副次効果 (positive): sort key を `(depth_bits\u003C\u003C32)|splat_idx` にしたことで depth tie が原理的に消え、sorted_idx の tie-order 非決定性 (production シーンで ~0.2%、p2-bench-harness-calibration が発見・gate 除外していたもの) が C3 経路では解消される。ただし現状 default は GlobalRadix のままなのでこの恩恵は享受できていない — 将来 default 化する場合の副次的な決定論化メリットとして記録","future work: CPU exclusive scan を GPU prefix scan に置き換えれば同期点を削減できる可能性があるが、Phase 2 の timebox 方針 (3.5 週上限、8 月は執筆月) に従い今回はここで打ち切り、flag のまま保持する",{"type":59,"text":234},"7. 関連",{"type":226,"items":236},[237,238,239,240,241],"実装: `splat\u002Fcrates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002Ftile_bin.rs` (`tile_counting_sort_resident` ほか)、shader: `splat\u002Fshaders\u002Fforward\u002Ftile_bin.metal` (`tile_count`\u002F`tile_scatter`\u002F`tile_bitonic_sort`\u002F`tile_unpack_idx`)","config 配線: `splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Fconfig.rs::TileSortKind`、`splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Futil.rs::apply_backend_config`","gate 用 config: `splat\u002Fconfigs\u002F2026-08-16-c3-*.toml` (parity 2 + replay bench 6 + full run 1)","gate run: `splat\u002Fruns\u002Flego-c3-tile-counting-12500\u002F`、replay bench raw 出力: `splat\u002Fruns\u002Fbench-c3\u002F*.toml` (gitignore 対象、再生成可能)","bench harness 規約: `docs\u002Ffindings\u002Fp2-bench-harness-calibration.toml`",[243,260],{"id":42,"title":42,"subtitle":244,"date":9,"workspace":245,"tags":246,"verdict":255,"psnr":256,"psnr_unit":-1,"wallclock":257,"splats":258,"summary_url":259,"detail_path":259},"P2 bench harness calibration — 3-regime (iter1000\u002F5000\u002Ffinal) checkpoint 生成用 (lego-gap-baseline-12500 と同一 recipe、save_ply_at 追加のみ)","splat",[247,248,249,250,251,252,253,254],"p1-g","phase-g","early-stop","sh-progressive","stacked","lego-15k","brush-compat","premultiplied","partial",36.225929260253906,"6m 0s",409660,"\u002Fruns\u002Flego-bench-calib-checkpoints\u002F",{"id":41,"title":41,"subtitle":261,"date":9,"workspace":245,"tags":262,"verdict":255,"psnr":263,"psnr_unit":-1,"wallclock":264,"splats":265,"summary_url":266,"detail_path":266},"C3 (per-tile counting sort) GPU gate — full 12.5k quality guard run vs lego-bench-calib-checkpoints baseline (PSNR 36.226 dB \u002F 360s)",[247,248,249,250,251,252,253,254],36.19035339355469,"5m 29s",405293,"\u002Fruns\u002Flego-c3-tile-counting-12500\u002F",[268,288,309,331],{"id":44,"title":269,"date":9,"status":10,"polarity":270,"category":271,"axes":272,"tags":274,"task_code":281,"related_runs":282,"delta_psnr":-1,"delta_wallclock":283,"rank":284,"verdict":285,"impact_summary":286,"detail_path":287},"splat bench harness 実装 + calibration — σ_replay 0.83%、full run 比 ~6x ノイズ削減","positive","tooling",[14,273],3,[24,275,276,277,278,279,280,25],"calibration","variance","reproducibility","c7","fixed-workload","gate-infra","splat bench harness (2026-08-16 GPU 専有タスク)",[42],"σ_replay 0.83% (n=10, final-scale workload) vs full run 実測 ~10% — 約 6x ノイズ削減","high","accepted","`splat bench --config bench.toml` を実装し、同一 config n=10 replay で \u003Cstrong>σ_replay = 0.234 ms\u002Fiter (mean 28.339 ms 比 0.83%)\u003C\u002Fstrong> を実測。full training run で観測されていた ~10% 分散に対し \u003Cstrong>約 6x のノイズ削減\u003C\u002Fstrong>。3-regime (iter 1000 \u002F 5000 \u002F final checkpoint、各 n=5) でも σ 1.2-4.6% の範囲に収まり、splat 数が少ない早期 regime ほど相対分散が大きい傾向を確認。有意判定閾値を \u003Ccode>max(2σ, 1%)\u003C\u002Fcode> と規約化し、以後の gate 判定をこの harness の計測に載せ替える。付随して `--parity` (kernel variant 間の勾配 \u002F binning 一致検証) と `[output] save_ply_at` (checkpoint 保存) を実装、parity mode の実測で production-scale シーンの `sorted_idx` tie-order 非決定性 (~0.2%、真の非決定性であって variant 差ではない) を発見し gate から除外した。","\u002Ffindings\u002Fp2-bench-harness-calibration\u002F",{"id":46,"title":289,"date":9,"status":10,"polarity":270,"category":11,"axes":290,"tags":291,"task_code":298,"related_runs":299,"delta_psnr":304,"delta_wallclock":305,"rank":284,"verdict":306,"impact_summary":307,"detail_path":308},"P2 gap sweep Phase 2 — C0 resident arena + C1 pass skip で -48.4% (bit-exact)",[14,273],[16,17,292,293,294,295,296,297,25],"c0-resident-arena","c1-radix-pass-skip","binning","bit-exact","unified-memory","page-fault","2026-08 msplat gap sweep Phase 2 C0\u002FC1",[300,301,302,303],"lego-c0-day0-attrib-1k","lego-c0-ab-periter-1k","lego-c0-ab-resident-1k","lego-c0-resident-12500","12.5k gate: 36.216 → 36.183 dB = -0.033 dB (bit-exact 実装、atomic 非決定性 guard ±0.1 内で通過)","12.5k gate: 766.07 → 395.59s = **-48.4%** (emit -98% \u002F radix -53% \u002F extract -81%)","c0-c1-adopted-default-flip-minus-48-percent","\u003Cstrong>単発 -48.4% は本 project 最大の 1 施策改善\u003C\u002Fstrong>で、msplat 実測 gap (11m48s vs 3m40s ≈ 3.2×、Lego 30k) を大幅に詰める lever が確定。766.07 → 395.59s は kernel を 1 行も触らず host 側 buffer 管理だけで達成 (bit-exact)。emit_pairs は 38.2% → 1.2% に消滅し、新 bottleneck は backward_raster 31.4% (→ 2-BWD last_contributor の trigger 25% を初超過) と radix_sort 11.7% (GPU compute 本体)。STP (feat.F) は emit の alloc 成分が消えた今、相対効果の再 bench が必要 (Phase 1a の -7.45% は大半が同じ page fault の削減で C0 と重複していた可能性が高い)。教訓: unified memory 環境の profiling では「GPU 時間」に host メモリ管理コストが化ける — per-kernel wallclock だけでなく buffer lifecycle を疑うこと。","\u002Ffindings\u002Fp2-c0-resident-binning\u002F",{"id":47,"title":310,"date":9,"status":10,"polarity":270,"category":11,"axes":311,"tags":312,"task_code":318,"related_runs":319,"delta_psnr":326,"delta_wallclock":327,"rank":284,"verdict":328,"impact_summary":329,"detail_path":330},"P2 gap sweep Phase 0\u002F1a — binning 55% 実測 + C0 発見 + StopThePop -7.45%",[14],[16,313,314,315,316,317,294,292,25],"phase-0","phase-1a","profiling","per-kernel-breakdown","stop-the-pop","2026-08 msplat gap sweep Phase 0 + 1a",[320,321,322,323,324,325],"lego-gap-baseline-12500","lego-stp-12500","lego-stp-ab-original-5k-r1","lego-stp-ab-original-5k-r2","lego-stp-ab-stp-5k-r1","lego-stp-ab-stp-5k-r2","STP 12.5k: 36.216 → 36.193 dB = -0.023 dB (guard -0.05 内で通過)","STP 12.5k: 766.07 → 708.96s = **-7.45%** (emit -10.5% \u002F radix -8% \u002F backward -6%)","binning-55-percent-c0-discovered-stp-marginal-go","\u003Cstrong>Phase 2 の主戦場が確定\u003C\u002Fstrong>: strategy doc の trigger 3 候補 (separable SSIM \u002F last_contributor \u002F SH-Adam fusion) は全て閾値不発、代わりに \u003Cstrong>binning 経路 55% の主犯 = per-iter ~1.25GB alloc + Vec 三重往復 (C0)\u003C\u002Fstrong> が最大 lever。C0 (persistent buffer arena、bit-exact、3-4 日) の期待は \u003Cstrong>wallclock -30〜39% (766→~470s) で単独 gap ≤2.0× 到達圏\u003C\u002Fstrong>。C1 (radix 定数桁 pass skip 16→11、bit-exact、0.5-1 日) が +4-5%。StopThePop は -7.45% で adoption gate (-8%) に僅差未達、default 維持のまま C0 後再判定。5 連敗の教訓「profiling が指す順」が機能した初の事例 — 事前決め打ちなら SSIM (5.2%) に突撃していた。","\u002Ffindings\u002Fp2-gap-sweep-baseline\u002F",{"id":45,"title":332,"date":9,"status":10,"polarity":270,"category":11,"axes":333,"tags":334,"task_code":339,"related_runs":340,"delta_psnr":345,"delta_wallclock":346,"rank":284,"verdict":347,"impact_summary":348,"detail_path":349},"P2 gap sweep Phase 2 — 2-BWD last_contributor で -15.0% (数学的同値)、STP 再判定は棄却",[14],[16,17,335,336,317,337,338,25],"2-bwd-last-contributor","backward","re-eval","function-constant","2026-08 msplat gap sweep Phase 2 2-BWD \u002F STP 再判定",[341,342,343,344],"lego-lc-smoke-1k","lego-p2lc-12500","lego-stp-c0-12500","lego-stack-lc-stp-12500","LC 12.5k gate: 36.183 → 36.191 dB = +0.008 dB (数学的同値実装、atomic 非決定性 guard ±0.1 内)","LC 12.5k gate: 395.59 → 336.33s = **-14.98%** (backward_raster -40.3%)。STP: -2.51% (gate 未達)、LC+STP スタック: 343.63s (LC 単独より +2.2%)","lc-adopted-minus-15-percent-stp-rejected-final","C0 (-48.4%) に続く Phase 2 第 2 弾で、backward 31.4% の新 bottleneck を kernel 側から -40.3% 削減。\u003Cstrong>Lego 12.5k = 336.33s で msplat 30K (220s) 比 1.53× まで縮小\u003C\u002Fstrong>し、gap sweep の目標 (≤2.0×) を達成した。実装は「forward が既に知っている打ち切り位置を backward に伝えるだけ」で数学的同値 — 品質を 1 bit も動かさずに backward の replay 計算量を ~40% 削った。STP 再判定は負の結果だが価値が高い: Phase 1a の -7.45% の正体が C0 と同じ page fault 削減だったことを分離実証し、「効果の重複を疑って再 bench する」protocol の正しさを裏付けた。次の bottleneck は forward rasterize 9.8% \u002F radix 13.5% \u002F SSIM 7.5% でいずれも trigger 25% 未達 — Phase 2 はここで完了、Phase 3 (再計測 + Pareto v3) へ。","\u002Ffindings\u002Fp2-last-contributor\u002F",1790227326538]