# コードレビュー結果：補正データの止まりを詰める・続きからの学習の設定（codex・2026-10-31 / 依頼 48）

- 実施: codex exec -s read-only --skip-git-repo-check（読み取りのみ）
- 依頼文: docs/review_request_20261031_trim_hold_resume_lr.md

**必須1件、推奨3件です。** A は model 区間の低速移動を消しすぎる穴があります。B の通常経路では、設定・正規化値の配置に問題は見つかりませんでした。

| 項目 | 判定 | 確認結果・修正案 |
|---|---|---|
| A：model 区間のずれ保護 | **必須** | [build_correction_episodes.py:268](/Users/shimazueiichi/r2r2r-scripts/pi05/build_correction_episodes.py:268)：0.5°を超えて数え直しても、`k=0` なので新しい区間の先頭も削除されます。**0.2°ずつ動く30コマ**を入力すると、`hold_keep_mask` は両端だけを残し、元の0.2°刻みが**5.8°の1ステップ**になります。静止の削除と低速移動の保護を分け、累積ずれで区切った位置では model でも姿勢を残してください。全 keep 値が2の場合の互換性も維持してください。 |
| A：低速移動のテスト | **推奨** | [test_trim_hold.py:93](/Users/shimazueiichi/r2r2r-scripts/pi05/test_trim_hold.py:93) は「model でも消えすぎない」と説明していますが、model の残存数・最大跳びを検証していません。上の不具合がある状態でも成功します。model の低速移動について、経路の残存と圧縮後の最大角度差を直接検証してください。 |
| A：爪の前後 | 据え置き | 連続 idle 区間が爪指令の直前で終わる／直後で始まる場合、区間全体に `keep_grip=2` が適用されます。ずれで数え直した区間も2コマとなり、guard・両端保護を含め trim2 と同じ扱いです。 |
| A：先頭モードによる分類 | 据え置き | 指定どおり、連続 idle 区間の先頭モードで残す数を決め、ずれによる再分割後も同じ数を使います。区間内で model→correct に変わっても再判定しません。仕様には一致していますが、上の低速移動保護は別途必要です。 |
| A：state / actions の接続 | 据え置き・条件付き | 関節6列は選択後の次の state で再生成され、配列上の接続は保たれます。爪列は元の次指令を維持し、切り替え周辺も保護されます。ただし、**次の state と一致することは、つなぎ目の跳びが小さいことを保証しません**。上の必須事項が該当します。 |
| A：既定動作・meta | 据え置き | `--trim-hold` なしは従来経路です。`--no-trim-mid-idle` との併用はCLIで拒否し、有効時の keep 値をmetaへ記録します。 |
| B：正規化値の配置先 | 据え置き | ローカル openpi の実装では `assets_dirs=assets/<設定名>`、既定の `asset_id=repo_id` です。`cd "$OPENPI"` 後の配置先は一致します。追加設定にも assets の上書きはありません。[公式実装](https://github.com/Physical-Intelligence/openpi/blob/main/src/openpi/training/config.py)とも整合します。 |
| B：params からの継続学習 | 据え置き | weight loader は重みを読み、optimizer・学習ステップは新規初期化されます。正規化値はデータ設定から別に読むため、trim2 の値を配置する方式で問題ありません。warmup 100 も新しい学習の先頭から適用されます。[公式実装](https://github.com/Physical-Intelligence/openpi/blob/main/scripts/train.py) |
| B：checkpoint に保存される値 | 据え置き・条件付き | 読み込んだ正規化値は、新 checkpoint の `assets/local/<corr_v3データ名>/norm_stats.json` に保存されます。統計値はtrim2と同じです。ただし**JSONを読み直して再シリアライズするため、保存後のファイルのSHA一致までは保証しません**。[公式実装](https://github.com/Physical-Intelligence/openpi/blob/main/src/openpi/training/checkpoints.py) |
| B：置き換え・旧版拒否 | 据え置き | 初回追加では学習率3か所を各1件確認して置換し、`decay_lr=5e-6` の存在も確認します。corr_v1／corr_v2の既定マーカーがあれば書き込み前に停止します。同じsteps/initでの再実行は追加しません。 |
| B：再実行時の設定検証 | **推奨** | [add_trim_corr_config.py:90](/Users/shimazueiichi/r2r2r-scripts/pi05/openpi_addon/add_trim_corr_config.py:90)：既存corr_v3を認める際はsteps/initしか確認しません。repo_idや学習率を変更された設定でも `already installed` になります。既存ブロックでもデータ名・学習率4値を検証し、不一致なら停止することを勧めます。 |
| B：Pod準備・SHA・再実行 | 据え置き | `set -euo pipefail` があり、コピー前後に固定SHAを照合します。Macの実ファイルとのSHA一致も確認できました。一時ディレクトリへ展開後に置き換えるため、前回指摘の旧エピソード残存は解消しています。同一引数での逐次再実行は可能です。 |
| B：シェルのテスト範囲 | **推奨** | `TestPodPrep` は文字列・構文・Mac側SHAの確認です。コピー前後の不一致で本当に停止すること、失敗後の再実行、更新tarで旧ファイルが残らないことは未検証です。これらの動作テストを追加すると手順の保証が強まります。 |

読み取りとメモリ内の検証のみ実施しました。`test_trim_hold.py` **5件成功**、`TestPodPrep` **4件成功**です。`test_merge_and_config.py` の残り9件は一時ファイルを書き込むため実行せず、コードを確認しました。

ファイル変更・実機操作はしていません。申告されたcorr_v3の726コマ・停止率20.1%などの集計は再検証していません。
