# codex レビュー結果 R2：学習と checkpoint の由来（2026-11-01 依頼 54）

依頼文: docs/review_request_20261101_train_provenance_r2.md（codex exec -s read-only）

**判定：必須3件、推奨2件です。** R1の主な不具合は修正されていますが、時間上限と、開始時に取得できなかった情報の扱いには修正が必要です。

| 項目 | 判定 | 確認結果・修正案 |
|---|---|---|
| 由来処理全体の時間上限 | **必須・R1未完了** | [lab_train.sh:193](/Users/shimazueiichi/r2r2r-scripts/lab_train.sh:193) の`prov_write`全体には上限がありません。PythonとHFを120秒ずつにしても、`prov_spec`によるSTATE読込み・jq・dateなどは制限外です。また[lab_lib.sh:525](/Users/shimazueiichi/r2r2r-scripts/lab_lib.sh:525) は`LAB_HF_UP_TO`で120秒を超えられます。「合計240秒まで」は保証されません。spec生成・書込み・HF追加を含む子処理全体を300秒で包み、結果だけ親へ返してください。Pod削除は先に実行されますが、通知が待たされる問題は残ります。 |
| prepareで指紋取得に失敗した入力 | **必須・追加による問題** | [provenance.py:231](/Users/shimazueiichi/r2r2r-scripts/provenance.py:231) は`fingerprint=null`なら終了時の`build`でも再測定します。一方、prepareで付けた`measured_at`と`fingerprint_error`は保持されます。開始時に読めず終了時に読めた場合、**終了時の指紋に開始時の測定時刻と過去のエラーが付く**記録になります。取得済みスナップショットは失敗も含めて固定するか、再測定時に時刻・エラーを更新し、開始時の測定ではないことを明記してください。 |
| `--stop`で開始情報がない場合 | **必須・R1部分修正** | [lab_train.sh:543](/Users/shimazueiichi/r2r2r-scripts/lab_train.sh:543) でsteps・init・上限・保存済み`prov_start`の復元は直っています。ただし旧STATEやprepare失敗では`prov_start`が空になり、`prov_spec`と`build`が**停止時のコード・入力を新規測定**します。「記録にないものは分からない」というコメントと一致しません。開始時情報を取得できなかった旨を残し、停止時測定は別項目にするか省略してください。 |
| `--stop`でopenpi情報が消える | **推奨** | [lab_train.sh:686](/Users/shimazueiichi/r2r2r-scripts/lab_train.sh:686) で取得した`OPENPI_JSON`はSTATEに保存されません。別プロセスの`--stop`では初期値`[]`となり、取得済みのcommit・dirtyも失われます。取得後にSTATEへ保存して復元し、旧STATEでは「不明」を明示してください。 |
| prepare関連の回帰テスト | **推奨** | 追加テストは正常なスナップショット復元を確認していますが、上記の失敗経路は押さえていません。「prepare全体の失敗」「入力単位の指紋取得失敗→終了時に復旧」「旧STATEでのstop」「HF時間上限の環境変数指定」を追加すると有効です。 |
| `HFUP same`で過去の由来が混入 | **据え置き・R1修正済み** | [lab_train.sh:439](/Users/shimazueiichi/r2r2r-scripts/lab_train.sh:439) で今回作成した一時フォルダ内の旧由来を除去しています。既存1499には触れず、今回の由来を配置する流れです。fakeと比較テストも追加されています。 |
| `TRAIN_DONE`によるcompletedの範囲 | **据え置き・R1修正済み** | `wrap_success`は終了コード0・最終step一致・完了メタデータありを確認してから呼ばれ、その先頭で`TRAIN_DONE=1`になります。準備失敗をcompletedにする経路は見当たりません。完了後の一覧取得失敗はcompleted＋errorになります。 |
| openpiの部分取得 | **据え置き・R1修正済み** | commit・status両方の成功後に完了マーカーを出し、SSH終了コードも確認しています。途中切断をcleanとする元の問題は解消しています。 |
| 辞書キー・設定内容・境界処理 | **据え置き・R1修正済み** | 辞書キーも伏字対象になり、configの内容SHA256、NFC衝突検出、リンク・staged・renameのテストが追加されています。 |
| 終了コード・trap・Pod削除 | **据え置き** | `finish`は終了コードをローカル変数に保存し、`set -e`もないため、通常の由来処理失敗で終了コードは変わりません。成功・失敗ともPod削除を試みた後に由来処理へ進みます。追加箇所に明白な`set -u`違反は見当たりません。時間上限は上記の修正が必要です。 |
| 鍵・PodのIP／ポート | **据え置き** | 現在のspecにIP・ポートを直接渡す経路は見当たりません。鍵は引数・既知プレフィックス・secret-fileの内容・辞書キーまで伏字対象です。現在の呼出経路で明白な漏えいは確認していません。 |
| 既存KIOXIA・未マウント時 | **据え置き** | `PROV_CKPT_DIR`は新規配置の最終照合成功後だけ設定されます。由来書込みは`O_EXCL`、フォルダ作成なし。由来処理から既存checkpoint・datasets・runsへ追記する通常経路は見当たりません。 |
| HF互換性・dirty対象 | **据え置き** | リモート比較とKIOXIA比較の由来除外は整合しています。`lab_start.sh`の取得・利用経路にも、JSON追加による破綻は見当たりません。dirtyを指定4パスに絞る方針も妥当です。 |
| `.DS_Store`・由来配置前の指紋 | **据え置き・仕様判断待ち** | 現行files-v1の仕様どおりです。Finder操作や由来配置後に再測定すると一致しないため、②③へ展開する前に検証手順を固定してください。除外規則を変える場合は指紋バージョンも更新するのが適切です。 |

読み取りによるレビューです。テスト本体は書込み・プロセス操作を伴うため実行しておらず、**27件（1 skip）・OK 173／NG 0は未追試**です。ファイル変更、実機・Pod・Hugging Faceの操作は行っていません。

## 反映（Claude Code）
- 必須（全体の時間）: prov_write の中身（spec・書く・Hugging Face）を子のシェルで流し、全体を PROV_TO=300 秒で待つ。過ぎたら子孫ごと TERM→KILL して通知へ進む。LAB_HF_UP_TO はやめ 120 秒に固定。Hugging Face が返らない偽物（hf_prov_hang・LAB_PROV_TO=5）で確かめる
- 必須（prepare で読めなかった入力）: prepare で測ったもの（measured_at がある）は、指紋が null でも build で測り直さない（config の sha256 も）。test_provenance.py に足す
- 必須（--stop で始めたときの記録がない）: 止めた今のコード・入力を測らず、code.commit・入力の指紋を null にして「始めたときの記録がない (--stop)」と書く
- 推奨（--stop の openpi）: 読んだ openpi を lab_pod.json に残し、--stop で戻す。記録になければ「記録にない (--stop)」
- 推奨（テスト）: 上の4つのテストを足した（test_provenance.py 28 件・test_lab_train.sh OK 177 / NG 0）
