[{"data":1,"prerenderedAt":303},["ShallowReactive",2],{"finding:p3-refine-every-200":3,"finding-runs:p3-refine-every-200":222,"finding-related:p3-refine-every-200":223},{"meta":4,"impact":43,"sections":49},{"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":35,"related_findings":39},"p3-refine-every-200","refine.every 100→200 — 不採用 (PSNR guard 大幅超過、2026-08-30 gate)","docs\u002Ffindings\u002Fp3-c2-bubble-attribution.toml §6 施策 #5 — refine tick (100 iter に 1 回) の CPU compact drain が 12.5k で 3.0〜3.8s (2.4〜3.1%) を占めることから、tick 頻度を半減すれば drain も半減し wallclock -1.2〜-1.5% を期待した hyperparameter 実験。\u003Cstrong>12.5k n=3 交互 A\u002FB で PSNR Δ -0.421dB (guard `on mean >= off mean - 0.05dB` を約 8.4 倍超過) — 不採用\u003C\u002Fstrong>。wallclock 自体は Δ -25.6% と大幅に短縮したが、これは drain 削減 (メカニズムは的中、sync_iters 121→61 で確認、寄与は期待帯 -1.2〜-1.5% 相当) ではなく、tick 頻度半減が同時に densification 予算を削り最終 splat 数を -35% (407.7k→266.7k) 減らしたことによる副作用が主因 — \u003Ccode>refine.every\u003C\u002Fcode> は drain のみを制御する独立ノブではなく、tick cadence に紐づく growth\u002Fclone\u002Fsplit イベント数と opacity decay 累積量を同時に変える hyperparameter であることが判明した。\u003Cstrong>default config は変更しない、採否はユーザー判断待ち\u003C\u002Fstrong>。","docs\u002Ffindings\u002Fp3-c2-bubble-attribution.toml §6 施策 #5 · refine.every 100→200","2026-08-30","stable","experiment","negative",[14,15],1,3,[5,17,18,19,20,21,22,23,24],"re200","refine","hyperparameter","psnr-guard-fail","densification-coupling","lego","gate-rejected","contaminated-pair-retry","docs\u002Ffindings\u002Fp3-c2-bubble-attribution.toml §6 施策 #5 (refine.every 100→200)","gate は main HEAD f91355e 上で実施 (run 中に別 agent の S4b merge で HEAD が 1c54a0b に進行、binary sha256 は series を通じて 38ca2d6d... で不変)","main",[29,30,31,32,33,34],"splat\u002Fconfigs\u002F2026-08-30-re200-12500-off-r1.toml","splat\u002Fconfigs\u002F2026-08-30-re200-12500-off-r2.toml","splat\u002Fconfigs\u002F2026-08-30-re200-12500-off-r3.toml","splat\u002Fconfigs\u002F2026-08-30-re200-12500-on-r1.toml","splat\u002Fconfigs\u002F2026-08-30-re200-12500-on-r2.toml","splat\u002Fconfigs\u002F2026-08-30-re200-12500-on-r3.toml",[36,37,38],"splat\u002Fruns-logs\u002Fre200-12500-*.log (メイン series)","splat\u002Fruns-logs\u002Fre200-12500-*-retry.log (r2 pair retry)","splat\u002Fruns-logs\u002Fre200-12500-loadsamples.log \u002F re200-12500-retry-loadsamples.log",[40,41,42],"p3-c2-bubble-attribution","p3-refine-3pass","p2-s3-iteration-pipelining",{"summary":44,"rank":45,"verdict":46,"delta_wallclock":47,"delta_psnr":48},"refine tick 頻度を \u003Ccode>[refine] every\u003C\u002Fcode> 100→200 に変更する hyperparameter 実験 (非 bit-exact、学習 dynamics が変わる)。12.5k Lego n=3 交互 A\u002FB (off=every100 baseline \u002F on=every200 candidate、他の refine パラメータ (\u003Ccode>stop_iter\u003C\u002Fcode> 等) は不変) で、PSNR guard (n=3 で on mean &gt;= off mean - 0.05dB) と最終 splat 数の変化を主眼に計測した。\u003Cstrong>PSNR Δ -0.421dB で guard を約 8.4 倍超過 — 不採用\u003C\u002Fstrong>。wallclock は Δ -25.6% と大幅短縮したが、tick drain 半減 (sync_iters 121→61、期待帯 -1.2〜-1.5% 相当) は寄与のごく一部に過ぎず、大半は densification 予算削減による最終 splat 数 -35% (407.7k→266.7k) の副作用。\u003Ccode>refine.every\u003C\u002Fcode> は tick drain の独立ノブではなく、growth\u002Fclone\u002Fsplit イベント頻度と opacity decay 累積量 (`opacity_decay_rate` は refine cadence で適用) を同時に変える hyperparameter であることが判明した。r2 pair は事前登録条件 (load spike AND 3σ超) を満たし 1 回 retry したが、PSNR guard の判定には影響しない (PSNR は決定論的、load は wallclock のみに影響)。\u003Cstrong>default config の書き換えはしない — 採否はユーザー判断待ち\u003C\u002Fstrong>。","low","rejected","**-25.6%** (12.5k n=3、off mean 126.497s [off-r2 は load 汚染が retry 後も残存、参考値] → on mean 94.063s [on-r2 は retry で clean 値に置換]) — off の clean 2 値のみ (off-r1\u002Fr3 平均 124.92s) を使うと Δ **-24.7%**、いずれにせよ §6 施策 #5 が想定した drain 削減の期待帯 (-1.2〜-1.5%) を遥かに超える。分解すると drain 削減自体はほぼ的中 (sync_iters 121→61 で ~-1.2〜-1.5% 相当) だが、残り約 -23〜24% は最終 splat 数 -35% による rasterize コスト減の副作用","**-0.421 dB** (12.5k n=3、guard `on mean >= off mean - 0.05dB` を約 8.4 倍超過 — 不通過)。3\u002F3 pair で一貫して on &lt; off (-0.361 \u002F -0.544 \u002F -0.397 dB)",[50,53,56,126,128,155,160,162,180,182,202,204],{"type":51,"text":52},"lead","§6 施策 #5 は「refine tick の CPU compact drain (12.5k で 3.0〜3.8s、2.4〜3.1%) は tick 頻度に比例するはずだから、頻度を半減すれば drain も半減し wallclock -1.2〜-1.5% を稼げる」という比較的単純な仮説だった。実測は wallclock こそ大幅に短縮したが、それは狙った効果ではなく、\u003Ccode>refine.every\u003C\u002Fcode> が tick drain と同時に densification 予算・opacity decay 累積量も支配する hyperparameter だったための副作用であり、PSNR guard を大幅に割り込んだ。\u003Cstrong>不採用、default は変更しない\u003C\u002Fstrong>。",{"type":54,"text":55},"heading","1. gate 結果 — 6 run (メイン series、r2 pair は retry 後の値で置換)",{"type":57,"columns":58,"align":65,"rows":68},"table",[59,60,61,62,63,64],"arm","run","train elapsed (s)","PSNR (dB)","final splats","run 窓内 load1",[66,66,67,67,67,66],"left","right",[69,76,83,89,95,101,107,114,120],[70,71,72,73,74,75],"off","off-r1","125.24","36.131","407664","1.11〜3.87 (正常)",[77,78,79,80,81,82],"on","on-r1","93.58","35.770","266474","1.83〜5.90 (正常〜やや上昇、判定閾値 6.0 未満)",[70,84,85,86,87,88],"off-r2","129.65","36.241","408855","**汚染: 2.4〜6.08 spike。retry (132.69s) はさらに悪化 (12.78〜14.33 spike) — 2 回とも汚染、protocol 上 retry は 1 回のみのため元値を採用**",[77,90,91,92,93,94],"on-r2","93.72","35.736","267959","**retry 値を採用 (2.18〜3.44、clean)。原系列 (114.02s) は load1 最大 16.97 の重度汚染で棄却**",[70,96,97,98,99,100],"off-r3","124.60","36.098","407920","1.09〜3.43 (正常)",[77,102,103,104,105,106],"on-r3","94.89","35.701","265540","0.68〜1.13 (正常)",[108,109,110,111,112,113],"**mean (n=3)**","**off**","**126.497** (σ 2.75, 2.17%)","**36.157**","**408146**","off-r2 は load 汚染 2 回とも解消できず、wallclock は参考値扱い",[108,115,116,117,118,119],"**on**","**94.063** (σ 0.72, 0.76%)","**35.736**","**266658**","on-r2 は retry で clean 値に置換済み",[121,122,123,124,125,122],"**Δ**","—","**-25.6%**","**-0.421**","**-34.67%**",{"type":54,"text":127},"2. PSNR guard — 大幅超過、3\u002F3 pair 一貫",{"type":57,"columns":129,"align":134,"rows":135},[130,131,132,133],"pair","off PSNR","on PSNR","Δ",[66,67,67,67],[136,139,143,146,149,153],[137,73,80,138],"r1","-0.361",[140,86,141,142],"r2 (元値のみ、off\u002Fon とも original)","35.697","-0.544",[144,86,92,145],"r2 (on のみ retry 値に置換、off は元値のまま — 本 finding 採用値)","-0.505",[147,98,104,148],"r3","-0.397",[150,111,151,152],"**mean (全て元値)**","**35.723**","**-0.434**",[154,111,117,124],"**mean (r2-on を retry 値に置換、本 finding 採用値)**",{"type":156,"label":157,"variant":158,"text":159},"callout","判定 — 不採用 (PSNR guard 不通過)","warning","guard は「n=3 で on mean &gt;= off mean - 0.05dB」。実測 Δ は -0.421dB で guard を約 8.4 倍超過し、3 pair 全てで一貫して on &lt; off (-0.36〜-0.55dB) — 単一 run のノイズではなく系統的な劣化。同一 config (off-r2) を 2 回実行した際の PSNR 差 (36.241 → 36.137、Δ0.104dB) が本実装のノイズフロアの目安になるが、観測された on\u002Foff 差はその 3.5〜5 倍あり、ノイズでは説明できない。\u003Cstrong>wallclock の大幅な短縮 (Δ -25.6%) はこの PSNR 劣化とセットの副作用であり、単独の高速化施策として採用することはできない\u003C\u002Fstrong>。",{"type":54,"text":161},"3. なぜ wallclock が期待の 17 倍も縮んだか — drain 削減は的中、支配項は densification 予算",{"type":163,"items":164},"kv",[165,168,171,174,177],{"key":166,"value":167},"tick drain のメカニズムは的中","各 run の `sync_iters` (train_loop の refine tick 回数) は off=121、on=61 — ちょうど 100→200 の tick 半減が反映されている。p3-c2 の見積り (3.0〜3.8s \u002F 121 tick ≈ 25〜31ms\u002Ftick) から、60 tick 減で ~1.5〜1.9s の節約 = 126.5s に対し約 -1.2〜-1.5% — \u003Cstrong>§6 施策 #5 が予測した帯にちょうど収まる\u003C\u002Fstrong>",{"key":169,"value":170},"残り約 -24% は別のメカニズム","ms\u002Fiter が off ≈11.8〜12.1 → on ≈9.1〜10.2 に低下している。これは refine tick 頻度そのものではなく、\u003Cstrong>on arm の最終 splat 数が off の約 65% しかない\u003C\u002Fstrong>ことによる rasterize\u002Fbackward コスト減 — splat 数が少なければ 1 iter あたりのラスタライズ・勾配計算コストがほぼ線形に下がる",{"key":172,"value":173},"splat 数が減った理由 (1): densification 予算 (tick 回数律速)","`refine()` (`splat-train-v1\u002Fsrc\u002Frefine.rs:280`) は呼ばれるたびに 1 回、`mean_xy_grad = grad_xy_accum[i] \u002F visible_count[i]` (`refine.rs:332`) を `grad_threshold` と比較して clone\u002Fsplit を判定し (`refine.rs:347-352`)、`n_new = n_kept + n_respawned + 2*n_cloned + 2*n_split` (`refine.rs:404`) で純増分を計算する。`grad_xy_accum`\u002F`visible_count` は tick 間で正規化された平均勾配であり interval 長そのものには (定常分布なら) 依存しないため、1 tick あたりの growth 判定基準自体は every=100\u002F200 で大きくは変わらないはずだが、\u003Cstrong>growth の「発火機会」は tick 単位 (12500 iter で 121 回 vs 61 回) なので、機会が半減すれば累積 growth イベント数もほぼ半減する\u003C\u002Fstrong> — 観測された splat 数 -35% はこの機会減少と整合的 (厳密な比例ではない差は学習後半の分布変化・opacity decay との相互作用によるものと推定、未検証)",{"key":175,"value":176},"splat 数が減った理由 (2): opacity decay の累積量","config.rs:196-200 のコメント通り `opacity_decay_rate` (brush 互換 sigmoid-space decay) は「refine cadence (= every iter) で適用」される。tick 頻度を半減すると、12500 iter を通じて適用される decay の累積回数も半減し、opacity 分布・prune の閾値通過タイミングが変わる — これも splat 数と学習 dynamics に効く",{"key":178,"value":179},"結論","\u003Ccode>refine.every\u003C\u002Fcode> は tick drain 専用の独立ノブではなく、tick cadence に紐づく複数の学習 dynamics (growth 予算・opacity decay 累積) を同時に動かす hyperparameter。§6 施策 #5 の「drain だけを削る」という前提は成立せず、実測は drain 削減効果 (的中) と densification 予算削減の副作用 (未想定、支配的) の合成値になっている",{"type":54,"text":181},"4. r2 pair の load 汚染と retry — 事前登録条件・結果・判断",{"type":163,"items":183},[184,187,190,193,196,199],{"key":185,"value":186},"汚染の発見","series 全体の独立 load sampler (`re200-12500-loadsamples.log`) を run 窓 (`.meta` の pre_date\u002Fpost_date) で切り出したところ、on-r2 の窓内で load1 が 16.97 まで急騰 (baseline 0.8〜2 の 8〜17 倍)。off-r2 の窓内でも 6.08 まで一時的に上昇 (LOAD_LIMIT=6.0 相当、他 run は 1.1〜3.9 圏)",{"key":188,"value":189},"3σ 超過の確認","on 系列の clean 2 値 (on-r1=93.58, on-r3=94.89、平均 94.235、population σ≈0.655) を基準にすると on-r2 (114.02) は約 30σ の外れ値。off 系列も同様の leave-two-out で off-r2 (129.65) は off-r1\u002Fr3 (平均 124.92、σ≈0.32) から約 15σ 外れる — ただし p3-refine-3pass §7 が指摘する「自 arm 内 2 点だけの leave-one-out σ は自己言及的で脆い」罠を踏まないよう、判定の主根拠は load evidence (16.97 という桁違いの spike) に置き、3σ 超過は補強情報として扱った",{"key":191,"value":192},"retry 実施","汚染 pair (off-r2, on-r2) を事前登録条件 (load spike AND 3σ超) に基づき 1 回 retry (`splat\u002Fscripts\u002Fre200-retry-r2.sh`、gate-ab-n.sh は N 固定の全 arm 順序前提のため単一 pair retry には使えず、同じ quiesce\u002FAC check\u002Fmeta 記録プロトコルを縮約した使い捨てヘルパーとして新設)。binary sha256 は retry 時点でも series 全体を通じて `38ca2d6d...` と不変 (HEAD は他 agent の S4b merge で `1c54a0b` に進んでいたが、実行バイナリはリビルドされていない) — retry が別バイナリで走った疑いはない",{"key":194,"value":195},"retry 結果","on-r2-retry は clean (load1 2.18〜3.44) — 元値 (114.02s, PSNR 35.697) を retry 値 (93.72s, PSNR 35.736) に置換。\u003Cstrong>off-r2-retry は逆に悪化 (load1 最大 14.33) — 1 回のみの retry protocol の範囲内で clean 値が得られなかった\u003C\u002Fstrong>。off-r2 は元値 (129.65s) を wallclock 参考値として採用したが汚染残存を明記する",{"key":197,"value":198},"PSNR 判定への影響","PSNR は決定論的な計算経路 (loss\u002Finference) の結果であり load (CPU 側 ambient 負荷) の影響を受けない — off-r2 の元値 (36.241) と retry 値 (36.137) の差 (0.104dB) は本実装のノイズフロア (atomic float 由来の ulp 差、既存方針で tolerance 比較) の範囲内であり、どちらを使っても on\u002Foff Δ が guard を大幅超過する結論は変わらない",{"key":200,"value":201},"ambient の推定原因","同時刻に main HEAD が `f91355e` → `1c54a0b` (別 agent の S4b ssim_reduce merge) に進んでいることを確認済み — 同機上の他 claude セッションによる cargo build\u002Fmerge 作業が load spike の原因である可能性が高い。GPU 自体は本 series 専有だったため (pgrep 空確認済み)、干渉は host 側 CPU 負荷経由と推定",{"type":54,"text":203},"5. 対象外・注意点",{"type":57,"columns":205,"align":208,"rows":209},[206,207],"項目","内容",[66,66],[210,213,216,219],[211,212],"変更していないもの","`[refine] stop_iter` \u002F `opacity_reset_every` \u002F `grad_threshold` \u002F `size_threshold` \u002F `opacity_min` \u002F `split_scale_factor` \u002F `reset_opacity_val` \u002F `max_scale_cap` \u002F `enable_mcmc_respawn` — 全て final-12500 base と同一。差分は `[refine] every` (100→200) の 1 field のみ (`splat check` で 6 config 全て deserialize\u002Fvalidate 済み)",[214,215],"default config","**書き換えていない**。`splat-train-v1\u002Fsrc\u002Fconfig.rs` の `RefineConfig::default()` (`every: 100`) は本 gate では一切変更していない — 採否はユーザー判断待ち",[217,218],"code 変更","**一切なし**。config ファイル 6 本 (`splat\u002Fconfigs\u002F2026-08-30-re200-12500-{off,on}-r{1,2,3}.toml`) と retry 用の使い捨てヘルパー script (`splat\u002Fscripts\u002Fre200-retry-r2.sh`) のみを新設。`splat\u002Fcrates\u002F` 配下の src は無変更",[220,221],"§6 施策 #5 の再評価が必要な場合","本 gate は「drain だけを削る」という前提が成立しないことを示した。候補メカニズムは (a) growth 発火機会が tick 回数 (12500 iter で 121→61 回) に直接律速される (`refine.rs:280,347-352,404`)、(b) `opacity_decay_rate` が refine cadence で累積適用される (`config.rs:196-200`) の 2 つで、本 gate はどちらが支配的かを切り分けていない。仮に再挑戦するなら、(a) 対策として growth の発火機会を iteration 数ベースに正規化する、(b) 対策として `opacity_decay_rate` を tick 頻度の逆数でスケールし累積 decay 量を固定する、の両方を独立に試し、最終 splat 数を baseline (~408k) に固定した状態で drain 削減の純効果 (期待 -1.2〜-1.5%) だけを分離計測できて初めて §6 の仮説を検証したことになる。現状の finding はその前提が崩れていることの記録であり、次の一手は別 task として起票する",[],[224,249,272],{"id":40,"title":225,"date":9,"status":10,"polarity":226,"category":227,"axes":228,"tags":229,"task_code":240,"related_runs":241,"delta_psnr":243,"delta_wallclock":244,"rank":245,"verdict":246,"impact_summary":247,"detail_path":248},"C2 実測 — 残差 bubble は host-late 支配 (7.2〜8.1s)、refine tick drain は A7 で半減済み (3.0〜3.8s)。handoff は定常帯で headroom ほぼ無し","mixed","measurement",[14,15],[230,231,232,233,234,235,236,237,238,22,239],"c2","gap-report","cb-gap","host-lead","drvproc","handoff","residual-bubble","refine-drain","post-m4-a7","measurement-only","C2: 12.5k の残差 bubble 帰属計測と分析",[242],"c2-12500-depth2-prof","n=1 self-eval: 36.068 dB (100 views)。C2 は測定目的の run で PSNR gate 対象ではないが、p3-final-stack の n=3 mean (36.219 dB) からの乖離は n=1 ノイズ帯として妥当な範囲","train elapsed 124.75s (n=1)。p3-final-stack n=3 mean 124.393s (σ0.756%) の guard 内 — profile=true + gap report 計装のオーバーヘッドは計測可能な歪みを生んでいない、と読める","high","residual-is-host-late-dominated \u002F handoff-headroom-thin \u002F refine-drain-already-halved-by-a7","`p3-kernel-share-post-s3.toml` §4\u002F§8 の宿題 (「残差は既存計装では分解不能、実装後も 12.5k 実測がまだ無い」) を、`2026-08-30-c2-12500-depth2-prof.toml` (M4+A7 default 込み、S3 gate arm B と [backend] bit-exact) の 1 run で埋めた。\u003Cstrong>reliable=true \u002F dropped=0 \u002F kernel_invalid=0 \u002F sum\u002Funion=1.000000x\u003C\u002Fstrong> — 信頼性ゲート健全、全列使用可。wall 124.75s \u002F busy 113.627s (91.1%) \u002F sync-tax 11.126〜11.129s は `p3-final-stack` の n=3 mean (124.393s, σ0.756%) の guard 内 (n=1 の点推定として妥当)。\u003Cstrong>Σcb_gap=11.085s が sync-tax 全量の 99.6% を説明\u003C\u002Fstrong>し、`p50×n` (band 別合計 7.244s) と `mean×n` (11.081s) の差 3.837s を refine tick 由来の外れ値と読むと、\u003Cstrong>残差 (通常境界) 7.2〜8.1s (5.8〜6.5%) \u002F refine tick drain 3.0〜3.8s (2.4〜3.1%)\u003C\u002Fstrong> にブラケットできる。refine 側は `ts_refine`(2.869s)+`ts_opacity_decay`(0.185s)=3.054s の独立 host 実測が下限とほぼ一致し、クロスチェックが成立した。\u003Cstrong>旧 3 分解 (refine 6.26s \u002F encode(B) 3.41s \u002F 残差 4.54s、旧 sync-tax 全量 14.206s) との整合\u003C\u002Fstrong>: 旧「残差」+「encode(B)」= 4.54+3.41=7.95s ≈ 新「通常境界」7.24s (wall が 151.70→124.75s に縮んだ分を割り引けば近い) — \u003Cstrong>旧 encode(B) バケツは独立した加算成分ではなく、非重複だった encode コストが host-late として `cb_gap` に同じ形で現れていた\u003C\u002Fstrong>と判明し、旧 3 分解を「refine drain \u002F それ以外 (通常境界)」の 2 分解へ訂正する形になった。\u003Cstrong>帰属の結論: 通常境界の bubble は host-late が支配的、driver 処理 (`drvproc`) と GPU キュー待ち (`handoff`) は定常帯で中央値がほぼゼロ (headroom 薄い)\u003C\u002Fstrong> — task が例示した「handoff → CB 統合」は主因ではないと実測が明示的に否定した。","\u002Ffindings\u002Fp3-c2-bubble-attribution\u002F",{"id":41,"title":250,"date":9,"status":10,"polarity":251,"category":11,"axes":252,"tags":253,"task_code":262,"related_runs":263,"delta_psnr":266,"delta_wallclock":267,"rank":268,"verdict":269,"impact_summary":270,"detail_path":271},"A7 refine 3-pass 削減 — 採用確定 (2026-08-30 gate)","positive",[14,15],[41,254,18,255,256,257,258,22,259,260,261],"a7","scratch-persist","direct-write","alloc-churn","in-flight-invariant","gate-adopted","default-flip","contaminated-series","docs\u002Fstrategy\u002F2026-08-next-phase-tasklist.md Tier2 A7 (refine の 3-pass 削減)",[264,265],"splat\u002Fruns-logs\u002Fa7-12500-*.log (1回目 series、棄却・保存)","splat\u002Fruns-logs\u002Fa7v2-12500-*.log (2回目 series、採用根拠)","+0.0197 dB (12.5k n=3、guard 内。書き込みロジック自体は不変なので理論上の期待通りノイズレベル)","**-2.149%** (12.5k n=3、閾値 max(2σ_off,1%)=1.612%、3\u002F3 pair 一貫)。tasklist 期待帯 -1.3〜-2.6% にちょうど収まる","mid","adopted","A7 (refine の 3-pass 削減) を実装・gate した。(a) \u003Ccode>refine_scratch_persist\u003C\u002Fcode>: compact pass の scratch \u003Ccode>Vec\u003C\u002Fcode> 30 本を \u003Ccode>RefineState\u003C\u002Fcode> (新設 \u003Ccode>RefineScratch\u003C\u002Fcode>) に永続化し \u003Ccode>std::mem::take\u003C\u002Fcode> で借り出し・tick 末尾で書き戻す。allocation の出所が変わるだけで計算は 1 つも変えない。(b) \u003Ccode>refine_direct_write\u003C\u002Fcode>: compact 書き込み先の抽象 \u003Ccode>Dst\u003C\u002Fcode> (\u003Ccode>Vec\u003C\u002Fcode> か Metal buffer 生ポインタ) を導入し、\u003Ccode>direct_write = true\u003C\u002Fcode> のとき新規 \u003Ccode>Vec\u003C\u002Fcode> を一切作らず compact loop が \u003Ccode>param.*\u003C\u002Fcode>\u002F\u003Ccode>adam_state.*\u003C\u002Fcode> に直接書く。実装中に見つけた subtle な罠: Clone の複製先 \u002F Respawn \u002F Split の子スロットは旧実装では「新規 0 埋め \u003Ccode>Vec\u003C\u002Fcode>」から無料で Adam m\u002Fv = 0 を得ていたが、direct 経路は \u003Cstrong>stale データが残っている可能性のある live buffer\u003C\u002Fstrong> に書くため、この暗黙の 0 を前提にできない — \u003Ccode>zero_adam_at\u003C\u002Fcode> ヘルパーで明示的に 0 を書くよう修正した (無修正だと A7(b) 単体で MCMC 論文の「新規 slot は Adam fresh start」不変条件が壊れていた)。不変条件 I (\u003Ccode>[num_splats, capacity)\u003C\u002Fcode> は常に 0) は direct 経路でも \u003Ccode>zero_tail\u003C\u002Fcode> による \u003Ccode>[n_new, n_write)\u003C\u002Fcode> の明示 0 埋めで維持する。\u003Cstrong>gate: 12.5k n=3 交互 A\u002FB (2回目 series、a7v2-12500) で Δ -2.149% (閾値 max(2σ_off,1%)=1.612%)、PSNR +0.0197dB (guard 内)、3\u002F3 pair 一貫 (on&lt;off)。1回目 series は load 汚染 (6 run 中 3 run に load1 スパイク) で棄却\u003C\u002Fstrong>。default flip 実施: \u003Ccode>BackendConfig::default()\u003C\u002Fcode> の両 flag を \u003Ccode>true\u003C\u002Fcode> に変更。field 単独の \u003Ccode>#[serde(default)]\u003C\u002Fcode> は付けない (bool 型に付けると \u003Ccode>bool::default()\u003C\u002Fcode>=false に固定され struct 側の true を上書きするため — \u003Ccode>target_cache\u003C\u002Fcode>\u002F\u003Ccode>shader_fast_math\u003C\u002Fcode> と同じ規約)、これは 1 iter smoke で config 省略時に \u003Ccode>refine_scratch_persist: true, refine_direct_write: true\u003C\u002Fcode> が実際に解決されることを確認済み。\u003Ccode>cargo test --workspace --release\u003C\u002Fcode> 全 pass (0 failed)。","\u002Ffindings\u002Fp3-refine-3pass\u002F",{"id":42,"title":273,"date":274,"status":10,"polarity":251,"category":11,"axes":275,"tags":276,"task_code":286,"related_runs":287,"delta_psnr":298,"delta_wallclock":299,"rank":245,"verdict":300,"impact_summary":301,"detail_path":302},"S3 iteration pipelining depth 2 — 12.5k -18.1% \u002F busy 78 → 91% (default flip)","2026-08-17",[14,15],[277,278,279,280,281,282,283,284,22,285],"1x-roadmap-v2","s3","iteration-pipelining","command-buffer","gpu-busy","sync-tax","double-buffering","scratch-generation","unified-memory","2026-08 1× 工程表 v2 — AC 復帰後 計測 queue #2' (S3 gate)",[288,289,290,291,292,293,294,295,296,297],"s3-smoke-1000-off","s3-smoke-1000-depth2","s3-12500-off-prof","s3-12500-depth2-prof","s3-12500-off-r1","s3-12500-off-r2","s3-12500-off-r3","s3-12500-depth2-r1","s3-12500-depth2-r2","s3-12500-depth2-r3","12.5k **同一 session 交互 A\u002FB** n=3 mean: depth2 **36.202 dB** (36.195 \u002F 36.179 \u002F 36.231) vs off **36.185 dB** (36.178 \u002F 36.192 \u002F 36.186) = **+0.016 dB** (guard 36.167 ± 0.1 の内側、n=3 mean 判定 — n=1 判定なし)。final splats は depth2 406,439 \u002F off 408,874 で **depth2 のほうが 0.6% 少ない** (前段の profile pair では逆に +0.6% で、方向が一致しない = 既存 atomic 非決定性の chaos 増幅の範囲)","12.5k full run **同一 session 交互 A\u002FB n=3 mean: 185.21 → 151.70s = -18.1%** (train elapsed)。process wallclock では **188.33 → 154.00s = -18.2%**。σ は off 3.33% \u002F depth2 1.18% なので有意閾値 max(2σ,1%) = 6.7%、実測 Δ は**その 2.7 倍**。同一 session の off arm は S2 gate 当日の S2 arm (train 184.61s \u002F process 187.65s) を **+0.3% で再現**しており、session の健全性が確認できている。参考: profile=true の 1 対 1 比較では 180.49 → 162.72s = -9.85% (計装自体が host 側 critical path に乗るため S3 の効果を過小評価する)","s3-adopted-default-flip-pipelining-depth2","1× 工程表 v2 が「S2 後の単独本命」に指定していた S3 を gate し、採用した。S2 までの施策が \u003Cstrong>CB の数\u003C\u002Fstrong>を減らすものだったのに対し、S3 は \u003Cstrong>CB の並び方\u003C\u002Fstrong>を変える — iteration N の loss\u002Fbackward CB (B\u003Csub>N\u003C\u002Fsub>) を commit したら wait せずに iteration N+1 の forward CB (F\u003Csub>N+1\u003C\u002Fsub>) を組んで commit し、\u003Ccode>wait(B\u003Csub>N\u003C\u002Fsub>)\u003C\u002Fcode> の後の host readback \u002F \u003Ccode>accumulate\u003C\u002Fcode> を F\u003Csub>N+1\u003C\u002Fsub> の GPU 実行の影に置く。\u003Cstrong>12.5k 同一 session 交互 A\u002FB n=3 で 185.21 → 151.70s = -18.1%\u003C\u002Fstrong> (閾値 max(2σ,1%) = 6.7% の 2.7 倍)。\u003Cstrong>GPU busy 77.5 → 91.3% \u002F sync-tax 3.244 → 1.136 ms\u002Fiter (-65%)\u003C\u002Fstrong> で counter session が置いた「busy 100% = 理論上限」への距離は 22.5 pt → 8.7 pt に縮んだ。\u003Cstrong>1k smoke では busy 65.8 → 72.0% にしか上がらず判定不能だった\u003C\u002Fstrong> — smoke の splat 数 6.8k では forward の GPU 影 (1.06 ms\u002Fiter) が image size 固定の host 仕事 (~1.7 ms\u002Fiter) を隠しきれないためで、これは \u003Cstrong>「pipelining の gate は smoke では代替できない」という harness 上の教訓\u003C\u002Fstrong>として残す。残 bubble の内訳も確定した: \u003Cstrong>refine tick の drain 6.04s (43%) &gt; encode(B) 4.66s (33%) &gt; 残差 3.28s (23%)\u003C\u002Fstrong> — 次の一手が roadmap の「即効ペア (refine capacity スコープバグ修正)」であることが実測で決まった。msplat 同日等価 gap \u003Cstrong>1.105× → 0.907×\u003C\u002Fstrong>、Phase 0 からの累計 766.07 → 154.0s = \u003Cstrong>-79.9%\u003C\u002Fstrong> (全て数学的同値の施策のみ)。","\u002Ffindings\u002Fp2-s3-iteration-pipelining\u002F",1790227327657]