# 結果：20261101_54_学習とcheckpointに由来を記録する

- 状態：完了
- 始めた時刻：2026-11-01 10:09
- 終わった時刻：2026-11-01 10:54（45分）
- 作業フォルダ：/Users/shimazueiichi/r2r2r-scripts
- この続きを Claude Code で話すとき：作業フォルダで `claude --resume b0ff554c-0fbd-46ab-b3dd-4aafa20c4e17`

## Claude Code の報告

**やったこと**
- 依頼52が「済み」にあり、コミット eb491c5 に入っているのを確かめてから始めました。
- 共通の部品 `provenance.py` を作りました。指紋（files-v1）を作る、コードの変更の有無を見る、始める時点に測る、由来を作る、書く、の5つで、bash からも Python からも使えます。
  - 鍵は伏せます。置く先にもうファイルがあれば上書きせず、フォルダも作りません。
- lab_train.sh に組み込みました。
  - 0. で、始める時点のコードと、入力3つ（学習データ・続きから学習する 3999・add_trim_config.py）の指紋を測ります。
  - 3f のあと、Pod の openpi のコミットと変更を読みます。
  - 終わったら `lab/LogNN/train/train_provenance.json` に置きます。成功・失敗・止めた・借りられなかった・--stop のどれでも置きます。
  - 今回 KIOXIA に新しく置いた checkpoint と、今回上げた Hugging Face のリポジトリにも同じものを置きます。
  - 由来の処理は全体を300秒で打ち切ります。失敗しても、学習の片付け・終了コード・通知は変えません。
- 置き場所: `provenance.py` は r2r2r-scripts 直下にしました。②③は直下からも pi05/ からも呼ぶためです。
- ②③での呼び方:
  - Python: `import provenance; start = provenance.prepare({"inputs":[...]}, data_root=...)` で始める前に測り、終わったら `provenance.write(provenance.build({**start, "status":{...}, ...}, data_root=...), "<出力>/dataset_provenance.json")`
  - bash: `python3 provenance.py write --data-root /Volumes/KIOXIA/r2r2r-data --out <置く先> < spec.json`
- Hugging Face にも入れられました。比べるときに由来のファイルを数えないよう、`hf_upload_ckpt.py` と KIOXIA 側の比べを直しました。そのままだと、次の回や取り直しで「別の中身がある」として止まるためです。前からある同じ中身のリポジトリ（same）には足しません。
- codex のレビューを5回通しました。必須は R1 5件 → R2 3件 → R3 1件 → R4 1件 → R5 0件で、依頼文と結果は `docs/` にあります。
- 既存の checkpoint・データセット・runs（`pi05_mecharm_trim_corr_lora_v1/1499` を含む）には書き足していません。本物の Pod は借りていません。

**結果**
- test_provenance.py 30件（OK、1件 skip。この Mac では名前の字形の違うファイルが同じ名前とみなされるため）
- test_lab_train.sh 177件（OK、NG 0）
- test_lab_start.sh 128件（OK、NG 0）
- pi05 の各テストも全部 OK（test_hf_upload_ckpt.py は「Hugging Face に由来があっても同じ中身とみなす」を足して10件）
- 足した確かめ: 成功・途中で止まる・上限・Ctrl-C/TERM・--stop・KIOXIA が外れる・dirty のときとそうでないとき、など。KIOXIA が外れたときは、由来を書かずに最後まで片付けて通知します。
- 偽物の実行で出た JSON の例（`docs/example_train_provenance_dryrun_20261101.json`。長い部分は省いています）:

