docs: archive idle historical verification stages to Drive

This commit is contained in:
Takeshi
2026-10-15 20:01:14 +09:00
parent 57131ec616
commit 3f02b41f76
18 changed files with 343238 additions and 0 deletions
@@ -0,0 +1,9 @@
{
"whole_archive_sha256": "f2df2e09202e12b38e8ea29529ec2191fde7d626b4e72b45df8458d86dcd0a8d",
"bytes": 116267401,
"all_unique_payloads_verified": 2127,
"original_file_mappings_verified": 36328,
"manifest_identical": true,
"actual_cloud_readback": true,
"formal_credit": 0
}
@@ -0,0 +1,118 @@
[
{
"order": 0,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0000",
"bytes": 33554432,
"sha256": "8206248a3039eeaece428eb7d485177c301f98dae6a01c6686e9805b2dfe2c03",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "149Z-A_PlFo5M0_LIwsyJnpS9R_cczQwF",
"title": "cold-stages-r03.tar.gz.part-0000",
"file_name": "cold-stages-r03.tar.gz.part-0000",
"mime_type": "application/x-gzip",
"url": "https://drive.google.com/file/d/149Z-A_PlFo5M0_LIwsyJnpS9R_cczQwF/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "149Z-A_PlFo5M0_LIwsyJnpS9R_cczQwF",
"title": "cold-stages-r03.tar.gz.part-0000",
"file_name": "cold-stages-r03.tar.gz.part-0000",
"mime_type": "application/x-gzip",
"url": "https://drive.google.com/file/d/149Z-A_PlFo5M0_LIwsyJnpS9R_cczQwF/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"readback_sha256": "8206248a3039eeaece428eb7d485177c301f98dae6a01c6686e9805b2dfe2c03",
"readback_bytes": 33554432,
"verified": true
},
{
"order": 1,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0001",
"bytes": 33554432,
"sha256": "46e1a88b593212442899be5f38f40637a24a973ca580dfa7f3ecee65c46991dc",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1dnOLHwwTkmReV_BEx2ptDobmpcty572H",
"title": "cold-stages-r03.tar.gz.part-0001",
"file_name": "cold-stages-r03.tar.gz.part-0001",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1dnOLHwwTkmReV_BEx2ptDobmpcty572H/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1dnOLHwwTkmReV_BEx2ptDobmpcty572H",
"title": "cold-stages-r03.tar.gz.part-0001",
"file_name": "cold-stages-r03.tar.gz.part-0001",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1dnOLHwwTkmReV_BEx2ptDobmpcty572H/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"readback_sha256": "46e1a88b593212442899be5f38f40637a24a973ca580dfa7f3ecee65c46991dc",
"readback_bytes": 33554432,
"verified": true
},
{
"order": 2,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0002",
"bytes": 33554432,
"sha256": "366eccfda24086d0cb0b386669838e92645c15e23719b3f2cd7db06e0e00c3c4",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1LnIGzSKyXqwxGV2EFhM4CfUy9krQSTp9",
"title": "cold-stages-r03.tar.gz.part-0002",
"file_name": "cold-stages-r03.tar.gz.part-0002",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1LnIGzSKyXqwxGV2EFhM4CfUy9krQSTp9/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1LnIGzSKyXqwxGV2EFhM4CfUy9krQSTp9",
"title": "cold-stages-r03.tar.gz.part-0002",
"file_name": "cold-stages-r03.tar.gz.part-0002",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1LnIGzSKyXqwxGV2EFhM4CfUy9krQSTp9/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"readback_sha256": "366eccfda24086d0cb0b386669838e92645c15e23719b3f2cd7db06e0e00c3c4",
"readback_bytes": 33554432,
"verified": true
},
{
"order": 3,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0003",
"bytes": 15604105,
"sha256": "ef477319e3f2036874ab9c4de069ce055bff1bf45b746100c442d7c808008ad8",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1DI9jSB5yGlzJpXC1H6tLUhqqQ8eQM8Ga",
"title": "cold-stages-r03.tar.gz.part-0003",
"file_name": "cold-stages-r03.tar.gz.part-0003",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1DI9jSB5yGlzJpXC1H6tLUhqqQ8eQM8Ga/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1DI9jSB5yGlzJpXC1H6tLUhqqQ8eQM8Ga",
"title": "cold-stages-r03.tar.gz.part-0003",
"file_name": "cold-stages-r03.tar.gz.part-0003",
"mime_type": "application/octet-stream",
"url": "https://drive.google.com/file/d/1DI9jSB5yGlzJpXC1H6tLUhqqQ8eQM8Ga/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"readback_sha256": "ef477319e3f2036874ab9c4de069ce055bff1bf45b746100c442d7c808008ad8",
"readback_bytes": 15604105,
"verified": true
}
]
@@ -0,0 +1,76 @@
{
"recorded_at": "2026-10-15T11:00:52.041589+00:00",
"recorded_unix": 1792061992.562457,
"files": 36328,
"logical_bytes": 1833310564,
"allocated_sum": 1949585408,
"cloud_archive_bytes": 116267401,
"free_before_selection": 3406475264,
"free_before_retirement": 2905726976,
"free_after": 3991207936,
"original_files_and_parent_evidence_reverified": true,
"actual_cloud_readback_all_payloads_verified": true,
"retired_only_manifest_members": true,
"temporary_archives_removed_after_verification": true,
"roots": [
"p05-acceptance-partial-r06/stages",
"p23-03-native-impact-19fc3f5-r01/stage",
"p23-03-component-impact-19fc3f5-r01/stage",
"p23-03-final-regression-49445d4-r01/stage",
"p08-03-native-os-r09/stage",
"p08-03-native-os-fd643f5-r10/stage",
"p08-03-native-f5f85ae-r16/stage",
"p08-03-final-regression-f5f85ae-r01/stage",
"p08-03-final-regression-fd643f5-r01/stage",
"p03-midpoint-restart-r03/stages",
"p03-midpoint-restart-r04/stages",
"p03-midpoint-restart-r05/stages",
"p03-formal13-ui-to14-final-r01/stages",
"p03-formal13-ui-to14-final-r02/stages"
],
"formal_credit": 0,
"current_free_bytes": 4061999104,
"net_observed_free_increase_bytes": 655523840,
"protected_current_proof": [
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p08-03-native-os-d369d1c-r19-calibrated/index.json",
"sha256": "fc66a95ab228e70fd1e1aa40b92f8cb6890f8c9879c2be79940e969cb9a3521b",
"unchanged": true
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p08-03-native-d369d1c-r17/index.json",
"sha256": "16c3577ca226173fea65df8595ab42a8b257ba50166da1a8564e6eda126694a1",
"unchanged": true
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p08-03-final-regression-d369d1c-r01/runner-ended.json",
"sha256": "0dbe71e589113088bd37be42fef583b8f6da86a15542f4900ed97fa957fc1264",
"unchanged": true
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-03-native-os-49445d4-r13/index.json",
"sha256": "c0cc9e939845b5f3ae8375d414327821eb75c3e5f5158ae32eb872eda1b99a03",
"unchanged": true
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-03-final-regression-9a26f9a-r01/runner-ended.json",
"sha256": "dfd4187b1c3d2869deacb57c95e41af8b698f70663452fd6e27dc154683f5856",
"unchanged": true
}
],
"workers": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p23-03-code/P23-03-implement",
"sha": "9a26f9ab8c6691ba3cbe32ac4bc4525f4a9c7106",
"clean": true
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-03/P13-03-implement",
"sha": "bd3a97ec741ddb2346d0c2b2e0472c978927ce82",
"clean": true
}
],
"sharing_changed": false,
"cloud_folder_url": "https://drive.google.com/drive/folders/1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"note": "Original logical bytes and allocated sum are not physical free-space gain. APFS shared extents and concurrent OS changes affect the measured net increase. Prior offload totals are historical and are not counted as this batch."
}
@@ -0,0 +1,11 @@
# 証跡退避・追加実施結果
Drive退避先: https://drive.google.com/drive/folders/1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK
- 今回追加: 旧版検証ソース複製14か所、36,328ファイル、1,833,310,564バイト。現行候補・実装作業場所・試験結果・画像・保存・終了記録は保持。
- SHA-256による重複排除後2,127データ。Driveの圧縮アーカイブ116,267,401バイト、4分割。
- 全4片の実ダウンロード、全体SHA、全2,127内部データ、全36,328ファイル対応表を検証。復元資料5点も実ダウンロードで一致。元ファイル全件を削除直前に再照合し、manifestにあるファイルだけを削除。
- 作業前の空き3,406,475,264バイト → 最終実測4,061,999,104バイト(3.78GiB)。観測純増0.656GB。APFS共有領域・OSの並行変化があるため、論理退避量を空き増加として扱わない。
- P08と旧P23の保護4点、最新9a26f9a全回帰終了記録の固定SHAが一致。P13/P23の実装作業場所は同じコミットでclean。
- 各元フォルダにCLOUD_STAGE_ARCHIVE_R03.jsonを保持。Driveの分割順・SHAはCLOUD_PARTS.json、復元はRESTORE.mdとrestore.pyを使用。後日、旧stageを再実行する場合だけ復元する。
- 過去の20バッチ・約11.68GB退避とは分けた追加記録。今回のゲーム成果単位の完了加点は0。
@@ -0,0 +1,35 @@
{
"format": "content-addressed-tar-v1",
"archive": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz",
"archive_bytes": 116267401,
"archive_sha256": "f2df2e09202e12b38e8ea29529ec2191fde7d626b4e72b45df8458d86dcd0a8d",
"parts": [
{
"order": 0,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0000",
"bytes": 33554432,
"sha256": "8206248a3039eeaece428eb7d485177c301f98dae6a01c6686e9805b2dfe2c03"
},
{
"order": 1,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0001",
"bytes": 33554432,
"sha256": "46e1a88b593212442899be5f38f40637a24a973ca580dfa7f3ecee65c46991dc"
},
{
"order": 2,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0002",
"bytes": 33554432,
"sha256": "366eccfda24086d0cb0b386669838e92645c15e23719b3f2cd7db06e0e00c3c4"
},
{
"order": 3,
"path": "/private/tmp/tree-offload-cold-stage-r03/cold-stages-r03.tar.gz.part-0003",
"bytes": 15604105,
"sha256": "ef477319e3f2036874ab9c4de069ce055bff1bf45b746100c442d7c808008ad8"
}
],
"unique_payloads": 2127,
"source_unchanged": true,
"all_members_verified": true
}
@@ -0,0 +1,26 @@
{
"file": "CLOUD_PARTS.json",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1Lkbpz9eEinYiS0uEYnal11HsetSleDoH",
"title": "cold-stages-r03-CLOUD_PARTS.json",
"file_name": "cold-stages-r03-CLOUD_PARTS.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1Lkbpz9eEinYiS0uEYnal11HsetSleDoH/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1Lkbpz9eEinYiS0uEYnal11HsetSleDoH",
"title": "cold-stages-r03-CLOUD_PARTS.json",
"file_name": "cold-stages-r03-CLOUD_PARTS.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1Lkbpz9eEinYiS0uEYnal11HsetSleDoH/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"bytes": 5075,
"sha256": "88beaaf600f462d5ae36756002004ada03e234a042b57c6b2800d7c86f251a54",
"actual_cloud_readback_verified": true
}
@@ -0,0 +1,26 @@
{
"file": "MANIFEST.json",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1NsbB3PEp0DVGiwVpamp6unfmlLN48s74",
"title": "cold-stages-r03-MANIFEST.json",
"file_name": "cold-stages-r03-MANIFEST.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1NsbB3PEp0DVGiwVpamp6unfmlLN48s74/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1NsbB3PEp0DVGiwVpamp6unfmlLN48s74",
"title": "cold-stages-r03-MANIFEST.json",
"file_name": "cold-stages-r03-MANIFEST.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1NsbB3PEp0DVGiwVpamp6unfmlLN48s74/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"bytes": 12535524,
"sha256": "78bfddcaa7c3ab85861fe4ef82babb262bcd4a01dfb192a93dec9d5d057ff444",
"actual_cloud_readback_verified": true
}
@@ -0,0 +1,26 @@
{
"file": "PREPARED.json",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1OW7SXiEgLyX0iidGbf0DvvLWBXHd5ITH",
"title": "cold-stages-r03-PREPARED.json",
"file_name": "cold-stages-r03-PREPARED.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1OW7SXiEgLyX0iidGbf0DvvLWBXHd5ITH/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1OW7SXiEgLyX0iidGbf0DvvLWBXHd5ITH",
"title": "cold-stages-r03-PREPARED.json",
"file_name": "cold-stages-r03-PREPARED.json",
"mime_type": "application/json",
"url": "https://drive.google.com/file/d/1OW7SXiEgLyX0iidGbf0DvvLWBXHd5ITH/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"bytes": 1265,
"sha256": "0152096318fd652956372c2a8642f651f4b772f339b8c0b3d25b3192e431edfb",
"actual_cloud_readback_verified": true
}
@@ -0,0 +1,26 @@
{
"file": "RESTORE.md",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "1Z53G1Q4nsCodIrQGCLI6kLfzcqO3AK6i",
"title": "cold-stages-r03-RESTORE.md",
"file_name": "cold-stages-r03-RESTORE.md",
"mime_type": "text/markdown",
"url": "https://drive.google.com/file/d/1Z53G1Q4nsCodIrQGCLI6kLfzcqO3AK6i/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1Z53G1Q4nsCodIrQGCLI6kLfzcqO3AK6i",
"title": "cold-stages-r03-RESTORE.md",
"file_name": "cold-stages-r03-RESTORE.md",
"mime_type": "text/markdown",
"url": "https://drive.google.com/file/d/1Z53G1Q4nsCodIrQGCLI6kLfzcqO3AK6i/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"bytes": 1275,
"sha256": "0ef45440cbf1ba633d979796e3aa70a0212c65918de4a882d5968115c0bb094a",
"actual_cloud_readback_verified": true
}
@@ -0,0 +1,26 @@
{
"file": "restore.py",
"cloud": {
"accepted_input": "file_uri",
"success": true,
"id": "10V61yHrC2yXJgU5FfevVg5vBsWx1leBu",
"title": "cold-stages-r03-restore.py",
"file_name": "cold-stages-r03-restore.py",
"mime_type": "text/plain",
"url": "https://drive.google.com/file/d/10V61yHrC2yXJgU5FfevVg5vBsWx1leBu/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "10V61yHrC2yXJgU5FfevVg5vBsWx1leBu",
"title": "cold-stages-r03-restore.py",
"file_name": "cold-stages-r03-restore.py",
"mime_type": "text/plain",
"url": "https://drive.google.com/file/d/10V61yHrC2yXJgU5FfevVg5vBsWx1leBu/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"bytes": 1288,
"sha256": "9e5fae33042236e7c863931f6731c8867d89c075d14d28fd45571ee844ccdc4f",
"actual_cloud_readback_verified": true
}
@@ -0,0 +1,9 @@
# 旧版検証用ソース複製14か所の復元
Driveの既存非公開退避フォルダ: https://drive.google.com/drive/folders/1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK
CLOUD_PARTS.jsonのorder順に各ファイルをダウンロードし、各partのbytesとsha256を確認する。数値順にバイト連結したcold-stages-r03.tar.gz全体をPREPARED.jsonのarchive_sha256と照合する。このアーカイブは内容アドレス方式で、MANIFEST.jsonとobjects/<SHA-256>を含む。直接tar展開しただけでは元のstage構成にならない。
同梱restore.pyを `python3 restore.py cold-stages-r03.tar.gz /復元先` で実行する。元に戻す場合の復元先は制作リポジトリのartifacts/original-completion-2026-10-02。既存ファイルへの上書きは拒否する。空の別ディレクトリを使えば安全に復元を確認できる。全ファイルのSHA・サイズを照合し、パス・権限・更新日時を復元する。
対象はMANIFEST.jsonに列挙した旧検証stage/stagesのみ。実行結果・画像・保存・終了記録・現行作業場所・現行候補の証拠は残す。旧版のstageを使う再実行は、復元を完了してから行う。退避によるゲーム完成の加点はない。
@@ -0,0 +1,31 @@
{
"recorded_unix": 1792061992.562457,
"files": 36328,
"logical_bytes": 1833310564,
"allocated_sum": 1949585408,
"cloud_archive_bytes": 116267401,
"free_before_selection": 3406475264,
"free_before_retirement": 2905726976,
"free_after": 3991207936,
"original_files_and_parent_evidence_reverified": true,
"actual_cloud_readback_all_payloads_verified": true,
"retired_only_manifest_members": true,
"temporary_archives_removed_after_verification": true,
"roots": [
"p05-acceptance-partial-r06/stages",
"p23-03-native-impact-19fc3f5-r01/stage",
"p23-03-component-impact-19fc3f5-r01/stage",
"p23-03-final-regression-49445d4-r01/stage",
"p08-03-native-os-r09/stage",
"p08-03-native-os-fd643f5-r10/stage",
"p08-03-native-f5f85ae-r16/stage",
"p08-03-final-regression-f5f85ae-r01/stage",
"p08-03-final-regression-fd643f5-r01/stage",
"p03-midpoint-restart-r03/stages",
"p03-midpoint-restart-r04/stages",
"p03-midpoint-restart-r05/stages",
"p03-formal13-ui-to14-final-r01/stages",
"p03-formal13-ui-to14-final-r02/stages"
],
"formal_credit": 0
}
@@ -0,0 +1,21 @@
exec(open('/private/tmp/tree-offload-cold-stage-r03.py').read().split("if __name__")[0])
m=json.loads((D/'MANIFEST.json').read_bytes());rows=m['members'];p=T/'cold-stages-r03.tar.gz';assert not (D/'PREPARED.json').exists()
# The interrupted staging archive was never uploaded or accepted. Sources are untouched.
p.unlink();idle();assert inv()==rows
objects={x['sha256']:x for x in rows if x['type']=='file'}
with tarfile.open(p,'w:gz',compresslevel=6)as t:
for h,x in sorted(objects.items()):t.add(B/x['path'],arcname='objects/'+h,recursive=False)
payload=(D/'MANIFEST.json').read_bytes();i=tarfile.TarInfo('MANIFEST.json');i.size=len(payload);t.addfile(i,io.BytesIO(payload))
with tarfile.open(p,'r:gz')as t:
assert len(t.getmembers())==len(objects)+1
assert t.extractfile('MANIFEST.json').read()==payload
for h,x in objects.items():assert hashlib.sha256(t.extractfile('objects/'+h).read()).hexdigest()==h
assert inv()==rows
parts=[]
with p.open('rb')as f:
for i in range(1000):
v=f.read(32*1024**2)
if not v:break
q=T/f'cold-stages-r03.tar.gz.part-{i:04d}';q.write_bytes(v);parts.append(dict(order=i,path=str(q),bytes=len(v),sha256=sha(q)))
save(D/'PREPARED.json',dict(format='content-addressed-tar-v1',archive=str(p),archive_bytes=p.stat().st_size,archive_sha256=sha(p),parts=parts,unique_payloads=len(objects),source_unchanged=True,all_members_verified=True))
print(json.dumps(dict(files=m['files'],logical_bytes=m['logical_bytes'],unique_bytes=sum(x['bytes']for x in objects.values()),archive_bytes=p.stat().st_size,parts=len(parts))),flush=True)
@@ -0,0 +1,21 @@
"""Restore content-addressed archive without overwriting existing files."""
import argparse,hashlib,json,os,tarfile
from pathlib import Path
p=argparse.ArgumentParser();p.add_argument('archive');p.add_argument('destination');a=p.parse_args();dest=Path(a.destination).resolve()
with tarfile.open(a.archive,'r:gz')as t:
m=json.loads(t.extractfile('MANIFEST.json').read());rows=m['members'];expected={'MANIFEST.json'}|{'objects/'+x['sha256']for x in rows if x['type']=='file'}
assert {x.name for x in t.getmembers()}==expected and len(t.getmembers())==len(expected)
for x in rows:
target=dest/x['path'];assert target.resolve().is_relative_to(dest) and not target.exists()
for x in rows:
q=dest/x['path']
if x['type']=='directory':q.mkdir(parents=True,exist_ok=True)
else:
q.parent.mkdir(parents=True,exist_ok=True);h=hashlib.sha256()
with q.open('xb')as out,t.extractfile('objects/'+x['sha256'])as f:
for b in iter(lambda:f.read(1048576),b''):h.update(b);out.write(b)
assert q.stat().st_size==x['bytes'] and h.hexdigest()==x['sha256']
os.chmod(q,x['mode']);os.utime(q,ns=(x['mtime_ns'],x['mtime_ns']))
for x in reversed(rows):
if x['type']=='directory':os.utime(dest/x['path'],ns=(x['mtime_ns'],x['mtime_ns']))
print('Restored and verified',m['files'],'files')
@@ -0,0 +1,22 @@
exec(open('/private/tmp/tree-offload-cold-stage-r03.py').read().split("if __name__")[0])
m=json.loads((D/'MANIFEST.json').read_bytes());p=json.loads((D/'PREPARED.json').read_bytes());v=json.loads((D/'CLOUD_ARCHIVE_VERIFIED.json').read_bytes());assert v['actual_cloud_readback'] and v['whole_archive_sha256']==p['archive_sha256']
for name in ['MANIFEST.json','PREPARED.json','CLOUD_PARTS.json','restore.py','RESTORE.md']:
r=json.loads((D/('READBACK-'+name+'.json')).read_bytes());assert r['actual_cloud_readback_verified'] and sha(D/name)==r['sha256']
assert not (D/'RETIREMENT.json').exists();idle();rows=inv();assert rows==m['members']
for x in m['protected_parent_files']:assert sha(Path(x['path']))==x['sha256']
free_before=shutil.disk_usage(R).free
for x in rows:
if x['type']=='file':(B/x['path']).unlink()
for x in sorted(rows,key=lambda x:len(Path(x['path']).parts),reverse=True):
if x['type']=='directory':(B/x['path']).rmdir()
for s in roots:
parent=(B/s).parent;pointer=parent/'CLOUD_STAGE_ARCHIVE_R03.json';assert not pointer.exists();save(pointer,dict(state='cloud_archived',original_root=str(B/s),folder_url='https://drive.google.com/drive/folders/1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK',manifest=str(D/'MANIFEST.json'),cloud_parts=str(D/'CLOUD_PARTS.json'),restore=str(D/'RESTORE.md'),archive_sha256=p['archive_sha256'],scope='Only historical stage copy; local result/image/save/receipt files retained',formal_credit=0))
for x in m['protected_parent_files']:assert sha(Path(x['path']))==x['sha256']
# Remove only manifest-bound, verified owned staging files after originals are cloud-backed.
for i,x in enumerate(p['parts']):
q=Path(x['path']);assert sha(q)==x['sha256'];q.unlink()
q=T/f'readback-{i:04d}.bin';assert sha(q)==x['sha256'];q.unlink()
for q in [Path(p['archive']),T/'cloud-readback.tar.gz']:assert sha(q)==p['archive_sha256'];q.unlink()
result=dict(recorded_unix=time.time(),files=m['files'],logical_bytes=m['logical_bytes'],allocated_sum=m['allocated_sum'],cloud_archive_bytes=p['archive_bytes'],free_before_selection=m['free_before'],free_before_retirement=free_before,free_after=shutil.disk_usage(R).free,original_files_and_parent_evidence_reverified=True,actual_cloud_readback_all_payloads_verified=True,retired_only_manifest_members=True,temporary_archives_removed_after_verification=True,roots=roots,formal_credit=0)
save(D/'RETIREMENT.json',result)
print(json.dumps(result),flush=True)
@@ -0,0 +1,54 @@
from pathlib import Path
import hashlib,json,os,subprocess,tarfile,io,shutil,time,sys
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');B=R/'artifacts/original-completion-2026-10-02';D=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-cold-stages-r03-20261015';T=Path('/private/tmp/tree-offload-cold-stage-r03')
roots=['p05-acceptance-partial-r06/stages','p23-03-native-impact-19fc3f5-r01/stage','p23-03-component-impact-19fc3f5-r01/stage','p23-03-final-regression-49445d4-r01/stage','p08-03-native-os-r09/stage','p08-03-native-os-fd643f5-r10/stage','p08-03-native-f5f85ae-r16/stage','p08-03-final-regression-f5f85ae-r01/stage','p08-03-final-regression-fd643f5-r01/stage','p03-midpoint-restart-r03/stages','p03-midpoint-restart-r04/stages','p03-midpoint-restart-r05/stages','p03-formal13-ui-to14-final-r01/stages','p03-formal13-ui-to14-final-r02/stages']
def sha(p):
h=hashlib.sha256()
with p.open('rb') as f:
for x in iter(lambda:f.read(1048576),b''):h.update(x)
return h.hexdigest()
def save(p,v):p.write_text(json.dumps(v,ensure_ascii=False,indent=2)+'\n')
def inv():
rows=[]
for s in roots:
p=B/s;assert p.is_dir() and not p.is_symlink()
for x in [p]+sorted(p.rglob('*')):
st=x.lstat();assert not x.is_symlink() and (x.is_dir() or x.is_file())
a=dict(path=str(x.relative_to(B)),type='file' if x.is_file() else 'directory',mode=st.st_mode&0o7777,mtime_ns=st.st_mtime_ns)
if x.is_file():a.update(bytes=st.st_size,sha256=sha(x),allocated=st.st_blocks*512)
rows.append(a)
return rows
def idle():
ps=subprocess.check_output(['ps','-axo','pid,command'],text=True)
opened=subprocess.run(['lsof','-n','-F','n'],capture_output=True,text=True).stdout
for s in roots:
assert not any(str(B/s) in line for line in ps.splitlines())
assert not any(line.startswith('n'+str(B/s)+'/') for line in opened.splitlines())
assert not subprocess.check_output(['git','-C',str(R),'ls-files','--',str(B/s)],text=True).strip()
def build():
assert not D.exists() and not T.exists();D.mkdir();T.mkdir();idle();before=shutil.disk_usage(R).free;assert before>1024**3
rows=inv();protected=[]
for s in roots:
for x in sorted((B/s).parent.iterdir()):
if x.is_file():protected.append(dict(path=str(x),sha256=sha(x)))
m=dict(schema='tree-cold-stage-offload-r03',base=str(B),roots=roots,members=rows,protected_parent_files=protected,files=sum(x['type']=='file' for x in rows),logical_bytes=sum(x.get('bytes',0)for x in rows),allocated_sum=sum(x.get('allocated',0)for x in rows),free_before=before,created=time.time(),reason='Idle historical verification source copies only. Product worktrees, current candidate, outcome logs, images, receipts and saves retained. Cloud restoration required before rerunning these historical staged copies.',formal_credit=0)
save(D/'MANIFEST.json',m);payload=(D/'MANIFEST.json').read_bytes();a=T/'cold-stages-r03.tar.gz'
with tarfile.open(a,'w:gz',compresslevel=6,format=tarfile.PAX_FORMAT)as t:
for x in rows:t.add(B/x['path'],arcname=x['path'],recursive=False)
h=tarfile.TarInfo('__OFFLOAD_MANIFEST__.json');h.size=len(payload);t.addfile(h,io.BytesIO(payload))
with tarfile.open(a,'r:gz')as t:
assert len(t.getmembers())==len(rows)+1
assert t.extractfile('__OFFLOAD_MANIFEST__.json').read()==payload
for x in rows:
e=t.getmember(x['path'])
if x['type']=='file':assert hashlib.sha256(t.extractfile(e).read()).hexdigest()==x['sha256']
assert inv()==rows
parts=[]
with a.open('rb')as f:
for i in range(10000):
v=f.read(32*1024**2)
if not v:break
p=T/f'cold-stages-r03.tar.gz.part-{i:04d}';p.write_bytes(v);parts.append(dict(order=i,path=str(p),bytes=len(v),sha256=sha(p)))
save(D/'PREPARED.json',dict(archive=str(a),archive_bytes=a.stat().st_size,archive_sha256=sha(a),parts=parts,source_unchanged=True,all_members_verified=True))
print(json.dumps(dict(doc=str(D),files=m['files'],logical_bytes=m['logical_bytes'],allocated_sum=m['allocated_sum'],archive_bytes=a.stat().st_size,parts=len(parts))),flush=True)
if __name__=='__main__':build()
@@ -0,0 +1,12 @@
exec(open('/private/tmp/tree-offload-cold-stage-r03.py').read().split("if __name__")[0])
p=json.loads((D/'PREPARED.json').read_bytes());m=json.loads((D/'MANIFEST.json').read_bytes());parts=[json.loads((T/f'cloud-{i:04d}.json').read_bytes())for i in range(4)];a=T/'cloud-readback.tar.gz'
with a.open('xb')as out:
for i,x in enumerate(parts):
q=T/f'readback-{i:04d}.bin';assert x['verified'] and x['bytes']==q.stat().st_size and sha(q)==x['sha256']==p['parts'][i]['sha256'];out.write(q.read_bytes())
assert a.stat().st_size==p['archive_bytes'] and sha(a)==p['archive_sha256']
objects={x['sha256']:x for x in m['members'] if x['type']=='file'}
with tarfile.open(a,'r:gz')as t:
assert t.extractfile('MANIFEST.json').read()==(D/'MANIFEST.json').read_bytes();assert len(t.getmembers())==len(objects)+1
for h,x in objects.items():assert hashlib.sha256(t.extractfile('objects/'+h).read()).hexdigest()==h
save(D/'CLOUD_PARTS.json',parts);save(D/'CLOUD_ARCHIVE_VERIFIED.json',dict(whole_archive_sha256=sha(a),bytes=a.stat().st_size,all_unique_payloads_verified=len(objects),original_file_mappings_verified=m['files'],manifest_identical=True,actual_cloud_readback=True,formal_credit=0))
print('Cloud readback entire archive and all original mappings verified')