{"schema_version":"provenance/1","created_at":"2026-11-01T10:53:43+09:00",
 "producer":{"script":"lab_train.sh","argv":["--log","Log18","--dry-run"],"machine":"shimadzueiichinoMacBook-Pro.local","dry_run":true},
 "code":{"repo":"r2r2r-scripts","commit":"eb491c5a…","dirty":true,"dirty_files":["lab_lib.sh","lab_train.sh","pi05/build_demo_episodes.py.bak_pre_LOG352_20261019",…],"diff_sha256":"478ee7eb…","measured_at":"2026-11-01T10:53:41+09:00","paths":["lab_train.sh","lab_lib.sh","provenance.py","pi05"]},
 "external_code":[{"name":"openpi","commit":"215abfb1…","dirty":true,"dirty_files":["src/openpi/training/config.py",…],"expected_commit":"215abfb"}],
 "inputs":[{"kind":"dataset","id":"mecharm_redblock_box_teach_v1_trim2_corr_v3","path":"datasets/mecharm_redblock_box_teach_v1_trim2_corr_v3","fingerprint":"files-v1:1c95b870…"},
  {"kind":"checkpoint","id":"pi05_mecharm_trim_lora_v1/3999","path":"checkpoints/pi05_mecharm_trim_lora_v1/3999","fingerprint":"files-v1:262027fc…","hf_repo":"PixelstoMotors/pi05-mecharm-trim-lora-v1"},
  {"kind":"config","id":"add_trim_config.py","path":"lab/Log11/pod/add_trim_config.py","fingerprint":"files-v1:c30584c2…","sha256":"807fd6eb…"}],
 "outputs":[{"kind":"checkpoint","id":"pi05_mecharm_trim_corr_lora_v1/1499","path":"checkpoints/pi05_mecharm_trim_corr_lora_v1/1499","fingerprint":"files-v1:8071f264…","hf_repo":"PixelstoMotors/pi05-mecharm-trim-corr-lora-v1"}],
 "config":{"name":"pi05_mecharm_trim_corr_lora","exp_name":"trim_corr_v3","num_train_steps":1500,"init_params":"/workspace/ckpt/3999/params","limit_hours":5},
 "compute":{"provider":"runpod","gpu":"NVIDIA A40","started_at":"…","ended_at":"…","duration_sec":2,"cost_per_hr_usd":0.44,"cost_usd":0,"cost_line":"借りていた時間 0 分 2 秒 … 約 0.00 ドル (約 0 円. 1ドル=158円)"},
 "numbering":{"series":"フィジカルAI研究室","series_log":"Log18","article_no":""},
 "status":{"process":"completed","task":"not_applicable"}}

- 今のままだと code.dirty は毎回 true になります。本物の学習でも、pi05/ にある git に入っていない `build_demo_episodes.py.bak_pre_LOG352_20261019` が数えられるためです。pi05/ は丸ごと Pod へ送るので、数えるのが正しい扱いです。

**変えたファイル**
- 新しく作ったもの: provenance.py・test_provenance.py
- 直したもの: lab_train.sh・lab_lib.sh（Mac から Hugging Face へファイルを1つ上げる関数を足した）・lab_train_fakes.sh・test_lab_train.sh・pi05/openpi_addon/hf_upload_ckpt.py・pi05/test_hf_upload_ckpt.py
- 記録: docs/review_request_20261101_train_provenance*.md（5つ）・docs/review_result_20261101_train_provenance_codex*.md（5つ）・docs/example_train_provenance_dryrun_20261101.json・logs/20261101_*.md
- コミット: 1902f37（本体）・cadd53d（作業の記録）。どちらも個別にファイルを指定して add しました。

**決めてほしいこと**
1. 12節の写し: data_manifest_rules.md の12節は手元のファイル（r2r2r-content/methodology/）にありませんでした。依頼文に写された要点で作ったので、Project の12節と食い違いがないか見てください。
2. .DS_Store: 依頼どおり指紋に数えています。そのため、Finder でフォルダを開くだけで指紋が変わります。数えないことにするなら、指紋を files-v2 にするのがよいと思います（codex も同じ意見）。
3. 出力（checkpoint）の指紋: 由来のファイルを置く前に測っています。置いたあとに同じフォルダを測り直すと合いません。由来のファイルを数えないことにするかどうか。
4. series_log: 今は "Log18" の形で入れています。数字だけ（18）にするかどうか。
5. 書きかけの JSON: 書いている途中で強制終了されたときだけ、書きかけの JSON が残ることがあります。②③で読む側が、読めない由来をどう扱うか（飛ばす・失敗として扱う、など）。
