Compare commits

..
Author SHA1 Message Date
Agent Control Runner e930a1dedf P13-02-CODE1: P13-02 背面対象参照・占有・保存の非描写機構(全原成果の一部、加算なし) 2026-10-17 17:03:48 +09:00
Takeshi 1e8d4ea888 docs: register original P13 target-reference implementation scope 2026-10-17 16:38:25 +09:00
Takeshi 2f3884be11 docs: retain scoped OS evidence and re-audit P04 current acceptance 2026-10-17 16:30:58 +09:00
Takeshi 565fd80507 docs: preserve retired P24 checkout evidence 2026-10-17 15:24:32 +09:00
Takeshi c80c1688fa docs: record P24 repair6 reviewed and native readiness 2026-10-17 15:21:02 +09:00
Takeshi 54cade4181 docs: record P24-02 repair4 source readiness and independent static review 2026-10-17 14:22:41 +09:00
Takeshi 51e8657bfb docs: record Opus P24-02 continuation and audit retained evidence 2026-10-17 00:27:23 +09:00
Takeshi 32c8d1ce43 docs: formally close P23-03 with exact-version acceptance evidence 2026-10-17 00:20:38 +09:00
Agent Control Runner 314a8a4ce1 Merge commit 'd2581afd26d1976cdfe4f44c89df49a772524d1e' into HEAD 2026-10-17 00:11:45 +09:00
Agent Control Runner d2581afd26 P23-03: 生活の観察 2026-10-16 19:28:26 +09:00
Agent Control Runner 059c2f743b P23-03: 生活の観察 2026-10-16 19:18:11 +09:00
Agent Control Runner 26f60095bf P23-03: 生活の観察 2026-10-16 17:15:06 +09:00
Agent Control Runner 93248f4d79 P23-03: 生活の観察 2026-10-16 14:56:38 +09:00
Agent Control Runner 7f1920b329 P23-03: 生活の観察 2026-10-16 14:41:54 +09:00
Agent Control Runner 447f77a13b P23-03: 生活の観察 2026-10-16 14:24:10 +09:00
Agent Control Runner 6c13940cf4 P23-03: 生活の観察 2026-10-16 14:17:14 +09:00
Agent Control Runner 5041b88bdf Merge commit '53cb52da9ce87f15d56f9443790da0f9de29be58' into HEAD 2026-10-16 14:11:31 +09:00
Agent Control Runner 53cb52da9c P18-REG-KITCHEN-LEGACY14: P18承認済み保存移行と厨房旧14回帰の整合(原88件に加算しない補助) 2026-10-16 07:22:22 +09:00
Agent Control Runner 52ce2f125c P18-REG-KITCHEN-LEGACY14: P18承認済み保存移行と厨房旧14回帰の整合(原88件に加算しない補助) 2026-10-16 07:16:55 +09:00
Takeshi 9b1a18c1eb Preserve P04 raw verification work and offload 39 ended checkouts 2026-10-16 05:26:04 +09:00
Takeshi 8af0d5af8c Record P04 service boundary restore proof and raw collector stage 2026-10-16 04:55:18 +09:00
Takeshi 4a68e580db Record P04 night shift and overtime restore proof; stage S3 2026-10-16 04:42:16 +09:00
Takeshi faa40a772c Record P04 midnight proof and verified validation checkout offload 2026-10-16 04:12:00 +09:00
Takeshi 224007908d Record P04 S1 outage and formal restore evidence; continue S2a 2026-10-16 03:30:51 +09:00
Takeshi 5a233e08bb Preserve P04 submission and product composition proof; stage S1 acceptance work 2026-10-16 03:04:50 +09:00
Takeshi 9694f50ee6 Record request resend save proof and correct whole-function evidence pins 2026-10-16 01:53:14 +09:00
Takeshi f3f23cac88 Record paid shift payroll and formal midnight save continuity 2026-10-16 01:41:37 +09:00
Takeshi 54e81e576f Record approved D05 native save evidence and verified Drive offloads 2026-10-16 01:32:14 +09:00
Agent Control Runner 5f6bc11d6b Merge commit '265ce30f81b1302ca374330f7129f02d6fde4697' into HEAD 2026-10-15 23:13:10 +09:00
Takeshi c4bc9b44e9 Record approved P04 boundary policies and current acceptance evidence 2026-10-15 23:08:38 +09:00
Agent Control Runner 265ce30f81 P18-01-CODE: 原本関係モデル・旧値保全・Runtime保存と読取経路 2026-10-15 20:58:05 +09:00
Agent Control Runner b7a7cc01d4 P18-01-CODE: 原本関係モデル・旧値保全・Runtime保存と読取経路 2026-10-15 20:33:19 +09:00
Agent Control Runner 9a26f9ab8c P23-03: 生活の観察 2026-10-15 18:30:42 +09:00
Agent Control Runner 19fc3f50c7 P23-03: 生活の観察 2026-10-15 18:01:00 +09:00
Agent Control Runner 49445d4a4d P23-03: 生活の観察 2026-10-15 12:08:24 +09:00
Agent Control Runner 336a8cd0b3 P23-03: 生活の観察 2026-10-15 10:57:46 +09:00
Agent Control Runner 56bf5a3e86 P23-03: 生活の観察 2026-10-15 10:53:39 +09:00
Agent Control Runner 21b5d3a31a P23-03: 生活の観察 2026-10-15 10:32:29 +09:00
Agent Control Runner 0b7727a66c P23-03: 生活の観察 2026-10-15 10:03:36 +09:00
Agent Control Runner 55c29f1192 P23-03: 生活の観察 2026-10-15 09:52:50 +09:00
Agent Control Runner baa4f2d563 P23-03: 生活の観察 2026-10-15 09:47:27 +09:00
Agent Control Runner 59a1385536 P23-03: 生活の観察 2026-10-15 09:44:55 +09:00
Agent Control Runner d9e4e9bd2f P23-03: 生活の観察 2026-10-15 09:42:03 +09:00
Agent Control Runner f6176d3f19 P23-03: 生活の観察 2026-10-15 09:39:55 +09:00
Agent Control Runner 4c8a18aa75 P23-03: 生活の観察 2026-10-15 09:36:36 +09:00
Agent Control Runner 03100beabe P23-03: 生活の観察 2026-10-15 07:59:43 +09:00
Agent Control Runner 0084760ee0 P18-01-CODE: 原本関係モデル・旧値保全・Runtime保存と読取経路 2026-10-13 14:40:02 +09:00
Agent Control Runner f76ad96990 P18-01-CODE: 原本関係モデル・旧値保全・Runtime保存と読取経路 2026-10-13 14:25:06 +09:00
628 changed files with 200263 additions and 242 deletions
+80
View File
@@ -20,6 +20,7 @@ const OPERATING_EXPENSE_ACCOUNT := &"OPERATING_EXPENSE"
const AUTHORITY_FINE_ACCOUNT := &"AUTHORITY_FINE_EXPENSE"
const WAGE_EXPENSE_ACCOUNT := &"WAGE_EXPENSE"
const RUNTIME_SNAPSHOT_VERSION := 14
const PeepingRooms := preload("res://scripts/special/peeping_room_service.gd")
const AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 14
const EVENT_THREAT_RUNTIME_SNAPSHOT_VERSION := 13
const MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 15
@@ -97,6 +98,7 @@ const DEFENSE_COMMAND_TYPES: Array[StringName] = [
var definition_registry := DefinitionRegistry.new()
var command_queue := CommandQueue.new()
var id_generator := StableIdGenerator.new()
var peeping_room_service := PeepingRooms.new()
var domain_events := DomainEventStream.new()
var world_service := WorldService.new()
var path_service := PathService.new()
@@ -233,6 +235,7 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
_hired_staff_candidate_ids.clear()
command_queue = CommandQueue.new()
id_generator = StableIdGenerator.new()
peeping_room_service = PeepingRooms.new()
domain_events = DomainEventStream.new()
world_service = WorldService.new()
path_service = PathService.new()
@@ -253,6 +256,7 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
_initialize_s5_defense()
construction_service = ConstructionService.new(world_service, construction_resource_state)
construction_service.current_minute = _clock.absolute_minute
peeping_room_service.configure(world_service, facility_service, construction_service, path_service, id_generator)
_connect_construction_signals()
var initial_infrastructure_ok := _initialize_infrastructure_services()
_next_command_id = 1
@@ -298,6 +302,8 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
register_command_executor(&"build_facility", Callable(self, "_execute_build_facility"))
register_command_executor(&"cancel_construction", Callable(self, "_execute_cancel_construction"))
register_command_executor(&"demolish_facility", Callable(self, "_execute_demolish_facility"))
for command_type: StringName in [&"peeping_room_validate", &"peeping_room_place", &"peeping_room_relink", &"peeping_room_record_evidence"]:
register_command_executor(command_type, Callable(self, "_execute_peeping_room"))
register_command_executor(&"set_elevator_operation", Callable(self, "_execute_set_elevator_operation"))
register_command_executor(&"start_excavation", Callable(self, "_execute_start_excavation"))
register_command_executor(&"pause_excavation", Callable(self, "_execute_pause_excavation"))
@@ -330,6 +336,7 @@ func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_S
register_command_executor(&"begin_staff_task", Callable(self, "_execute_begin_staff_task"))
register_command_executor(&"progress_staff_task", Callable(self, "_execute_progress_staff_task"))
register_command_executor(&"create_relationship", Callable(self, "_execute_create_relationship"))
register_command_executor(&"register_original_relationship", Callable(self, "_execute_register_original_relationship"))
register_command_executor(&"change_relationship", Callable(self, "_execute_change_relationship"))
register_command_executor(&"attack_relationship_shield", Callable(self, "_execute_attack_relationship_shield"))
register_command_executor(&"request_route_lock", Callable(self, "_execute_request_route_lock"))
@@ -564,6 +571,8 @@ func create_snapshot() -> Dictionary:
}
if PurchaseQuoteV2.has_history(owned_systems[&"runtime"]):
owned_systems[&"runtime"][&"runtime_schema_version"] = MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION
if not peeping_room_service.is_empty():
owned_systems[&"runtime"][&"special_peeping_rooms"] = peeping_room_service.create_snapshot()
# Every component above returns detached containers. Transfer this fresh
# tree into the envelope instead of deep-copying all component snapshots a
# second time. Keep generic capture's caller-owned-extra contract unchanged.
@@ -665,6 +674,8 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
runtime_current_keys.append(&"facility_cleanliness")
if runtime_schema_version >= AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION:
runtime_current_keys.append(&"auto_purchase_plans")
if runtime_data.has(&"special_peeping_rooms"):
runtime_current_keys.append(&"special_peeping_rooms")
if not _dictionary_has_exact_canonical_keys(runtime_data, runtime_current_keys) \
or typeof(runtime_data.get(&"runtime_schema_version", null)) != TYPE_INT \
or typeof(runtime_data.get(&"world_seed", null)) != TYPE_INT \
@@ -1054,6 +1065,9 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
):
return false
var restored_relationships := RelationshipService.new()
restored_relationships.configure_original_identity_validator(
func(payload: Dictionary) -> bool: return _original_relationship_identities_valid(payload, restored_staff, restored_catalog)
)
if not restored_relationships.restore_snapshot(runtime_data[&"relationships"]):
return false
var restored_events := EventService.new()
@@ -1286,6 +1300,16 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
var restored_next_id := int(runtime_data.get(&"next_command_id", 0))
if restored_next_id <= 0:
return false
var restored_peeping_rooms := PeepingRooms.new()
restored_peeping_rooms.configure(restored_world, restored_facilities, restored_construction, restored_path, restored_id_generator)
if runtime_data.has(&"special_peeping_rooms"):
if not runtime_data[&"special_peeping_rooms"] is Dictionary:
return false
for raw_key: Variant in runtime_data:
if raw_key == &"special_peeping_rooms" and typeof(raw_key) != TYPE_STRING_NAME:
return false
if not restored_peeping_rooms.restore_section(runtime_data.get(&"special_peeping_rooms", null), restored_minute):
return false
if not SimulationSnapshot.restore(snapshot, _clock, _state):
return false
world_seed = restored_world_seed
@@ -1293,6 +1317,7 @@ func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bo
_staffing_projection_enabled = restored_staffing_projection
command_queue = restored_queue
id_generator = restored_id_generator
peeping_room_service = restored_peeping_rooms
domain_events = restored_domain_events
_rng_streams = restored_streams
world_service = restored_world
@@ -5378,6 +5403,9 @@ func _initialize_s4_relationship_events() -> void:
func _configure_relationship_event_boundaries() -> void:
if relationship_service == null or event_service == null:
return
relationship_service.configure_original_identity_validator(
func(payload: Dictionary) -> bool: return _original_relationship_identities_valid(payload, staff_service, mvp_content_catalog)
)
relationship_service.configure_candidate_callback(
Callable(self, "_on_relationship_threshold_candidate")
)
@@ -5539,6 +5567,7 @@ func _connect_facility_signals() -> void:
return
facility_service.instance_registered.connect(Callable(self, "_on_cleanliness_facility_registered"))
facility_service.instance_unregistered.connect(Callable(self, "_on_cleanliness_facility_unregistered"))
facility_service.instance_unregistered.connect(Callable(self, "_on_peeping_target_removed"))
facility_service.facility_state_changed.connect(Callable(self, "_on_facility_state_changed"))
facility_service.service_started.connect(Callable(self, "_on_service_started"))
facility_service.service_interrupted.connect(Callable(self, "_on_service_interrupted"))
@@ -6759,6 +6788,30 @@ func _execute_progress_staff_task(command: SimulationCommand) -> CommandResult:
result.command_id = command.command_id
return result
func _original_relationship_identities_valid(payload: Dictionary, staff_registry: StaffService, catalog: MvpContentCatalog) -> bool:
if payload.get("protagonist_id") != "player" or staff_registry == null:
return false
var subject := StringName(payload.get("subject_id", ""))
var rival := StringName(payload.get("rival_id", ""))
if subject == &"player" or rival == &"player" or subject == rival or not staff_registry.has_staff(subject):
return false
var heroine_definition := catalog.get_entry(&"unique_characters", subject)
var rival_definition := catalog.get_entry(&"unique_characters", rival)
var subject_staff := staff_registry.get_staff(subject)
return subject_staff.employment_kind == StaffRuntime.EmploymentKind.UNIQUE \
and heroine_definition.get(&"role_id") == String(subject_staff.role_id) \
and heroine_definition.get(&"character_kind") == "heroine" \
and rival_definition.get(&"character_kind") == "rival" \
and heroine_definition.get(&"counterpart_id") == String(rival) \
and rival_definition.get(&"counterpart_id") == String(subject)
func _execute_register_original_relationship(command: SimulationCommand) -> CommandResult:
var result := relationship_service.register_original_relationship(command.payload)
result.command_id = command.command_id
return result
func _execute_create_relationship(command: SimulationCommand) -> CommandResult:
var actor_a_id := StringName(command.payload.get(&"actor_a_id", command.payload.get("actor_a_id", "")))
var actor_b_id := StringName(command.payload.get(&"actor_b_id", command.payload.get("actor_b_id", "")))
@@ -10786,6 +10839,7 @@ func _on_excavation_completed(report: Dictionary) -> void:
))
func _on_facility_demolished(instance_id: StringName, refund: Dictionary) -> void:
peeping_room_service.target_removed(instance_id)
if not mana_network_service.get_node(instance_id).is_empty():
mana_network_service.unregister_node(instance_id)
if facility_service.has_instance(instance_id):
@@ -10800,6 +10854,31 @@ func _on_facility_demolished(instance_id: StringName, refund: Dictionary) -> voi
0
))
func _on_peeping_target_removed(instance_id: StringName) -> void:
peeping_room_service.target_removed(instance_id)
func _execute_peeping_room(command: SimulationCommand) -> CommandResult:
var payload := command.payload
var report: Dictionary
if command.command_type == &"peeping_room_place":
report = PeepingRooms.result(&"BUILD_DEFINITION_PENDING_D04")
elif command.command_type == &"peeping_room_validate":
if typeof(payload.get(&"origin")) != TYPE_VECTOR3I or typeof(payload.get(&"footprint", Vector2i(2, 1))) != TYPE_VECTOR2I or typeof(payload.get(&"target_instance_id", &"")) not in [TYPE_STRING, TYPE_STRING_NAME]:
report = PeepingRooms.result(&"INVALID_PAYLOAD")
else:
report = peeping_room_service.validate_placement(payload[&"origin"], payload.get(&"footprint", Vector2i(2, 1)), StringName(payload.get(&"target_instance_id", &"")))
else:
var key: StringName = &"target_instance_id" if command.command_type == &"peeping_room_relink" else &"source_event_key"
if typeof(payload.get(&"room_id")) not in [TYPE_STRING, TYPE_STRING_NAME] or typeof(payload.get(key, &"")) not in [TYPE_STRING, TYPE_STRING_NAME]:
report = PeepingRooms.result(&"INVALID_PAYLOAD")
elif command.command_type == &"peeping_room_relink":
report = peeping_room_service.relink(StringName(payload[&"room_id"]), StringName(payload.get(key, &"")))
else:
report = peeping_room_service.record_evidence(StringName(payload[&"room_id"]), StringName(payload.get(key, &"")), _runtime_event_minute())
if report[&"ok"]:
return CommandResult.succeeded(command.command_id, report)
return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, String(report[&"reason"]), report)
func _on_ledger_transaction_posted(transaction_id: StringName, _entries: Array) -> void:
if _operations_flushing_economy_notifications.has(transaction_id):
return
@@ -10889,6 +10968,7 @@ func get_staff_management_report() -> Dictionary:
&"can_edit": block_reason.is_empty(),
&"assignment_block_reason": block_reason,
&"unique_contract": _staff_unique_contract_report(staff),
&"original_relationship": relationship_service.get_original_relationship(staff.staff_id),
})
var facilities: Array[Dictionary] = []
for facility: FacilityInstance in facility_service.get_instances():
@@ -1809,13 +1809,13 @@ P00〜P29のIDを維持して過去記録との対応を保つ。各項目には
### P23 タワー画面 レイヤー演出
現在地: ドット断面、レイヤー表示、複数UIスキンは部分実装。原本全演出の受入は残る。
現在地: P23-01およびP23-03は正式完了。生活の観察の全7条件・通常OS・同需要比較・別PID保存再開を同版証拠で受入。P23-02の保持操作・最大場面性能・Windows表示倍率実機、完成資産とP23全体の受入は残る。
統合前提: P08, P22。原本対応: B-2.2, B-11.1, B-11.4, B-12.1, B-12.2, B-12.4。
- P23-01 レイヤーと波紋。表時の裏半透明、裏時の表ワイヤー、魔法レンズ風の波紋を原本どおり接続する。 受入: 連続切替でも座標・選択・対象が一致し、描画層と操作対象を取り違えない。 状態: 正式完了。P23-01「レイヤーと波紋」を現採用1299/engine c7cccbf8に固定して原条件を監査。表時の裏半透明alpha0.22、裏時の表ワイヤー、魔法レンズ波紋のnative PNGを確認。局所16高速切替で全Runtime保持、通常OSで同位置の表受付/裏倉庫を選び12連続切替、Writer41689通常保存→Reader42598別PID通常読込と2切替で座標/有効選択/操作対象が一致。全51typed snapshotは切捨て/正規化なし、各PID内切替前後バイト一致、保存再開は保存成功から読込成功へのevent index12の2差分全文だけを保持。正式4members同SHA/圧縮checksum/展開長を確認。旧r01観測Nil→floatと診断を落としたgateは受入不可として保持、r02で観測可視性条件とstrict gateを修正し両GUI診断0。製品編集0、同版full172/14721と関連3suite、P04-03最終r04代表負荷CPU実描画rawを再用、重複全回帰0。 原work/acceptanceと適用横断条件を同1名が全受入し、本成果単位不足0で9件目として正式完了。 P23-02/03、Windows表示倍率/実機部分確認、リアルタイムx3/レンズ単独GPU費用・全性能予算、完成素材と全ゲームは未受入。
- P23-02 断面の操作性。パン、上下スクロール、ズーム、建設グリッド、接続警告、HUD配置を整える。 受入: 小画面とWindows表示倍率で読めて押せる。x3時にも操作が追随する。 状態: 着手中。P23-02は着手中、次に閉じる1件を維持。制作r32を保持し、作業候補をr53から未採用r62へ選定。親r58の接続ID派生memoを保持し、r62はshared木のindices.has+添字をget(default -1)へ1箇所だけ置換、非正辺拒否・workspace非負index・探索順/費用/親/wrap/full fallbackを保持。元r58全Pathへ逆変換一致・他1298ref同一、warm32/補足12証拠は不変getter/helper/無効化/Save境界だけ再利用。同一r62の全木36・transit/partial14・全150候補/全Runtime19/0・境界24件179/0・経路15/配列所有83/0・旧仕様12群726/0を独立有限受理。fresh順58,62,62,58,58,62・同646/cold/paused/speed1/外部listenerなし3pair:2152153→2069843us;2104659→2063915us;2173628→2124916us。全6after64711487732bytes基準全文一致、3対全短縮、中央値2152153→2069843us(有限約3.82454%短縮)。比較QA初版の受付差は実行前拒否、r01/r02未実行保持、受付だけ修復したr03を実行。r60は50木呼出/50開始/50完全キー/重複0で固定窓の木再利用を支持せず。r61の7計測は包含時間で合算不可、shared木50回591877usを次変更の根拠にした診断のみ。約2.06〜2.12秒同期処理が残り予算/P95/D10/通常OS/x3は未達、制作採用はしない。正確な最終版の影響・全172は関連必要変更を固めて実施。原9横断8/通常OS647以降/x3・終了/小画面/同一Windows配布版実機倍率は全未達。Ctrl保持wheel/左保持dragは延期・未達・免除なし。正式9/着手19/予定60・30パッケージ/88成果・部分点なしを維持。
- P23-03 生活の観察。部屋、行列、EV、職員、物資、営業状態が断面上で理解できる表示へ調整する。 受入: 人物や設備の表示が実状態に対応し、同需要の動線改善を観察できる。
- P23-03 生活の観察。部屋、行列、EV、職員、物資、営業状態が断面上で理解できる表示へ調整する。 受入: 人物や設備の表示が実状態に対応し、同需要の動線改善を観察できる。 状態: 正式完了。P23-03「生活の観察」を正式完了。提出d2581af、main基点5041b88、実試験tree a700519、実統合/最終314a8a4。全7原条件を別Opus5.5がpass、重大/高/中指摘0。実通常OS88要求/88ACK・4別PID終了・両配置の全正式モデル保存再開一致、40画像838行を実7Opus判断へ全照合。同需要全対象の到着分合計7153→2585。局所146/portable4・native4/548・同版全179/21752/322parse/181owned終了を再利用し、通常validate/review/integration/finalが成立。low2は原判定を保持し実所在と時系列を補記。P23-02、Windows、最大場面性能、完成資産・全施設・通しゲームは別未達。 版付き全条件証拠: execution/p23-03-resume-20261017/ACCEPTANCE_CLOSED_314A8A4.json。原30/88、正式14、部分点なし。
### P24 インスペクター 通知 操作完成
@@ -0,0 +1,31 @@
{
"scope": "R13/R14 completed offloads, not game acceptance or explanation of all historical20GB use",
"recorded_at": "2026-10-15T20:19:14.487858+00:00",
"batches": [
{
"record": "docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r13-20261016/RETIREMENT.json",
"source_retirement_observed_free_delta_bytes": 737722368,
"own_temporary_cleanup_observed_free_delta_bytes": 184242176,
"source_logical_bytes": 687528462,
"removed_checkouts": 5,
"catalog_reference": "docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r13-20261016/CATALOG_REMOTE_REFERENCE.json"
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/drive-offload-completed-checkouts-r14-20261016/RETIREMENT.json",
"source_retirement_observed_free_delta_bytes": 4384702464,
"own_temporary_cleanup_observed_free_delta_bytes": 223248384,
"source_logical_bytes": 4994674198,
"removed_checkouts": 34,
"catalog_reference": "docs/plans/original-completion-2026-10-02/execution/drive-offload-completed-checkouts-r14-20261016/CATALOG_REMOTE_REFERENCE.json"
}
],
"removed_checkouts": 39,
"source_retirement_observed_free_delta_total_bytes": 5122424832,
"own_temporary_cleanup_observed_free_delta_total_bytes": 407490560,
"current_free_bytes": 8369876992,
"dirty_review_checkouts_retained": 4,
"active_implementation_and_raw_and_profiles_retained": true,
"historical_20GB_all_cause_proven": false,
"observed_growth_factor": "Repeated full validation/review/integration/final Git checkouts duplicate the same source/assets. These ended sources were content-deduplicated, full-byte cloud verified, rehashed and normally retired. Git objects reachable frommain remain.",
"root_raw_input_supply": "execution/p04-01-current-recheck-20261015/ROOT_R17_FULL_INPUT_RELOCATION_R01.json"
}
@@ -2,6 +2,28 @@
"schema_version": 1,
"scope": "exact per-suite completion label/schema; all check counts from actual raw only",
"rows": [
{
"test": "tests/s4/test_original_relationship_model.gd",
"template": "Original relationship model: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "c74b243dbbb54dba9bbc165e29508cca910f0beb63e32d25ebbb8ea606dccce9",
"authority": {
"path": "docs/spec/acceptance/P18-01-code-r01.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/s4/test_original_relationship_runtime.gd",
"template": "Original relationship runtime: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "c56bdb99dd43a4e7ceb3ca2861e8db39972c5c4e805126a77e2f7da32ca5bdc9",
"authority": {
"path": "docs/spec/acceptance/P18-01-code-r01.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/ui/test_selection_departure.gd",
"template": "Selection departure: <checks> checks, <failures> failures",
@@ -56,7 +78,7 @@
"template": "Required kitchen: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "90e7639f5aa76e34b9ee14769f4ec1ae1317a647900b27877075dbf21ef1dfcf",
"source_sha256_at_schema_audit": "3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f",
"authority": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p09-kitchen-single-link-candidate-r09/candidates/tests/business/test_required_kitchen.gd",
"sha256": "90e7639f5aa76e34b9ee14769f4ec1ae1317a647900b27877075dbf21ef1dfcf",
@@ -64,7 +86,7 @@
},
"source_marker_lines": [
{
"line": 281,
"line": 481,
"text": "\tprint(\"Required kitchen: %d checks, %d failures\" % [checks, failures])"
}
]
@@ -3702,6 +3724,72 @@
"scope": "normal placement; native and OS pending"
}
}
,{
"test": "tests/ui/test_p23_life_observation.gd",
"template": "P23 life observation: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "750254af7d4b8b00508e25d1ef744837d3a7d14ddebe12398e8014bf5e8c68e8",
"authority": {
"path": "docs/spec/acceptance/P23-03.json",
"scope": "component and read-only observation only; native unexecuted; whole unit blocked"
}
},
{
"test": "tests/special/test_peeping_room_geometry.gd",
"template": "Peeping room geometry: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "103d85f83e1e97a8637892504264275eef23f172eeec56c94e5c022d81bf6945",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/special/test_peeping_room_reference.gd",
"template": "Peeping room reference: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "188b00a60f7aefda69dc4973f1de9c14447a0d4bcdd1257a2eabe7c4782e4caf",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/special/test_peeping_room_evidence.gd",
"template": "Peeping room evidence: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "390e0032d14de9a8875ced163a922341ce655744200d78b4ffa776d42c4f8c2a",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/special/test_peeping_room_save.gd",
"template": "Peeping room save: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "ba0e7644277477c1821135cae6d6fd533651799c6f9bd8c43ccf45e63b96c63c",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
"scope": "new backend suite marker; native execution pending"
}
},
{
"test": "tests/special/test_peeping_room_runtime.gd",
"template": "Peeping room runtime: <checks> checks, <failures> failures",
"required": true,
"fixed_check_count_used": false,
"source_sha256_at_schema_audit": "30ed2fe11cc6b0353e9a3a6d995cf8690d322858d2c3dbb38ef32fd941072d2d",
"authority": {
"path": "docs/plans/original-completion-2026-10-02/execution/p13-02/CODE1_TASK_SPEC.json",
"scope": "new backend suite marker; native execution pending"
}
}
],
"unknown_roster_suite_policy": "refuse, explicitly review its source/schema before accepting",
"roster_count_is_not_hardcoded": true,
@@ -0,0 +1,76 @@
{
"roots": [
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-final-72a762cf",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-integration-cd1274dc",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-371d8aef",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-ce2291ae",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-093a2cf6",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-2e233208",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-3dad351e",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-4e2658ac",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-bc5856ba",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-c18cf88c",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-final-01319d20",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-integration-f1ef0462",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-12e6c041",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3b28affe",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3f3dfc51",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3fe2dd53",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-550deb2e",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-67a02ef9",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-811cda4c",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a129ff11",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a63dc887",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-aae0c548",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-b690ee7b",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-cee90f24",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-d7628767",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-f9b772e4",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-evidence-review-959e0cc6",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-final-997fbc67",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-integration-c0e7a7b6",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-review-07868afe",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-2be7954f",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-30b59553",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-919576df"
],
"excluded": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-review-2ecdb277",
"reason": "dirty/untracked/ignored; retain untouched"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-review-c36607d5",
"reason": "dirty/untracked/ignored; retain untouched"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-review-d137e8d8",
"reason": "dirty/untracked/ignored; retain untouched"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-review-semantic-25b9e45a",
"reason": "dirty/untracked/ignored; retain untouched"
}
],
"Runner_projects": [
{
"project": "the-tree-p08-02",
"original_unit": "P08-02",
"original_unit_completed": true,
"running_runs": 0
},
{
"project": "the-tree-p08-03-code",
"original_unit": "P08-03",
"original_unit_completed": true,
"running_runs": 0
},
{
"project": "the-tree-p24-03-code",
"original_unit": "P24-03",
"original_unit_completed": true,
"running_runs": 0
}
]
}
@@ -0,0 +1,16 @@
{
"full_catalog_member": "MANIFEST.json.gz",
"bytes": 6669750,
"sha256": "9ac0dccbf3df0c513b68fec6de22523cb7cf9c8b836d483e939f93bae20fbcaa",
"cloud_restore_kit": {
"part": 7,
"id": "1GvVPcYK4bowANv9X9awUUzBWVmW4aYTr",
"url": "https://drive.google.com/file/d/1GvVPcYK4bowANv9X9awUUzBWVmW4aYTr/view?usp=drivesdk",
"bytes": 6676299,
"sha256": "d5b268fb83b1f2c73d00f7f323a72477f85a5f7ca9a8454fe7ba9b4f06e0b49b",
"full_readback_verified": true
},
"local_catalog_needed_for_active_work": false,
"local_catalog_retained": false,
"why": "Full catalog remains in fully readback-verified Drive restore kit. Keep instructions and pins locally; avoid duplicating the catalog into every future Git checkout. Download/extract kit before restore.py or all-source re-audit."
}
@@ -0,0 +1,73 @@
{
"parts": [
{
"part": 0,
"id": "1-xhb51N7RLjzeIvsL9FnkY2DjuJBaowS",
"url": "https://drive.google.com/file/d/1-xhb51N7RLjzeIvsL9FnkY2DjuJBaowS/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "4bdcee4b11d7a9410f7d3e2351a0645f8e42fbcab950595599d57ce3a6b09a55",
"full_readback_verified": true
},
{
"part": 1,
"id": "1WKBjd0yMChgUVXV4hCJxWNAR8lvvTB7a",
"url": "https://drive.google.com/file/d/1WKBjd0yMChgUVXV4hCJxWNAR8lvvTB7a/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "d5ee27a5a657cbed09b01039dc19fec913039de20241cc688d01db5a2b72ea9e",
"full_readback_verified": true
},
{
"part": 2,
"id": "1HkLcuQREGN1wk9OC5VWPHElk5h85dY_2",
"url": "https://drive.google.com/file/d/1HkLcuQREGN1wk9OC5VWPHElk5h85dY_2/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "a1da61b582a5e6b39605c51fe9f46661eee6721981de04cf88251f1debddd238",
"full_readback_verified": true
},
{
"part": 3,
"id": "1FgB1FYi1KJ2qLgU4wO7IRyW9O-ajBmmV",
"url": "https://drive.google.com/file/d/1FgB1FYi1KJ2qLgU4wO7IRyW9O-ajBmmV/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "20d892cd4dd80a4fb5f2ef983bebea43869a8bbe117ff75013608f0914592dce",
"full_readback_verified": true
},
{
"part": 4,
"id": "1vShc-bK2agh5h189ruOrf7F8v8K_hoKD",
"url": "https://drive.google.com/file/d/1vShc-bK2agh5h189ruOrf7F8v8K_hoKD/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "65e0753e6c30ad81a4aa311de5cfbbaa4b37130ff9898f9cea9d4f3f65afd4f0",
"full_readback_verified": true
},
{
"part": 5,
"id": "1wPyjVZdgYn5DxSp9N6-x3CNHVam7LGAS",
"url": "https://drive.google.com/file/d/1wPyjVZdgYn5DxSp9N6-x3CNHVam7LGAS/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "d5720a1030b21ab9dc38054e4a2008f78796763c25df9ca853792d4c8d19fd6f",
"full_readback_verified": true
},
{
"part": 6,
"id": "1f3o0_A4JlHvMKN2clmM2JC3RVwdP8wvs",
"url": "https://drive.google.com/file/d/1f3o0_A4JlHvMKN2clmM2JC3RVwdP8wvs/view?usp=drivesdk",
"bytes": 7583096,
"sha256": "b9b3338164e44b560fc4294d90ebe74ff2bfc5fe42bf9c814c00d1c4def35781",
"full_readback_verified": true
}
],
"restore_kit": {
"part": 7,
"id": "1GvVPcYK4bowANv9X9awUUzBWVmW4aYTr",
"url": "https://drive.google.com/file/d/1GvVPcYK4bowANv9X9awUUzBWVmW4aYTr/view?usp=drivesdk",
"bytes": 6676299,
"sha256": "d5b268fb83b1f2c73d00f7f323a72477f85a5f7ca9a8454fe7ba9b4f06e0b49b",
"full_readback_verified": true
},
"whole_archive_sha256": "ee4f43a728e1661c4b4f6014677870346ee66cd49325ea87f5f59fede0534e3e",
"whole_archive_bytes": 108246392,
"all_cloud_part_bytes_verified": true,
"all_eight_cloud_files_full_readback_verified": true,
"source_not_removed": true
}
@@ -0,0 +1,119 @@
{
"origin_main_at_pack": "8af0d5af8c4a15f6b7130617dbaa78ed736e604a",
"commits": [
{
"head": "c675bed91d694a18abbddac85013eb5b443bdca1",
"reachable_from_origin_main": true
},
{
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7",
"reachable_from_origin_main": true
},
{
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353",
"reachable_from_origin_main": true
},
{
"head": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
"reachable_from_origin_main": true
},
{
"head": "1545bd42d689a9a6382e2b003ee0550fa197f6e4",
"reachable_from_origin_main": true
},
{
"head": "6c7c724410c350afe3d49fa8ec52defe20e78041",
"reachable_from_origin_main": true
},
{
"head": "bb34f443c4645a56d7798a142f1e2d8ddf615cae",
"reachable_from_origin_main": true
},
{
"head": "592809bfdaf6a1bbc5ec9cbaeff71a7bb072add9",
"reachable_from_origin_main": true
},
{
"head": "027861b765d55878eaf5b552600c407913dcc485",
"reachable_from_origin_main": true
},
{
"head": "f5f85ae08c1c6c9c1ec511f13a7215170d7d8d49",
"reachable_from_origin_main": true
},
{
"head": "7dde98ccb749cbd1c1b82e066b59350e73191400",
"reachable_from_origin_main": true
},
{
"head": "fd643f55a271e63c554b94681454d357117c0678",
"reachable_from_origin_main": true
},
{
"head": "4f3b42dfeca478d2398407373d75b529eb76fcf0",
"reachable_from_origin_main": true
},
{
"head": "7dd450c64c897fc8e9e6bbd9fa242f28f42cb1af",
"reachable_from_origin_main": true
},
{
"head": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"reachable_from_origin_main": true
},
{
"head": "1f0a2bcd53c3f9fdf057e7916871cf5b42145c55",
"reachable_from_origin_main": true
},
{
"head": "31aa7706d28a92e313c432d5a62e35d19503dcc3",
"reachable_from_origin_main": true
},
{
"head": "8e3d79d5f2068fbe71c0ef7252540548d75b3d1e",
"reachable_from_origin_main": true
},
{
"head": "0c5e0022f2d809e4735804f67582b9c96a1dc025",
"reachable_from_origin_main": true
},
{
"head": "7e2368f5c453a3900ba1bb038d7138d25f7eb4fb",
"reachable_from_origin_main": true
},
{
"head": "c2b59f04f94dda0a61991ec3bb7f0e946196f995",
"reachable_from_origin_main": true
},
{
"head": "d369d1c399f7506bdb8d980b642ad0da216d14f4",
"reachable_from_origin_main": true
},
{
"head": "d01286360ee88046e06b80d840fc303a71e0d661",
"reachable_from_origin_main": true
},
{
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4",
"reachable_from_origin_main": true
},
{
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c",
"reachable_from_origin_main": true
},
{
"head": "c2b8772e237597930e67f1329d8b61143614a244",
"reachable_from_origin_main": true
},
{
"head": "9c711860a82d597a48dab595a49d4f23c5f3c370",
"reachable_from_origin_main": true
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.git-bundles.tar.gz",
"bytes": 85,
"sha256": "dbb44697fc57a335c1f6c0f735b500539e805f4a92f1b32eb772c419891f7880"
},
"purpose": "Retain unreachable commit objects; reachable HEADs are in fullmain history. All source bytes separately preserved."
}
@@ -0,0 +1,230 @@
{
"source_initial_free_bytes": 4015747072,
"source_logical_bytes": 4994674198,
"unique_content_bytes": 166637656,
"file_count": 115060,
"roots": [
{
"name": "P08-02-final-72a762cf",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-final-72a762cf",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1"
},
{
"name": "P08-02-integration-cd1274dc",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-integration-cd1274dc",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1"
},
{
"name": "P08-02-review-371d8aef",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-371d8aef",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7"
},
{
"name": "P08-02-review-ce2291ae",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-ce2291ae",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353"
},
{
"name": "P08-02-validation-093a2cf6",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-093a2cf6",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7"
},
{
"name": "P08-02-validation-2e233208",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-2e233208",
"head": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb"
},
{
"name": "P08-02-validation-3dad351e",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-3dad351e",
"head": "1545bd42d689a9a6382e2b003ee0550fa197f6e4"
},
{
"name": "P08-02-validation-4e2658ac",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-4e2658ac",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353"
},
{
"name": "P08-02-validation-8c6fdd1f",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f",
"head": "6c7c724410c350afe3d49fa8ec52defe20e78041"
},
{
"name": "P08-02-validation-bc5856ba",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-bc5856ba",
"head": "bb34f443c4645a56d7798a142f1e2d8ddf615cae"
},
{
"name": "P08-02-validation-c18cf88c",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-c18cf88c",
"head": "592809bfdaf6a1bbc5ec9cbaeff71a7bb072add9"
},
{
"name": "P08-03-final-01319d20",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-final-01319d20",
"head": "027861b765d55878eaf5b552600c407913dcc485"
},
{
"name": "P08-03-integration-f1ef0462",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-integration-f1ef0462",
"head": "027861b765d55878eaf5b552600c407913dcc485"
},
{
"name": "P08-03-validation-12e6c041",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-12e6c041",
"head": "f5f85ae08c1c6c9c1ec511f13a7215170d7d8d49"
},
{
"name": "P08-03-validation-3b28affe",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3b28affe",
"head": "7dde98ccb749cbd1c1b82e066b59350e73191400"
},
{
"name": "P08-03-validation-3f3dfc51",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3f3dfc51",
"head": "fd643f55a271e63c554b94681454d357117c0678"
},
{
"name": "P08-03-validation-3fe2dd53",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3fe2dd53",
"head": "4f3b42dfeca478d2398407373d75b529eb76fcf0"
},
{
"name": "P08-03-validation-550deb2e",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-550deb2e",
"head": "7dd450c64c897fc8e9e6bbd9fa242f28f42cb1af"
},
{
"name": "P08-03-validation-67a02ef9",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-67a02ef9",
"head": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab"
},
{
"name": "P08-03-validation-811cda4c",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-811cda4c",
"head": "1f0a2bcd53c3f9fdf057e7916871cf5b42145c55"
},
{
"name": "P08-03-validation-a129ff11",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a129ff11",
"head": "31aa7706d28a92e313c432d5a62e35d19503dcc3"
},
{
"name": "P08-03-validation-a63dc887",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a63dc887",
"head": "8e3d79d5f2068fbe71c0ef7252540548d75b3d1e"
},
{
"name": "P08-03-validation-aae0c548",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-aae0c548",
"head": "0c5e0022f2d809e4735804f67582b9c96a1dc025"
},
{
"name": "P08-03-validation-b690ee7b",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-b690ee7b",
"head": "7e2368f5c453a3900ba1bb038d7138d25f7eb4fb"
},
{
"name": "P08-03-validation-cee90f24",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-cee90f24",
"head": "c2b59f04f94dda0a61991ec3bb7f0e946196f995"
},
{
"name": "P08-03-validation-d7628767",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-d7628767",
"head": "d369d1c399f7506bdb8d980b642ad0da216d14f4"
},
{
"name": "P08-03-validation-f9b772e4",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-f9b772e4",
"head": "d01286360ee88046e06b80d840fc303a71e0d661"
},
{
"name": "P24-03-evidence-review-959e0cc6",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-evidence-review-959e0cc6",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
},
{
"name": "P24-03-final-997fbc67",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-final-997fbc67",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c"
},
{
"name": "P24-03-integration-c0e7a7b6",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-integration-c0e7a7b6",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c"
},
{
"name": "P24-03-review-07868afe",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-review-07868afe",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
},
{
"name": "P24-03-validation-2be7954f",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-2be7954f",
"head": "c2b8772e237597930e67f1329d8b61143614a244"
},
{
"name": "P24-03-validation-30b59553",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-30b59553",
"head": "9c711860a82d597a48dab595a49d4f23c5f3c370"
},
{
"name": "P24-03-validation-919576df",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-919576df",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz",
"bytes": 108246392,
"sha256": "ee4f43a728e1661c4b4f6014677870346ee66cd49325ea87f5f59fede0534e3e"
},
"manifest": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/drive-offload-completed-checkouts-r14-20261016/MANIFEST.json.gz",
"bytes": 6669750,
"sha256": "9ac0dccbf3df0c513b68fec6de22523cb7cf9c8b836d483e939f93bae20fbcaa"
},
"upload_parts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part000",
"bytes": 16777216,
"sha256": "4bdcee4b11d7a9410f7d3e2351a0645f8e42fbcab950595599d57ce3a6b09a55"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part001",
"bytes": 16777216,
"sha256": "d5ee27a5a657cbed09b01039dc19fec913039de20241cc688d01db5a2b72ea9e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part002",
"bytes": 16777216,
"sha256": "a1da61b582a5e6b39605c51fe9f46661eee6721981de04cf88251f1debddd238"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part003",
"bytes": 16777216,
"sha256": "20d892cd4dd80a4fb5f2ef983bebea43869a8bbe117ff75013608f0914592dce"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part004",
"bytes": 16777216,
"sha256": "65e0753e6c30ad81a4aa311de5cfbbaa4b37130ff9898f9cea9d4f3f65afd4f0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part005",
"bytes": 16777216,
"sha256": "d5720a1030b21ab9dc38054e4a2008f78796763c25df9ca853792d4c8d19fd6f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.cas.tar.gz.part006",
"bytes": 7583096,
"sha256": "b9b3338164e44b560fc4294d90ebe74ff2bfc5fe42bf9c814c00d1c4def35781"
}
],
"local_tar_all_blobs_roundtrip": true,
"prepared_seconds": 158.33660697937012,
"free_after_preparation": 3797897216,
"source_removed": false,
"retirement_requires_cloud_full_readback_and_source_recheck": true
}
@@ -0,0 +1,25 @@
# 完了済み成果単位の終了checkout34個の退避・復元
対象はCANDIDATES.jsonとPREPARATION.jsonの34個だけ。P08-02/P08-03/P24-03は原成果台帳でcompleted、各Runner稼働0。変更・追加/ignoredのある4個と全implement/build/native原raw/cache/saveは保持する。
全115,060file / 4,994,674,198byteをSHA重複排除し、108,246,392byteのCAS tar.gzに全内容保持。全file mode/mtime_ns、directories、Git HEAD、必要なGit bundlesを保持する。
Driveのpart000〜part006とrestore-kit.zipを同じ空フォルダへダウンロードし、kitを展開する。
7partを番号順にバイナリ連結しcompleted-checkouts-r14.cas.tar.gzを作る。
全体SHA256: ee4f43a728e1661c4b4f6014677870346ee66cd49325ea87f5f59fede0534e3e
全内容の検証のみ(source生成なし):
```
python3 restore.py --archive completed-checkouts-r14.cas.tar.gz --verify-only
```
全main履歴のあるrepoで元のグループ/名前へGit復元(既存checkout上書き拒否):
```
python3 restore.py --archive completed-checkouts-r14.cas.tar.gz --repo '/Users/korizatou114/Projects/とりにく工房ゲーム制作部' --destination-base '/Users/korizatou114/Projects/TheTree-managed-worktrees'
```
Gitなしで全fileだけ新規parentの元グループ/名前へ復元:
```
python3 restore.py --archive completed-checkouts-r14.cas.tar.gz --files-only --destination-base '/absolute/fresh-restored-parent'
```
Git版受入の再現にはGit復元を使う。.git管理pointerは正常なgit worktree addで再作成する。
restore.pyは全archive SHA/全blob/全manifest参照を検証し、復元後も全file SHA/size/mtimeを照合する。
全クラウドbyte読み戻し一致・元source全SHA再照合・終了/clean/未使用の再確認後にだけ正常なgit worktree removeを使用。共有設定/権限/課金は変更しない。
元checkout削減とこのrun専用pack後始末の空き増分は別々に実測する。
@@ -0,0 +1,6 @@
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r14-20261016/completed-checkouts-r14.restore-kit.zip",
"bytes": 6676299,
"sha256": "d5b268fb83b1f2c73d00f7f323a72477f85a5f7ca9a8454fe7ba9b4f06e0b49b",
"all_zip_members_checked": true
}
@@ -0,0 +1,161 @@
{
"removed_ended_completed_unit_checkouts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-final-72a762cf",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-integration-cd1274dc",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-371d8aef",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-ce2291ae",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-093a2cf6",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-2e233208",
"head": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-3dad351e",
"head": "1545bd42d689a9a6382e2b003ee0550fa197f6e4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-4e2658ac",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f",
"head": "6c7c724410c350afe3d49fa8ec52defe20e78041"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-bc5856ba",
"head": "bb34f443c4645a56d7798a142f1e2d8ddf615cae"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-c18cf88c",
"head": "592809bfdaf6a1bbc5ec9cbaeff71a7bb072add9"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-final-01319d20",
"head": "027861b765d55878eaf5b552600c407913dcc485"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-integration-f1ef0462",
"head": "027861b765d55878eaf5b552600c407913dcc485"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-12e6c041",
"head": "f5f85ae08c1c6c9c1ec511f13a7215170d7d8d49"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3b28affe",
"head": "7dde98ccb749cbd1c1b82e066b59350e73191400"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3f3dfc51",
"head": "fd643f55a271e63c554b94681454d357117c0678"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3fe2dd53",
"head": "4f3b42dfeca478d2398407373d75b529eb76fcf0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-550deb2e",
"head": "7dd450c64c897fc8e9e6bbd9fa242f28f42cb1af"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-67a02ef9",
"head": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-811cda4c",
"head": "1f0a2bcd53c3f9fdf057e7916871cf5b42145c55"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a129ff11",
"head": "31aa7706d28a92e313c432d5a62e35d19503dcc3"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a63dc887",
"head": "8e3d79d5f2068fbe71c0ef7252540548d75b3d1e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-aae0c548",
"head": "0c5e0022f2d809e4735804f67582b9c96a1dc025"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-b690ee7b",
"head": "7e2368f5c453a3900ba1bb038d7138d25f7eb4fb"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-cee90f24",
"head": "c2b59f04f94dda0a61991ec3bb7f0e946196f995"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-d7628767",
"head": "d369d1c399f7506bdb8d980b642ad0da216d14f4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-f9b772e4",
"head": "d01286360ee88046e06b80d840fc303a71e0d661"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-evidence-review-959e0cc6",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-final-997fbc67",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-integration-c0e7a7b6",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-review-07868afe",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-2be7954f",
"head": "c2b8772e237597930e67f1329d8b61143614a244"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-30b59553",
"head": "9c711860a82d597a48dab595a49d4f23c5f3c370"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-919576df",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4"
}
],
"source_file_count": 115060,
"source_logical_bytes": 4994674198,
"cloud_all_bytes_verified": true,
"source_files_all_rehashed_before_normal_git_worktree_remove": true,
"before_sources_free_bytes": 3773890560,
"after_sources_free_bytes": 8158593024,
"observed_source_retirement_free_delta_bytes": 4384702464,
"temporary_pack_logical_bytes_removed": 223169168,
"after_own_temporary_cleanup_free_bytes": 8381841408,
"own_temporary_cleanup_observed_delta_bytes": 223248384,
"measurement_note": "Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.",
"concurrent_isolated_implementation": [
[
"24d43100b6dc47d784ed6bac550c501a",
"P04-01",
"implementer",
16771
]
],
"elapsed_seconds": 22.53618597984314,
"recorded_at": "2026-10-15T20:17:45.196571+00:00"
}
@@ -0,0 +1,244 @@
{
"checks": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-final-72a762cf",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1",
"all_files_rehashed": 3457,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-integration-cd1274dc",
"head": "c675bed91d694a18abbddac85013eb5b443bdca1",
"all_files_rehashed": 3457,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-371d8aef",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7",
"all_files_rehashed": 3322,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-review-ce2291ae",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353",
"all_files_rehashed": 3321,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-093a2cf6",
"head": "bf559632ddd938085702529d9dd6b7c878f4ebc7",
"all_files_rehashed": 3322,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-2e233208",
"head": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
"all_files_rehashed": 3320,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-3dad351e",
"head": "1545bd42d689a9a6382e2b003ee0550fa197f6e4",
"all_files_rehashed": 3321,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-4e2658ac",
"head": "d1c7ce27d21a77be87081e12d20e7c8dd6ffa353",
"all_files_rehashed": 3321,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f",
"head": "6c7c724410c350afe3d49fa8ec52defe20e78041",
"all_files_rehashed": 3315,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-bc5856ba",
"head": "bb34f443c4645a56d7798a142f1e2d8ddf615cae",
"all_files_rehashed": 3321,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-c18cf88c",
"head": "592809bfdaf6a1bbc5ec9cbaeff71a7bb072add9",
"all_files_rehashed": 3321,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-final-01319d20",
"head": "027861b765d55878eaf5b552600c407913dcc485",
"all_files_rehashed": 3747,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-integration-f1ef0462",
"head": "027861b765d55878eaf5b552600c407913dcc485",
"all_files_rehashed": 3747,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-12e6c041",
"head": "f5f85ae08c1c6c9c1ec511f13a7215170d7d8d49",
"all_files_rehashed": 3693,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3b28affe",
"head": "7dde98ccb749cbd1c1b82e066b59350e73191400",
"all_files_rehashed": 3544,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3f3dfc51",
"head": "fd643f55a271e63c554b94681454d357117c0678",
"all_files_rehashed": 3693,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-3fe2dd53",
"head": "4f3b42dfeca478d2398407373d75b529eb76fcf0",
"all_files_rehashed": 3533,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-550deb2e",
"head": "7dd450c64c897fc8e9e6bbd9fa242f28f42cb1af",
"all_files_rehashed": 3489,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-67a02ef9",
"head": "4a17d0e0f589fa76d81f1d4630ec45c63bac21ab",
"all_files_rehashed": 3501,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-811cda4c",
"head": "1f0a2bcd53c3f9fdf057e7916871cf5b42145c55",
"all_files_rehashed": 3525,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a129ff11",
"head": "31aa7706d28a92e313c432d5a62e35d19503dcc3",
"all_files_rehashed": 3537,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-a63dc887",
"head": "8e3d79d5f2068fbe71c0ef7252540548d75b3d1e",
"all_files_rehashed": 3495,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-aae0c548",
"head": "0c5e0022f2d809e4735804f67582b9c96a1dc025",
"all_files_rehashed": 3517,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-b690ee7b",
"head": "7e2368f5c453a3900ba1bb038d7138d25f7eb4fb",
"all_files_rehashed": 3543,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-cee90f24",
"head": "c2b59f04f94dda0a61991ec3bb7f0e946196f995",
"all_files_rehashed": 3492,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-d7628767",
"head": "d369d1c399f7506bdb8d980b642ad0da216d14f4",
"all_files_rehashed": 3693,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-03-code/P08-03-validation-f9b772e4",
"head": "d01286360ee88046e06b80d840fc303a71e0d661",
"all_files_rehashed": 3512,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-evidence-review-959e0cc6",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4",
"all_files_rehashed": 2965,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-final-997fbc67",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c",
"all_files_rehashed": 3092,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-integration-c0e7a7b6",
"head": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c",
"all_files_rehashed": 3092,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-review-07868afe",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4",
"all_files_rehashed": 2965,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-2be7954f",
"head": "c2b8772e237597930e67f1329d8b61143614a244",
"all_files_rehashed": 2962,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-30b59553",
"head": "9c711860a82d597a48dab595a49d4f23c5f3c370",
"all_files_rehashed": 2960,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-validation-919576df",
"head": "4cefcff849d4dc1211caa5066e24bfae666cc2f4",
"all_files_rehashed": 2965,
"clean": true,
"open_files": false
}
],
"cloud_full_bytes_verified": true,
"all_sources_retained_at_check": true
}
@@ -0,0 +1,44 @@
import pathlib,subprocess,json,hashlib,tarfile,gzip,stat,shutil,os,time,io
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');BASE=pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-completed-checkouts-r14-20261016';TEMP=BASE/'.runtime/offload-validation-r14-20261016';CANDIDATES=json.loads(pathlib.Path('/private/tmp/p04-completed-checkouts-r14-candidates.json').read_text())
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
assert not E.exists() and not TEMP.exists()
initial=shutil.disk_usage(R).free;started=time.time();roots=[];unique={};total=0
for root_text in CANDIDATES['roots']:
root=pathlib.Path(root_text);name=root.name;assert root.is_dir() and not root.is_symlink();assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx'),'ignored/untracked content must be classified first'
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),('open files',name,ps.stdout)
files={};dirs={}
for p in sorted(root.rglob('*')):
rel=p.relative_to(root).as_posix();st=p.lstat();assert not stat.S_ISLNK(st.st_mode),str(p)
if rel=='.git':continue
if p.is_dir():dirs[rel]={'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};continue
assert p.is_file(),str(p);v=p.read_bytes();h=hashlib.sha256(v).hexdigest();assert len(v)==st.st_size
files[rel]={'bytes':len(v),'sha256':h,'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};total+=len(v)
unique.setdefault(h,{'source':str(p),'bytes':len(v)})
roots.append({'path':str(root),'name':name,'head':git(root,'rev-parse','HEAD'),'git_pointer':(root/'.git').read_text(),'files':files,'directories':dirs})
unique_bytes=sum(v['bytes'] for v in unique.values());assert shutil.disk_usage(R).free>=1024**3+unique_bytes+64*1024**2
E.mkdir(parents=True);TEMP.mkdir(parents=True)
(E/'CANDIDATES.json').write_text(json.dumps(CANDIDATES,ensure_ascii=False,indent=2)+'\n')
manifest={'protocol':'p04-ended-validation-cas-v1','production_repo':str(R),'scope':'Only 34 ended clean validation/review/integration/final checkouts from completed original units P08-02/P08-03/P24-03; current implementation/build/native raw/cache are excluded. All file bytes and metadata retained; .git administrative pointers are recorded for normal git worktree restoration.','roots':roots,'files':sum(len(v['files']) for v in roots),'logical_bytes':total,'unique_content_bytes':unique_bytes,'unique_blobs':len(unique)}
raw=json.dumps(manifest,ensure_ascii=False,sort_keys=True,separators=(',',':')).encode();mp=E/'MANIFEST.json.gz';mp.write_bytes(gzip.compress(raw,compresslevel=9,mtime=0))
archive=TEMP/'completed-checkouts-r14.cas.tar.gz'
with tarfile.open(archive,'w:gz',compresslevel=6) as tar:
ti=tarfile.TarInfo('manifest.json');ti.size=len(raw);ti.mtime=0;ti.mode=0o644;tar.addfile(ti,io.BytesIO(raw))
for h,v in sorted(unique.items()):
p=pathlib.Path(v['source']);assert sha(p)==h;ti=tarfile.TarInfo('blobs/'+h);ti.size=v['bytes'];ti.mtime=0;ti.mode=0o644
with p.open('rb') as f:tar.addfile(ti,f)
with tarfile.open(archive,'r:gz') as tar:
seen=set();m=tar.extractfile('manifest.json').read();assert m==raw
for member in tar:
if member.name=='manifest.json':continue
assert member.name.startswith('blobs/');h=member.name.split('/')[1];v=tar.extractfile(member).read();assert h in unique and len(v)==unique[h]['bytes'] and hashlib.sha256(v).hexdigest()==h;seen.add(h)
assert seen==set(unique)
parts=[];limit=16*1024**2
if archive.stat().st_size>limit:
with archive.open('rb') as f:
i=0
while block:=f.read(limit):
p=TEMP/(archive.name+'.part%03d'%i);p.write_bytes(block);parts.append({'path':str(p),'bytes':len(block),'sha256':hashlib.sha256(block).hexdigest()});i+=1
else:parts=[{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)}]
prep={'source_initial_free_bytes':initial,'source_logical_bytes':total,'unique_content_bytes':unique_bytes,'file_count':manifest['files'],'roots':[{k:v[k] for k in ['name','path','head']} for v in roots],'archive':{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)},'manifest':{'path':str(mp),'bytes':mp.stat().st_size,'sha256':sha(mp)},'upload_parts':parts,'local_tar_all_blobs_roundtrip':True,'prepared_seconds':time.time()-started,'free_after_preparation':shutil.disk_usage(R).free,'source_removed':False,'retirement_requires_cloud_full_readback_and_source_recheck':True}
(E/'PREPARATION.json').write_text(json.dumps(prep,ensure_ascii=False,indent=2)+'\n');(E/'prepare.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps({k:prep[k] for k in ['source_logical_bytes','unique_content_bytes','file_count','archive','manifest','upload_parts','prepared_seconds','free_after_preparation']},ensure_ascii=False),flush=True)
@@ -0,0 +1,68 @@
#!/usr/bin/env python3
"""Verify all bytes, or restore 34 archived completed-unit checkouts into fresh paths."""
import argparse,gzip,hashlib,json,os,pathlib,re,shutil,subprocess,tarfile,tempfile
HERE=pathlib.Path(__file__).resolve().parent
def digest(path):
h=hashlib.sha256()
with path.open('rb') as f:
while block:=f.read(1024*1024):h.update(block)
return h.hexdigest()
def relative(name):
p=pathlib.PurePosixPath(name)
if p.is_absolute() or '..' in p.parts or not p.parts or p.parts[0]=='.git':raise ValueError('unsafe source path')
return p
def main():
p=argparse.ArgumentParser(description=__doc__);p.add_argument('--archive',type=pathlib.Path,required=True);p.add_argument('--verify-only',action='store_true');p.add_argument('--destination-base',type=pathlib.Path);p.add_argument('--repo',type=pathlib.Path);p.add_argument('--files-only',action='store_true');p.add_argument('--git-bundles',type=pathlib.Path,default=HERE/'git-bundles.tar.gz');args=p.parse_args()
prep=json.loads((HERE/'PREPARATION.json').read_text());gm=json.loads((HERE/'GIT_RESTORE.json').read_text());assert digest(args.archive)==prep['archive']['sha256'],'archive SHA mismatch'
raw=gzip.decompress((HERE/'MANIFEST.json.gz').read_bytes());m=json.loads(raw);references={}
def destination_for(name):
root=next(v for v in m['roots'] if v['name']==name)
return args.destination_base/pathlib.Path(root['path']).parent.name/name
for root in m['roots']:
assert root['name'] in {v['name'] for v in prep['roots']} and pathlib.Path(root['path']).name==root['name'] and pathlib.Path(root['path']).parent.name in {'p08-02','p08-03-code','p24-03-code'} and re.fullmatch('[0-9a-f]{40}',root['head'])
for name,row in root['files'].items():relative(name);references.setdefault(row['sha256'],[]).append((root['name'],name,row));assert row['bytes']>=0
for name in root['directories']:relative(name)
def archive_pass(write=False):
seen=set()
with tarfile.open(args.archive,'r:gz') as tar:
for member in tar:
assert member.isfile() and not member.issym() and not member.islnk()
f=tar.extractfile(member)
if member.name=='manifest.json':assert f.read()==raw;continue
assert re.fullmatch('blobs/[0-9a-f]{64}',member.name);h=member.name.split('/')[1];assert h in references and h not in seen
data=f.read();assert hashlib.sha256(data).hexdigest()==h and all(len(data)==v[2]['bytes'] for v in references[h]);seen.add(h)
if write:
for root,name,row in references[h]:
target=destination_for(root)/name;target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes(data);target.chmod(row['mode']);os.utime(target,ns=(row['mtime_ns'],row['mtime_ns']))
assert seen==set(references)
archive_pass()
assert sum(len(r['files']) for r in m['roots'])==m['files']
if args.verify_only:print(json.dumps(dict(verified=True,files=m['files'],logical_bytes=m['logical_bytes'],unique_blobs=len(references))));return
assert args.destination_base and (args.files_only or args.repo),'choose explicit destination and repo or files-only'
args.destination_base=args.destination_base.resolve();args.destination_base.mkdir(parents=True,exist_ok=True)
for root in m['roots']:assert not (destination_for(root['name'])).exists(),'fresh destination required'
if not args.files_only:
assert digest(args.git_bundles)==gm['archive']['sha256'],'Git bundles SHA mismatch'
with tempfile.TemporaryDirectory(prefix='p04-restore-git-') as tmp:
with tarfile.open(args.git_bundles,'r:gz') as tar:
for member in tar:
assert member.isfile() and re.fullmatch('[0-9a-f]{40}.bundle',member.name)
target=pathlib.Path(tmp)/member.name;target.write_bytes(tar.extractfile(member).read());record=next(r for r in gm['commits'] if r.get('file')==member.name);assert digest(target)==record['sha256']
subprocess.run(['git','-C',str(args.repo),'bundle','verify',str(target)],check=True,capture_output=True)
subprocess.run(['git','-C',str(args.repo),'bundle','unbundle',str(target)],check=True,capture_output=True)
for root in m['roots']:subprocess.run(['git','-C',str(args.repo),'worktree','add','--detach',str(destination_for(root['name'])),root['head']],check=True)
else:
for root in m['roots']:(destination_for(root['name'])).mkdir(parents=True)
archive_pass(write=True)
for root in m['roots']:
destination=destination_for(root['name'])
for name,record in sorted(root['directories'].items(),key=lambda q:len(pathlib.PurePosixPath(q[0]).parts),reverse=True):
target=destination/name;target.mkdir(parents=True,exist_ok=True);target.chmod(record['mode']);os.utime(target,ns=(record['mtime_ns'],record['mtime_ns']))
actual={f.relative_to(destination).as_posix() for f in destination.rglob('*') if f.is_file() and f.relative_to(destination).as_posix()!='.git'};assert actual==set(root['files'])
for name,row in root['files'].items():
f=destination/name;assert digest(f)==row['sha256'] and f.stat().st_size==row['bytes'] and f.stat().st_mtime_ns==row['mtime_ns']
(args.destination_base/'RESTORED_COMMITS.json').write_text(json.dumps([{k:r[k] for k in ['name','head']} for r in m['roots']],indent=2)+'\n')
print(json.dumps(dict(restored=True,files=m['files'],destination=str(args.destination_base))))
if __name__=='__main__':main()
@@ -0,0 +1,49 @@
import pathlib,json,gzip,hashlib,subprocess,stat,shutil,sqlite3,datetime,time
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-completed-checkouts-r14-20261016';prep=json.loads((E/'PREPARATION.json').read_text());m=json.loads(gzip.decompress((E/'MANIFEST.json.gz').read_bytes()));cloud=json.loads((E/'CLOUD_ALL_BYTES_VERIFIED.json').read_text());assert cloud['all_eight_cloud_files_full_readback_verified'] and cloud['whole_archive_sha256']==prep['archive']['sha256']
C=sqlite3.connect('file:/Users/korizatou114/Library/Application Support/agent-control/the-tree-p04-01/state.sqlite?mode=ro',uri=True);running=C.execute("SELECT id,task_id,role,pid FROM runs WHERE status='running'").fetchall()
# Only this separately scoped implementation may run; none of the five ended
# validation paths is an input to it. Recheck each target with lsof below.
for run_id,task_id,role,pid in running:
assert run_id=='24d43100b6dc47d784ed6bac550c501a' and task_id=='P04-01' and role=='implementer'
assert C.execute('SELECT worktree FROM tasks WHERE id=?',(task_id,)).fetchone()[0]=='/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement'
subprocess.run(['/bin/kill','-0',str(pid)],check=True,capture_output=True)
cwd=subprocess.check_output(['/usr/sbin/lsof','-a','-p',str(pid),'-d','cwd','-Fn'],text=True)
assert '\nn/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement\n' in cwd
pg=subprocess.run(['/usr/bin/pgrep','-fl','/Applications/Godot.app|Godot.*headless'],capture_output=True,text=True);assert pg.returncode==1 and not pg.stdout.strip(),'wait for all owned engines'
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
candidates=json.loads((E/'CANDIDATES.json').read_text())
wp=json.loads((R/'docs/plans/original-completion-2026-10-02/work_packages.json').read_text())
states={u['id']:u['state'] for p in wp for u in p['remaining_deliverables']}
for project in candidates['Runner_projects']:
assert states[project['original_unit']]=='completed'
db=pathlib.Path('/Users/korizatou114/Library/Application Support/agent-control')/project['project']/'state.sqlite'
connection=sqlite3.connect('file:'+str(db)+'?mode=ro',uri=True)
assert not connection.execute("SELECT 1 FROM runs WHERE status='running'").fetchone()
checks=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert str(root) in candidates['roots'] and root.parent.parent==pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees') and root.parent.name in {'p08-02','p08-03-code','p24-03-code'} and root.name==row['name'] and not root.name.endswith('-implement')
assert git(root,'rev-parse','HEAD')==row['head'];assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx')
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),'open source validation files'
actual={p.relative_to(root).as_posix() for p in root.rglob('*') if p.is_file() and p.relative_to(root).as_posix()!='.git'};assert actual==set(row['files'])
for name,v in row['files'].items():
p=root/name;s=p.stat();assert not p.is_symlink() and s.st_size==v['bytes'] and stat.S_IMODE(s.st_mode)==v['mode'] and s.st_mtime_ns==v['mtime_ns'];assert hashlib.sha256(p.read_bytes()).hexdigest()==v['sha256']
checks.append({'path':str(root),'head':row['head'],'all_files_rehashed':len(actual),'clean':True,'open_files':False})
(E/'SOURCE_RECHECK.json').write_text(json.dumps({'checks':checks,'cloud_full_bytes_verified':True,'all_sources_retained_at_check':True},ensure_ascii=False,indent=2)+'\n')
before=shutil.disk_usage(R).free;started=time.time();removed=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert git(root,'rev-parse','HEAD')==row['head'];subprocess.run(['git','-C',str(R),'worktree','remove',str(root)],check=True,capture_output=True);assert not root.exists();removed.append({'path':str(root),'head':row['head']})
after_sources=shutil.disk_usage(R).free
T=pathlib.Path(prep['archive']['path']).parent;gitmeta=json.loads((E/'GIT_RESTORE.json').read_text());kit=json.loads((E/'RESTORE_KIT.json').read_text());expected={prep['archive']['path']:prep['archive']['sha256'],kit['path']:kit['sha256'],gitmeta['archive']['path']:gitmeta['archive']['sha256']}
for part in prep['upload_parts']:expected[part['path']]=part['sha256']
for v in gitmeta['commits']:
if v.get('file'):expected[str(T/'git-bundles'/v['file'])]=v['sha256']
actual={str(p) for p in T.rglob('*') if p.is_file()};assert actual==set(expected),'unknown temporary data must not be removed'
temporary_bytes=0
for name,h in expected.items():
p=pathlib.Path(name);assert p.is_relative_to(T) and not p.is_symlink() and hashlib.sha256(p.read_bytes()).hexdigest()==h;temporary_bytes+=p.stat().st_size
for name in expected:pathlib.Path(name).unlink()
for p in sorted([p for p in T.rglob('*') if p.is_dir()],key=lambda p:len(p.parts),reverse=True):p.rmdir()
T.rmdir();after_all=shutil.disk_usage(R).free
report={'removed_ended_completed_unit_checkouts':removed,'source_file_count':m['files'],'source_logical_bytes':m['logical_bytes'],'cloud_all_bytes_verified':True,'source_files_all_rehashed_before_normal_git_worktree_remove':True,'before_sources_free_bytes':before,'after_sources_free_bytes':after_sources,'observed_source_retirement_free_delta_bytes':after_sources-before,'temporary_pack_logical_bytes_removed':temporary_bytes,'after_own_temporary_cleanup_free_bytes':after_all,'own_temporary_cleanup_observed_delta_bytes':after_all-after_sources,'measurement_note':'Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.','concurrent_isolated_implementation':running,'elapsed_seconds':time.time()-started,'recorded_at':datetime.datetime.now(datetime.timezone.utc).isoformat()}
(E/'RETIREMENT.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');(E/'retire.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps(report,ensure_ascii=False),flush=True)
@@ -0,0 +1,30 @@
{
"files": [
{
"name": "MANIFEST.json",
"url": "https://drive.google.com/file/d/1I0dCIIRucT0N0GnprOofSHhGSrdM8F0u/view?usp=drivesdk",
"id": "1I0dCIIRucT0N0GnprOofSHhGSrdM8F0u",
"sha256": "586ba62da712fd17a7f02ed86a0223cb5293465ff45a4e8757a9dcb670f4b22b",
"bytes": 14356,
"raw_readback_verified": true
},
{
"name": "restore.py",
"url": "https://drive.google.com/file/d/1QjS6v6ht63O5KStHwVaN0AUH5fLG5eKu/view?usp=drivesdk",
"id": "1QjS6v6ht63O5KStHwVaN0AUH5fLG5eKu",
"sha256": "1082a4581b677345d4b1b1a8172ecd40224b59242b0e19a84a3016cd41c5c2e1",
"bytes": 2132,
"raw_readback_verified": true
},
{
"name": "RESTORE.md",
"url": "https://drive.google.com/file/d/1NpNkNhJn60d78u9GX4wHmZCDvI0B4cJv/view?usp=drivesdk",
"id": "1NpNkNhJn60d78u9GX4wHmZCDvI0B4cJv",
"sha256": "9a33b568f276b4d3c1746be68cb37303295ba8a1ee31abc8d5f18624ce823454",
"bytes": 1638,
"raw_readback_verified": true
}
],
"all_restore_bytes_identical": true,
"formal_credit": 0
}
@@ -0,0 +1,25 @@
{
"all_three_whole_zip_bytes_verified": true,
"files": [
{
"variant": "optional-capture",
"sha256": "e593c0c4675672d773b91e8297a7380f18c2750ba05c205c44426ef14d00d96f",
"bytes": 90662752,
"actual_cloud_readback_verified": true
},
{
"variant": "unsorted-membership",
"sha256": "ed60d7e4954a3c55e92ecf1520b596322ecd3c4342f778d55e90d6ac39accd46",
"bytes": 90662748,
"actual_cloud_readback_verified": true
},
{
"variant": "p02-03-r05",
"sha256": "9af0ef42b97f71fd09587990c5b1d8ce14792252eb05a32cd58a1197f60f5a29",
"bytes": 90702153,
"actual_cloud_readback_verified": true
}
],
"all_members_already_matched_local_distribution": true,
"formal_credit": 0
}
@@ -0,0 +1,374 @@
{
"scope": "Only three historical 2026-10-10-era Windows ZIPs and their byte-identical extracted distribution copies. Keep export proof/source/receipts locally. These are not same-current-final-Windows acceptance.",
"items": [
{
"name": "windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "e593c0c4675672d773b91e8297a7380f18c2750ba05c205c44426ef14d00d96f",
"bytes": 90662752,
"mode": 420,
"mtime_ns": 1791447754699533163
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "3cdaf0486c49726b51be7e577bd2f54c6f0b11c9ce5da942858e5515d91ee401",
"bytes": 78128,
"mode": 420,
"mtime_ns": 1791447751172997493
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791447751024554474
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791447751024808764
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791447751025013138
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791447751025225637
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791447751025448470
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791447751025653219
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791447751025835343
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791447751026447590
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "85cf9fe0dcc1133c6e048d61f545c0f034d123c1497c6a7089359f3df3350092",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791447751026376257
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791447746011119869
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "84be6eb5d1894a2169fbd8efa2f780b486af3aaad06f6c57f36416d8fd521440",
"bytes": 54201240,
"mode": 420,
"mtime_ns": 1791447747133086561
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791447743913272805
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982101539818954
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791981559275304647
}
],
"export_actual_pid": 86640,
"export_ended": true,
"cloud": {
"id": "1CDHCS8q3Tpo32Hn1L4XAXekl9jCRXrIg",
"url": "https://drive.google.com/file/d/1CDHCS8q3Tpo32Hn1L4XAXekl9jCRXrIg/view?usp=drivesdk",
"file_name": "old-windows-r09-optional-capture.zip",
"mime_type": "application/zip"
}
},
{
"name": "windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "ed60d7e4954a3c55e92ecf1520b596322ecd3c4342f778d55e90d6ac39accd46",
"bytes": 90662748,
"mode": 420,
"mtime_ns": 1791440560198659367
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "e7716509c394d39d20d4bc9a4ee44264b4be531ab9f0a6b34f84be081e4602b1",
"bytes": 78266,
"mode": 420,
"mtime_ns": 1791440556615471577
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791440556477071156
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791440556478418946
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791440556478634613
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791440556478832571
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791440556479017446
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791440556479196863
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791440556479347904
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791440556479929321
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "9b06033e7d236994bb235c18774fdc9bb7d5f13c737d5828f02121452a532629",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791440556479864987
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791440551426619577
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "f5062056cd7c6b78f09d6367dd53eb7b009cf60c7606ea309b7270249e9cb04e",
"bytes": 54201256,
"mode": 420,
"mtime_ns": 1791440552552264643
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791440549272303096
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982207139806136
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791982207163831145
}
],
"export_actual_pid": 98873,
"export_ended": true,
"cloud": {
"id": "1B--rlPkZQXeYNDjUfatT-GeAD9qkD3yz",
"url": "https://drive.google.com/file/d/1B--rlPkZQXeYNDjUfatT-GeAD9qkD3yz/view?usp=drivesdk",
"file_name": "old-windows-r09-unsorted-membership.zip",
"mime_type": "application/zip"
}
},
{
"name": "p02-03-r05-windows-export-native-r03",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p02-03-r05-windows-export-native-r03",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p02-03-r05-windows-export-native-r03/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "9af0ef42b97f71fd09587990c5b1d8ce14792252eb05a32cd58a1197f60f5a29",
"bytes": 90702153,
"mode": 420,
"mtime_ns": 1791592216411888023
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "2a1d70f0039adbc828a5c52d91bac5d1eb8d734ed29ca6bda76ae893cfb48f66",
"bytes": 131644,
"mode": 420,
"mtime_ns": 1791592212691480397
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791592212540839014
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791592212541078098
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791592212541294224
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791592212541528099
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791592212541718058
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791592212541924350
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791592212542107268
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791592212542769853
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "8bbb18bd12a474e944eb7ee28075ac53fdbd54f62d70e2b45badee5ebc84d08a",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791592212542695227
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791592208392309717
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "7861bf1bc23dc89a5c691a67f56a9543411db51e75031746ebb78c14f2e69edd",
"bytes": 54233448,
"mode": 420,
"mtime_ns": 1791592209697660994
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791592206037560564
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982206015145547
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791982206031488742
}
],
"export_actual_pid": 44792,
"export_ended": true,
"cloud": {
"id": "1BpD0syDcUN5oZJsJ8KNH7lHTceHrxHKK",
"url": "https://drive.google.com/file/d/1BpD0syDcUN5oZJsJ8KNH7lHTceHrxHKK/view?usp=drivesdk",
"file_name": "old-windows-r09-p02-03-r05.zip",
"mime_type": "application/zip"
}
}
],
"full_zip_and_all_extracted_members_verified": true,
"new_original_acceptance_credit": 0,
"local_retirement_pending_cloud_readback": true
}
@@ -0,0 +1,359 @@
{
"scope": "Only three historical 2026-10-10-era Windows ZIPs and their byte-identical extracted distribution copies. Keep export proof/source/receipts locally. These are not same-current-final-Windows acceptance.",
"items": [
{
"name": "windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "e593c0c4675672d773b91e8297a7380f18c2750ba05c205c44426ef14d00d96f",
"bytes": 90662752,
"mode": 420,
"mtime_ns": 1791447754699533163
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "3cdaf0486c49726b51be7e577bd2f54c6f0b11c9ce5da942858e5515d91ee401",
"bytes": 78128,
"mode": 420,
"mtime_ns": 1791447751172997493
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791447751024554474
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791447751024808764
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791447751025013138
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791447751025225637
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791447751025448470
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791447751025653219
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791447751025835343
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791447751026447590
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "85cf9fe0dcc1133c6e048d61f545c0f034d123c1497c6a7089359f3df3350092",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791447751026376257
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791447746011119869
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "84be6eb5d1894a2169fbd8efa2f780b486af3aaad06f6c57f36416d8fd521440",
"bytes": 54201240,
"mode": 420,
"mtime_ns": 1791447747133086561
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791447743913272805
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982101539818954
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791981559275304647
}
],
"export_actual_pid": 86640,
"export_ended": true,
"cloud": null
},
{
"name": "windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "ed60d7e4954a3c55e92ecf1520b596322ecd3c4342f778d55e90d6ac39accd46",
"bytes": 90662748,
"mode": 420,
"mtime_ns": 1791440560198659367
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "e7716509c394d39d20d4bc9a4ee44264b4be531ab9f0a6b34f84be081e4602b1",
"bytes": 78266,
"mode": 420,
"mtime_ns": 1791440556615471577
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791440556477071156
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791440556478418946
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791440556478634613
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791440556478832571
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791440556479017446
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791440556479196863
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791440556479347904
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791440556479929321
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "9b06033e7d236994bb235c18774fdc9bb7d5f13c737d5828f02121452a532629",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791440556479864987
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791440551426619577
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "f5062056cd7c6b78f09d6367dd53eb7b009cf60c7606ea309b7270249e9cb04e",
"bytes": 54201256,
"mode": 420,
"mtime_ns": 1791440552552264643
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791440549272303096
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982207139806136
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791982207163831145
}
],
"export_actual_pid": 98873,
"export_ended": true,
"cloud": null
},
{
"name": "p02-03-r05-windows-export-native-r03",
"source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p02-03-r05-windows-export-native-r03",
"zip": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p02-03-r05-windows-export-native-r03/TheTree-Windows-current-source-release-candidate.zip",
"sha256": "9af0ef42b97f71fd09587990c5b1d8ce14792252eb05a32cd58a1197f60f5a29",
"bytes": 90702153,
"mode": 420,
"mtime_ns": 1791592216411888023
},
"files": [
{
"relative_path": "TheTree/BUILD_MANIFEST.json",
"sha256": "2a1d70f0039adbc828a5c52d91bac5d1eb8d734ed29ca6bda76ae893cfb48f66",
"bytes": 131644,
"mode": 420,
"mtime_ns": 1791592212691480397
},
{
"relative_path": "TheTree/LICENSES/Godot-LICENSE.txt",
"sha256": "b0435e3b3e4e55238f05f4b306f30524a1b2e20147810d436eaa554fa6855c80",
"bytes": 1149,
"mode": 420,
"mtime_ns": 1791592212540839014
},
{
"relative_path": "TheTree/LICENSES/Godot-third-party.txt",
"sha256": "908aaf7ad53efa3f6d948b3265b6a4a660f9cc532c1caba7923a1292d3b8dda0",
"bytes": 103199,
"mode": 420,
"mtime_ns": 1791592212541078098
},
{
"relative_path": "TheTree/LICENSES/Kenney-InterfaceSounds.txt",
"sha256": "f7966c773bbed0eca6a9c75081c44a178b38eae112724dbb5fdfbd4192d118a9",
"bytes": 574,
"mode": 420,
"mtime_ns": 1791592212541294224
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyDungeon.txt",
"sha256": "9f574a2f1f636a3db8a0665ba90212f34e2b5e61ecb533d77c05237766374111",
"bytes": 570,
"mode": 420,
"mtime_ns": 1791592212541528099
},
{
"relative_path": "TheTree/LICENSES/Kenney-TinyTown.txt",
"sha256": "c483c167cc3bdfe17c15f957ff847d409f64d81b410b28783636cf3b2b7814c5",
"bytes": 567,
"mode": 420,
"mtime_ns": 1791592212541718058
},
{
"relative_path": "TheTree/LICENSES/kenney-interface-sounds-source.json",
"sha256": "f981c2ce12ed364010217dee996908f037d2abfcc3b21b8cf501dd591f7744c9",
"bytes": 1330,
"mode": 420,
"mtime_ns": 1791592212541924350
},
{
"relative_path": "TheTree/LICENSES/kenney-sources.json",
"sha256": "708f5980d0e740f6a7bf1e7fbd0d8964292729309c1a3eeafc367fb94f119b76",
"bytes": 724,
"mode": 420,
"mtime_ns": 1791592212542107268
},
{
"relative_path": "TheTree/README.txt",
"sha256": "59e86b72fe6087dc6c83a8bffd4041046cc33c4513d9fe25e0bde1c0b5cf057e",
"bytes": 240,
"mode": 420,
"mtime_ns": 1791592212542769853
},
{
"relative_path": "TheTree/SOURCE_MANIFEST.json",
"sha256": "8bbb18bd12a474e944eb7ee28075ac53fdbd54f62d70e2b45badee5ebc84d08a",
"bytes": 152598,
"mode": 420,
"mtime_ns": 1791592212542695227
},
{
"relative_path": "TheTree/TheTree.exe",
"sha256": "d34d36f3be1a6c49c56525ae86469b92e4f417ddf0b43cf00dd80c385c4b0562",
"bytes": 109268480,
"mode": 420,
"mtime_ns": 1791592208392309717
},
{
"relative_path": "TheTree/TheTree.pck",
"sha256": "7861bf1bc23dc89a5c691a67f56a9543411db51e75031746ebb78c14f2e69edd",
"bytes": 54233448,
"mode": 420,
"mtime_ns": 1791592209697660994
}
],
"directories": [
{
"path": ".",
"mode": 493,
"mtime_ns": 1791592206037560564
},
{
"path": "TheTree",
"mode": 493,
"mtime_ns": 1791982206015145547
},
{
"path": "TheTree/LICENSES",
"mode": 493,
"mtime_ns": 1791982206031488742
}
],
"export_actual_pid": 44792,
"export_ended": true,
"cloud": null
}
],
"full_zip_and_all_extracted_members_verified": true,
"new_original_acceptance_credit": 0,
"local_retirement_pending_cloud_readback": true
}
@@ -0,0 +1,22 @@
# Historical Windows packages r09 restore
The three whole ZIPs were downloaded back from Drive and byte-hashed before local retirement. Every ZIP entry was separately verified against the existing extracted distribution and historical package-integrity.json. No Windows device acceptance is claimed. Export receipts, logs, source maps and other proof stay local.
Download MANIFEST.json, restore.py and all three ZIPs from the recorded Drive URLs. With Python 3.12:
`python3 restore.py MANIFEST.json /fresh/destination optional-capture.zip unsorted-membership.zip p02-03-r05.zip`
ZIP names do not matter; all three hashes must match. The script refuses existing output folders, verifies ZIPs and all extracted files, and restores file modes/mtimes. To use the old original artifact paths, first restore to a fresh directory, then move only the verified ZIP/distribution into the original artifact folder while preserving existing reports.
windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070
https://drive.google.com/file/d/1CDHCS8q3Tpo32Hn1L4XAXekl9jCRXrIg/view?usp=drivesdk
SHA256 e593c0c4675672d773b91e8297a7380f18c2750ba05c205c44426ef14d00d96f
windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421
https://drive.google.com/file/d/1B--rlPkZQXeYNDjUfatT-GeAD9qkD3yz/view?usp=drivesdk
SHA256 ed60d7e4954a3c55e92ecf1520b596322ecd3c4342f778d55e90d6ac39accd46
p02-03-r05-windows-export-native-r03
https://drive.google.com/file/d/1BpD0syDcUN5oZJsJ8KNH7lHTceHrxHKK/view?usp=drivesdk
SHA256 9af0ef42b97f71fd09587990c5b1d8ce14792252eb05a32cd58a1197f60f5a29
@@ -0,0 +1,15 @@
{
"retired_packages": [
"windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070",
"windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421",
"p02-03-r05-windows-export-native-r03"
],
"zip_bytes": 272027653,
"distribution_bytes": 491512275,
"free_before": 1167253504,
"free_after": 1644806144,
"net_free_delta": 477552640,
"all_export_proofs_and_sources_retained": true,
"all_zip_and_restore_bytes_verified_in_Drive": true,
"formal_credit": 0
}
@@ -0,0 +1,6 @@
{
"all_three_zip_and_36_distribution_members_exact": true,
"no_open_files": true,
"cloud_zip_and_restore_byte_verification_complete": true,
"formal_credit": 0
}
@@ -0,0 +1,26 @@
"""Restore archived historical ZIPs and exact distribution bytes to a fresh folder."""
import argparse,hashlib,json,os,shutil,zipfile
from pathlib import Path
def sha(p):
with p.open('rb')as f:return hashlib.file_digest(f,'sha256').hexdigest()
p=argparse.ArgumentParser();p.add_argument('manifest');p.add_argument('destination');p.add_argument('archives',nargs='+');a=p.parse_args();m=json.loads(Path(a.manifest).read_text());root=Path(a.destination).resolve();archives={}
for name in a.archives:
path=Path(name);h=sha(path);assert h not in archives;archives[h]=path
assert set(archives)=={x['zip']['sha256']for x in m['items']}
for item in m['items']:
dest=root/item['name'];assert dest.resolve().is_relative_to(root)and not dest.exists()and not dest.is_symlink();source=archives[item['zip']['sha256']];assert source.stat().st_size==item['zip']['bytes'];dest.mkdir(parents=True)
target=dest/Path(item['zip']['path']).name
with source.open('rb')as inp,target.open('xb')as out:shutil.copyfileobj(inp,out,1024**2)
assert sha(target)==item['zip']['sha256'];os.chmod(target,item['zip']['mode']);os.utime(target,ns=(item['zip']['mtime_ns'],item['zip']['mtime_ns']))
files={x['relative_path']:x for x in item['files']}
with zipfile.ZipFile(source)as archive:
assert set(archive.namelist())==set(files)and len(archive.infolist())==len(files)
for name,x in files.items():
relative=Path(name);assert not relative.is_absolute()and '..'not in relative.parts;path=dest/'distribution'/relative;assert path.resolve().is_relative_to(dest)and not path.exists();path.parent.mkdir(parents=True,exist_ok=True);h=hashlib.sha256()
with archive.open(name)as inp,path.open('xb')as out:
for chunk in iter(lambda:inp.read(1024**2),b''):h.update(chunk);out.write(chunk)
assert h.hexdigest()==x['sha256']and path.stat().st_size==x['bytes'];os.chmod(path,x['mode']);os.utime(path,ns=(x['mtime_ns'],x['mtime_ns']))
for d in reversed(item['directories']):
path=dest/'distribution'/d['path'];os.chmod(path,d['mode']);os.utime(path,ns=(d['mtime_ns'],d['mtime_ns']))
print('Verified and restored',len(m['items']),'historical packages')
@@ -0,0 +1,18 @@
from pathlib import Path
import json,hashlib,zipfile,time
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');a=r/'artifacts/original-completion-2026-10-02';e=r/'docs/plans/original-completion-2026-10-02/execution/drive-offload-old-windows-r09-20261015';e.mkdir(exist_ok=False);names=['windows-current1299-optional-capture-release-candidate-r01-46fc6c398e3d42a4a0a55646d495b070','windows-current1299-unsorted-membership-release-candidate-r01-4a758a1bb6f24fbfb0b1a5dff56d0421','p02-03-r05-windows-export-native-r03'];items=[]
def sha(p):
with p.open('rb')as f:return hashlib.file_digest(f,'sha256').hexdigest()
for name in names:
p=a/name;z=p/'TheTree-Windows-current-source-release-candidate.zip';integrity=json.loads((p/'package-integrity.json').read_text());process=json.loads((p/'export-process.json').read_text());assert process['passed']and process['native_process']['owned_popen_ended']and process['native_process']['exit_code']==0;assert sha(z)==integrity['zip_sha256'];st=z.stat();files=[];directories=[]
with zipfile.ZipFile(z)as archive:
for info in archive.infolist():
assert not info.is_dir();path=Path(info.filename);assert not path.is_absolute()and '..'not in path.parts;source=p/'distribution'/path;assert source.is_file()and not source.is_symlink();digest=hashlib.sha256()
with archive.open(info)as f:
for chunk in iter(lambda:f.read(1024**2),b''):digest.update(chunk)
h=digest.hexdigest();s=source.stat();assert h==sha(source)==integrity['members'][info.filename]and s.st_size==info.file_size;files.append({'relative_path':info.filename,'sha256':h,'bytes':s.st_size,'mode':s.st_mode&0o777,'mtime_ns':s.st_mtime_ns})
assert set(x['relative_path']for x in files)=={str(x.relative_to(p/'distribution'))for x in (p/'distribution').rglob('*')if x.is_file()}
for source in [p/'distribution']+sorted(x for x in (p/'distribution').rglob('*')if x.is_dir()):
s=source.stat();directories.append({'path':'.'if source==p/'distribution'else str(source.relative_to(p/'distribution')),'mode':s.st_mode&0o777,'mtime_ns':s.st_mtime_ns})
items.append({'name':name,'source':str(p),'zip':{'path':str(z),'sha256':integrity['zip_sha256'],'bytes':st.st_size,'mode':st.st_mode&0o777,'mtime_ns':st.st_mtime_ns},'files':files,'directories':directories,'export_actual_pid':process['actual_pid'],'export_ended':True,'cloud':None})
result={'scope':'Only three historical 2026-10-10-era Windows ZIPs and their byte-identical extracted distribution copies. Keep export proof/source/receipts locally. These are not same-current-final-Windows acceptance.','items':items,'full_zip_and_all_extracted_members_verified':True,'new_original_acceptance_credit':0,'local_retirement_pending_cloud_readback':True};(e/'MANIFEST.pending.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');print({'archives':len(items),'zip_upload_bytes':sum(x['zip']['bytes']for x in items),'extracted_bytes':sum(f['bytes']for x in items for f in x['files'])})
@@ -0,0 +1,18 @@
from pathlib import Path
import json,hashlib,subprocess,shutil
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');e=r/'docs/plans/original-completion-2026-10-02/execution/drive-offload-old-windows-r09-20261015';m=json.loads((e/'MANIFEST.json').read_text());v=json.loads((e/'CLOUD_ZIPS_VERIFIED.json').read_text());meta=json.loads((e/'CLOUD_RESTORE_METADATA_VERIFIED.json').read_text());assert v['all_three_whole_zip_bytes_verified']and len(v['files'])==3 and meta['all_restore_bytes_identical']and len(meta['files'])==3
for row in meta['files']:assert hashlib.sha256((e/row['name']).read_bytes()).hexdigest()==row['sha256']
def sha(p):
with p.open('rb')as f:return hashlib.file_digest(f,'sha256').hexdigest()
for x in m['items']:
root=Path(x['source']);assert root.parent==r/'artifacts/original-completion-2026-10-02';check=subprocess.run(['lsof','-nP','+D',str(root/'distribution')],capture_output=True);assert check.returncode==1 and not check.stdout;check=subprocess.run(['lsof','-nP',x['zip']['path']],capture_output=True);assert check.returncode==1 and not check.stdout
assert sha(Path(x['zip']['path']))==x['zip']['sha256'];assert set(str(p.relative_to(root/'distribution'))for p in(root/'distribution').rglob('*')if p.is_file())=={f['relative_path']for f in x['files']}
for f in x['files']:
p=root/'distribution'/f['relative_path'];assert not p.is_symlink();s=p.stat();assert sha(p)==f['sha256']and s.st_size==f['bytes']and s.st_mode&0o777==f['mode']and s.st_mtime_ns==f['mtime_ns']
(e/'SOURCE_RECHECK.json').write_text(json.dumps({'all_three_zip_and_36_distribution_members_exact':True,'no_open_files':True,'cloud_zip_and_restore_byte_verification_complete':True,'formal_credit':0},indent=2)+'\n');before=shutil.disk_usage(r).free;retired=[]
for x in m['items']:
root=Path(x['source']);dist=root/'distribution';hold=root/'.distribution-retiring-r09';assert not hold.exists();dist.rename(hold)
for f in x['files']:(hold/f['relative_path']).unlink()
for p in sorted([p for p in hold.rglob('*')if p.is_dir()],key=lambda p:len(p.parts),reverse=True):p.rmdir()
hold.rmdir();Path(x['zip']['path']).unlink();pointer={'cloud_zip':x['cloud'],'zip_sha256':x['zip']['sha256'],'zip_bytes':x['zip']['bytes'],'source_and_export_proofs_retained_locally':True,'restore_metadata':meta['files'],'local_manifest':str(e/'MANIFEST.json'),'local_restore':str(e/'RESTORE.md'),'same_current_final_Windows_acceptance':False,'formal_credit':0};(root/'CLOUD_WINDOWS_R09.json').write_text(json.dumps(pointer,indent=2)+'\n');retired.append(x['name'])
after=shutil.disk_usage(r).free;result={'retired_packages':retired,'zip_bytes':sum(x['zip']['bytes']for x in m['items']),'distribution_bytes':sum(f['bytes']for x in m['items']for f in x['files']),'free_before':before,'free_after':after,'net_free_delta':after-before,'all_export_proofs_and_sources_retained':True,'all_zip_and_restore_bytes_verified_in_Drive':True,'formal_credit':0};(e/'RETIREMENT.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');print(json.dumps(result,ensure_ascii=False))
@@ -0,0 +1,64 @@
{
"parts": [
{
"index": 0,
"name": "p04-ended-validation-r12.cas.tar.gz.part000",
"url": "https://drive.google.com/file/d/1D3u7DwHgSewhA_UhTbEGmApCSW6woZun/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "f6fcb57bd521e482eebb0e195c3f87bffea7a767982dcdbbd30ee629077b5524",
"full_readback_verified": true
},
{
"index": 1,
"name": "p04-ended-validation-r12.cas.tar.gz.part001",
"url": "https://drive.google.com/file/d/1VPpqe6xJAExRLaS6RdOjdqlzeycs20qF/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "f529967973483bbdcbf529144323b81cc1b7396c4842409ccbe74b72d8c92667",
"full_readback_verified": true
},
{
"index": 2,
"name": "p04-ended-validation-r12.cas.tar.gz.part002",
"url": "https://drive.google.com/file/d/1F8DgtjS39u8yT-G9fFbfu3mTykYmNYrI/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "85d003267f8dc9f80c645ef87fc1cd8b02344a497d68a81354feb46fa588416b",
"full_readback_verified": true
},
{
"index": 3,
"name": "p04-ended-validation-r12.cas.tar.gz.part003",
"url": "https://drive.google.com/file/d/1yd2HvlRIGiilWBhgD3X3GbxBMwdysZnf/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "8f2c17d854a5932574e197c5e9c3b371255127a3f5cf730f545f2324bb5eb6b5",
"full_readback_verified": true
},
{
"index": 4,
"name": "p04-ended-validation-r12.cas.tar.gz.part004",
"url": "https://drive.google.com/file/d/180jC7-Tc5AJMJJOUd3k51ovWvP-GO_3O/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "2856bbe174dbf813530ab33d3f5ef3b70d5ab2eceff1d0bbacab9e55b63bbe4f",
"full_readback_verified": true
},
{
"index": 5,
"name": "p04-ended-validation-r12.cas.tar.gz.part005",
"url": "https://drive.google.com/file/d/1xE60zximcIV33KRbMfSPwJUeOsrJHbpS/view?usp=drivesdk",
"bytes": 7048851,
"sha256": "b1b4c1f715c93d6a1de7d62c09c88adc1263a7888ca0b7074354fa8ef85add4b",
"full_readback_verified": true
}
],
"whole_archive_sha256": "f0cc1910a4e6b551664378871a3da953c79bcc2d8a5e83d7b4dc7cb8b7a384c5",
"whole_archive_bytes": 90934931,
"all_cloud_part_bytes_verified": true,
"source_not_removed": true,
"restore_kit": {
"url": "https://drive.google.com/file/d/1FUaqcQR4opi8tiDeWrdB4WUcTsvtMR5m/view?usp=drivesdk",
"id": "1FUaqcQR4opi8tiDeWrdB4WUcTsvtMR5m",
"bytes": 1439897,
"sha256": "b71b0bc93d15f0f5e135981878c7afb7810f1175eddafac4c9405bc4afd94b14",
"full_readback_verified": true
},
"all_seven_cloud_files_full_readback_verified": true
}
@@ -0,0 +1,56 @@
{
"parts": [
{
"index": 0,
"name": "p04-ended-validation-r12.cas.tar.gz.part000",
"url": "https://drive.google.com/file/d/1D3u7DwHgSewhA_UhTbEGmApCSW6woZun/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "f6fcb57bd521e482eebb0e195c3f87bffea7a767982dcdbbd30ee629077b5524",
"full_readback_verified": true
},
{
"index": 1,
"name": "p04-ended-validation-r12.cas.tar.gz.part001",
"url": "https://drive.google.com/file/d/1VPpqe6xJAExRLaS6RdOjdqlzeycs20qF/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "f529967973483bbdcbf529144323b81cc1b7396c4842409ccbe74b72d8c92667",
"full_readback_verified": true
},
{
"index": 2,
"name": "p04-ended-validation-r12.cas.tar.gz.part002",
"url": "https://drive.google.com/file/d/1F8DgtjS39u8yT-G9fFbfu3mTykYmNYrI/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "85d003267f8dc9f80c645ef87fc1cd8b02344a497d68a81354feb46fa588416b",
"full_readback_verified": true
},
{
"index": 3,
"name": "p04-ended-validation-r12.cas.tar.gz.part003",
"url": "https://drive.google.com/file/d/1yd2HvlRIGiilWBhgD3X3GbxBMwdysZnf/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "8f2c17d854a5932574e197c5e9c3b371255127a3f5cf730f545f2324bb5eb6b5",
"full_readback_verified": true
},
{
"index": 4,
"name": "p04-ended-validation-r12.cas.tar.gz.part004",
"url": "https://drive.google.com/file/d/180jC7-Tc5AJMJJOUd3k51ovWvP-GO_3O/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "2856bbe174dbf813530ab33d3f5ef3b70d5ab2eceff1d0bbacab9e55b63bbe4f",
"full_readback_verified": true
},
{
"index": 5,
"name": "p04-ended-validation-r12.cas.tar.gz.part005",
"url": "https://drive.google.com/file/d/1xE60zximcIV33KRbMfSPwJUeOsrJHbpS/view?usp=drivesdk",
"bytes": 7048851,
"sha256": "b1b4c1f715c93d6a1de7d62c09c88adc1263a7888ca0b7074354fa8ef85add4b",
"full_readback_verified": true
}
],
"whole_archive_sha256": "f0cc1910a4e6b551664378871a3da953c79bcc2d8a5e83d7b4dc7cb8b7a384c5",
"whole_archive_bytes": 90934931,
"all_cloud_part_bytes_verified": true,
"source_not_removed": true
}
@@ -0,0 +1,53 @@
{
"origin_main_at_pack": "224007908dd2ee8f80ba8e3253c015fa19158157",
"commits": [
{
"head": "5475391647a29d5fcb8eec4b416cfa14cf4d4a2c",
"reachable_from_origin_main": false,
"file": "5475391647a29d5fcb8eec4b416cfa14cf4d4a2c.bundle",
"bytes": 68338,
"sha256": "6d394add1bf339e8b06c6833bc698cea37740d1846ddc245aa478f9d19c0310d"
},
{
"head": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab",
"reachable_from_origin_main": false,
"file": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab.bundle",
"bytes": 38374,
"sha256": "2b703252bc51ad322742608ef30b1a8272d6ef523cf186c51a113a25dd54282d"
},
{
"head": "64617018ed17afb4b74163c908138d423b5fd058",
"reachable_from_origin_main": false,
"file": "64617018ed17afb4b74163c908138d423b5fd058.bundle",
"bytes": 89529,
"sha256": "0b2fdbcf198e46478639fe60e32b281ceef1bb1b22976acff917ed76bf4c544d"
},
{
"head": "dd20d5b96cfbd2ae70ce00b6e7587a273077f8b5",
"reachable_from_origin_main": false,
"file": "dd20d5b96cfbd2ae70ce00b6e7587a273077f8b5.bundle",
"bytes": 92676,
"sha256": "ff8469f4057983cbee5f26bff899203b3832f64be5a0de305e284e8c312abc72"
},
{
"head": "3bba4f34f0df8fe812776c2dbef8e6891fa4fa0b",
"reachable_from_origin_main": false,
"file": "3bba4f34f0df8fe812776c2dbef8e6891fa4fa0b.bundle",
"bytes": 105522,
"sha256": "8b56736d1e63de2aa4332af1638b0661a7b387244cc2725f77f31dee33708971"
},
{
"head": "a19737b1606ba360a18c8fe0914594f038034924",
"reachable_from_origin_main": false,
"file": "a19737b1606ba360a18c8fe0914594f038034924.bundle",
"bytes": 20904,
"sha256": "3f0be46364e113ee2ec532557bbb88de358b3a06b8a274220e6dfe3fc8d9a7ed"
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.git-bundles.tar.gz",
"bytes": 412775,
"sha256": "a5e19875aee2232ee431242e3a17a026b07582995d05a7201a4f73f595006c5d"
},
"purpose": "Retain actual Git commit objects for six old validation HEADs after normal git worktree removal; original file archive is independent and complete."
}
@@ -0,0 +1,85 @@
{
"source_initial_free_bytes": 2348257280,
"source_logical_bytes": 824063297,
"unique_content_bytes": 126249622,
"file_count": 17901,
"roots": [
{
"name": "P04-01-validation-53c920f3",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-53c920f3",
"head": "5475391647a29d5fcb8eec4b416cfa14cf4d4a2c"
},
{
"name": "P04-01-validation-779110ff",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-779110ff",
"head": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab"
},
{
"name": "P04-01-validation-81a92b64",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-81a92b64",
"head": "64617018ed17afb4b74163c908138d423b5fd058"
},
{
"name": "P04-01-validation-ac199bd0",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-ac199bd0",
"head": "dd20d5b96cfbd2ae70ce00b6e7587a273077f8b5"
},
{
"name": "P04-01-validation-d5e25ded",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-d5e25ded",
"head": "3bba4f34f0df8fe812776c2dbef8e6891fa4fa0b"
},
{
"name": "P04-01-validation-dda519b2",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-dda519b2",
"head": "a19737b1606ba360a18c8fe0914594f038034924"
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz",
"bytes": 90934931,
"sha256": "f0cc1910a4e6b551664378871a3da953c79bcc2d8a5e83d7b4dc7cb8b7a384c5"
},
"manifest": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r12-20261016/MANIFEST.json.gz",
"bytes": 1021380,
"sha256": "c65b12df8936ced3520f1e5faf9acab0f1aacdc2f1aa1c494a120eac451193e9"
},
"upload_parts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part000",
"bytes": 16777216,
"sha256": "f6fcb57bd521e482eebb0e195c3f87bffea7a767982dcdbbd30ee629077b5524"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part001",
"bytes": 16777216,
"sha256": "f529967973483bbdcbf529144323b81cc1b7396c4842409ccbe74b72d8c92667"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part002",
"bytes": 16777216,
"sha256": "85d003267f8dc9f80c645ef87fc1cd8b02344a497d68a81354feb46fa588416b"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part003",
"bytes": 16777216,
"sha256": "8f2c17d854a5932574e197c5e9c3b371255127a3f5cf730f545f2324bb5eb6b5"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part004",
"bytes": 16777216,
"sha256": "2856bbe174dbf813530ab33d3f5ef3b70d5ab2eceff1d0bbacab9e55b63bbe4f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.cas.tar.gz.part005",
"bytes": 7048851,
"sha256": "b1b4c1f715c93d6a1de7d62c09c88adc1263a7888ca0b7074354fa8ef85add4b"
}
],
"local_tar_all_blobs_roundtrip": true,
"prepared_seconds": 34.84901404380798,
"free_after_preparation": 2266968064,
"source_removed": false,
"retirement_requires_cloud_full_readback_and_source_recheck": true
}
@@ -0,0 +1,28 @@
# 終了済みP04検証checkout6個の退避・復元
対象はPREPARATION.jsonの6個だけ。実装worktree・build・native原raw・通常save・終了済cacheは対象外。
全17,901ファイル約824MBの内容をSHAで重複排除し、90,934,931byteのCAS tar.gzに保存した。
元の全file mode/mtime_nsとdirectory metadata、各Git HEADと実Git commit bundleを保持する。
.gitはcheckout管理用pointerとして記録し、復元では正常なgit worktree addにより作る。生証拠の削除・要約置換ではない。
Driveのpart000からpart005とrestore-kit.zipをダウンロードし、同じ空の作業フォルダに置く。
restore-kit.zipを展開すると、この説明・manifest・PREPARATION/GIT_RESTORE・restore.py・git-bundles.tar.gzが得られる。
6partを番号順にバイナリ連結してp04-ended-validation-r12.cas.tar.gzを作る。
whole SHA256は f0cc1910a4e6b551664378871a3da953c79bcc2d8a5e83d7b4dc7cb8b7a384c5。
検証のみ(source作成なし):
```
python3 restore.py --archive p04-ended-validation-r12.cas.tar.gz --verify-only
```
全Git復元(全main履歴のあるrepoを指定、既存destinationの上書きは拒否):
```
python3 restore.py --archive p04-ended-validation-r12.cas.tar.gz --repo '/Users/korizatou114/Projects/とりにく工房ゲーム制作部' --destination-base '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01'
```
Git objectを使わず全source fileだけを新規フォルダへ復元する場合:
```
python3 restore.py --archive p04-ended-validation-r12.cas.tar.gz --files-only --destination-base '/absolute/fresh-restored-parent'
```
Git版受入の再現には全Git復元を使う。sourceだけの復元をGit候補版受入と呼ばない。
restore.pyはarchive全SHA・全unique blob・全manifest参照を検証し、復元後も全file SHA/size/mtimeを検証する。
cloud全part+kitの読み戻し一致、終了済み・clean・全source再照合、未使用の確認が揃うまで元checkoutは退避しない。
実解放容量は削除直前/直後に測定し、今回だけの一時pack領域の解放を別に示す。
@@ -0,0 +1,6 @@
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r12-20261016/p04-ended-validation-r12.restore-kit.zip",
"bytes": 1439897,
"sha256": "b71b0bc93d15f0f5e135981878c7afb7810f1175eddafac4c9405bc4afd94b14",
"all_zip_members_checked": true
}
@@ -0,0 +1,41 @@
{
"removed_validation_checkouts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-53c920f3",
"head": "5475391647a29d5fcb8eec4b416cfa14cf4d4a2c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-779110ff",
"head": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-81a92b64",
"head": "64617018ed17afb4b74163c908138d423b5fd058"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-ac199bd0",
"head": "dd20d5b96cfbd2ae70ce00b6e7587a273077f8b5"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-d5e25ded",
"head": "3bba4f34f0df8fe812776c2dbef8e6891fa4fa0b"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-dda519b2",
"head": "a19737b1606ba360a18c8fe0914594f038034924"
}
],
"source_file_count": 17901,
"source_logical_bytes": 824063297,
"cloud_all_bytes_verified": true,
"source_files_all_rehashed_before_normal_git_worktree_remove": true,
"before_sources_free_bytes": 2415321088,
"after_sources_free_bytes": 3273613312,
"observed_source_retirement_free_delta_bytes": 858292224,
"temporary_pack_logical_bytes_removed": 184137877,
"after_own_temporary_cleanup_free_bytes": 3458445312,
"own_temporary_cleanup_observed_delta_bytes": 184832000,
"measurement_note": "Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.",
"elapsed_seconds": 4.298702955245972,
"recorded_at": "2026-10-15T19:00:19.689627+00:00"
}
@@ -0,0 +1,48 @@
{
"checks": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-53c920f3",
"head": "5475391647a29d5fcb8eec4b416cfa14cf4d4a2c",
"all_files_rehashed": 2983,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-779110ff",
"head": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab",
"all_files_rehashed": 2978,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-81a92b64",
"head": "64617018ed17afb4b74163c908138d423b5fd058",
"all_files_rehashed": 2987,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-ac199bd0",
"head": "dd20d5b96cfbd2ae70ce00b6e7587a273077f8b5",
"all_files_rehashed": 2987,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-d5e25ded",
"head": "3bba4f34f0df8fe812776c2dbef8e6891fa4fa0b",
"all_files_rehashed": 2990,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-dda519b2",
"head": "a19737b1606ba360a18c8fe0914594f038034924",
"all_files_rehashed": 2976,
"clean": true,
"open_files": false
}
],
"cloud_full_bytes_verified": true,
"all_sources_retained_at_check": true
}
@@ -0,0 +1,43 @@
import pathlib,subprocess,json,hashlib,tarfile,gzip,stat,shutil,os,time,io
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');BASE=pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r12-20261016';TEMP=BASE/'.runtime/offload-validation-r12-20261016';NAMES=['P04-01-validation-53c920f3','P04-01-validation-779110ff','P04-01-validation-81a92b64','P04-01-validation-ac199bd0','P04-01-validation-d5e25ded','P04-01-validation-dda519b2']
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
assert not E.exists() and not TEMP.exists()
initial=shutil.disk_usage(R).free;started=time.time();roots=[];unique={};total=0
for name in NAMES:
root=BASE/name;assert root.is_dir() and not root.is_symlink();assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx'),'ignored/untracked content must be classified first'
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),('open files',name,ps.stdout)
files={};dirs={}
for p in sorted(root.rglob('*')):
rel=p.relative_to(root).as_posix();st=p.lstat();assert not stat.S_ISLNK(st.st_mode),str(p)
if rel=='.git':continue
if p.is_dir():dirs[rel]={'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};continue
assert p.is_file(),str(p);v=p.read_bytes();h=hashlib.sha256(v).hexdigest();assert len(v)==st.st_size
files[rel]={'bytes':len(v),'sha256':h,'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};total+=len(v)
unique.setdefault(h,{'source':str(p),'bytes':len(v)})
roots.append({'path':str(root),'name':name,'head':git(root,'rev-parse','HEAD'),'git_pointer':(root/'.git').read_text(),'files':files,'directories':dirs})
unique_bytes=sum(v['bytes'] for v in unique.values());assert shutil.disk_usage(R).free>=1024**3+unique_bytes+64*1024**2
E.mkdir(parents=True);TEMP.mkdir(parents=True)
manifest={'protocol':'p04-ended-validation-cas-v1','production_repo':str(R),'scope':'Only six ended clean Runner validation checkouts; current implementation/build/native raw/cache are excluded. All file bytes and metadata retained; .git administrative pointers are recorded for normal git worktree restoration.','roots':roots,'files':sum(len(v['files']) for v in roots),'logical_bytes':total,'unique_content_bytes':unique_bytes,'unique_blobs':len(unique)}
raw=json.dumps(manifest,ensure_ascii=False,sort_keys=True,separators=(',',':')).encode();mp=E/'MANIFEST.json.gz';mp.write_bytes(gzip.compress(raw,compresslevel=9,mtime=0))
archive=TEMP/'p04-ended-validation-r12.cas.tar.gz'
with tarfile.open(archive,'w:gz',compresslevel=6) as tar:
ti=tarfile.TarInfo('manifest.json');ti.size=len(raw);ti.mtime=0;ti.mode=0o644;tar.addfile(ti,io.BytesIO(raw))
for h,v in sorted(unique.items()):
p=pathlib.Path(v['source']);assert sha(p)==h;ti=tarfile.TarInfo('blobs/'+h);ti.size=v['bytes'];ti.mtime=0;ti.mode=0o644
with p.open('rb') as f:tar.addfile(ti,f)
with tarfile.open(archive,'r:gz') as tar:
seen=set();m=tar.extractfile('manifest.json').read();assert m==raw
for member in tar:
if member.name=='manifest.json':continue
assert member.name.startswith('blobs/');h=member.name.split('/')[1];v=tar.extractfile(member).read();assert h in unique and len(v)==unique[h]['bytes'] and hashlib.sha256(v).hexdigest()==h;seen.add(h)
assert seen==set(unique)
parts=[];limit=16*1024**2
if archive.stat().st_size>limit:
with archive.open('rb') as f:
i=0
while block:=f.read(limit):
p=TEMP/(archive.name+'.part%03d'%i);p.write_bytes(block);parts.append({'path':str(p),'bytes':len(block),'sha256':hashlib.sha256(block).hexdigest()});i+=1
else:parts=[{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)}]
prep={'source_initial_free_bytes':initial,'source_logical_bytes':total,'unique_content_bytes':unique_bytes,'file_count':manifest['files'],'roots':[{k:v[k] for k in ['name','path','head']} for v in roots],'archive':{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)},'manifest':{'path':str(mp),'bytes':mp.stat().st_size,'sha256':sha(mp)},'upload_parts':parts,'local_tar_all_blobs_roundtrip':True,'prepared_seconds':time.time()-started,'free_after_preparation':shutil.disk_usage(R).free,'source_removed':False,'retirement_requires_cloud_full_readback_and_source_recheck':True}
(E/'PREPARATION.json').write_text(json.dumps(prep,ensure_ascii=False,indent=2)+'\n');(E/'prepare.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps({k:prep[k] for k in ['source_logical_bytes','unique_content_bytes','file_count','archive','manifest','upload_parts','prepared_seconds','free_after_preparation']},ensure_ascii=False),flush=True)
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""Verify all bytes, or restore six archived validation sources into fresh paths."""
import argparse,gzip,hashlib,json,os,pathlib,re,shutil,subprocess,tarfile,tempfile
HERE=pathlib.Path(__file__).resolve().parent
def digest(path):
h=hashlib.sha256()
with path.open('rb') as f:
while block:=f.read(1024*1024):h.update(block)
return h.hexdigest()
def relative(name):
p=pathlib.PurePosixPath(name)
if p.is_absolute() or '..' in p.parts or not p.parts or p.parts[0]=='.git':raise ValueError('unsafe source path')
return p
def main():
p=argparse.ArgumentParser(description=__doc__);p.add_argument('--archive',type=pathlib.Path,required=True);p.add_argument('--verify-only',action='store_true');p.add_argument('--destination-base',type=pathlib.Path);p.add_argument('--repo',type=pathlib.Path);p.add_argument('--files-only',action='store_true');p.add_argument('--git-bundles',type=pathlib.Path,default=HERE/'git-bundles.tar.gz');args=p.parse_args()
prep=json.loads((HERE/'PREPARATION.json').read_text());gm=json.loads((HERE/'GIT_RESTORE.json').read_text());assert digest(args.archive)==prep['archive']['sha256'],'archive SHA mismatch'
raw=gzip.decompress((HERE/'MANIFEST.json.gz').read_bytes());m=json.loads(raw);references={}
for root in m['roots']:
assert re.fullmatch(r'P04-01-validation-[0-9a-f]{8}',root['name']) and re.fullmatch('[0-9a-f]{40}',root['head'])
for name,row in root['files'].items():relative(name);references.setdefault(row['sha256'],[]).append((root['name'],name,row));assert row['bytes']>=0
for name in root['directories']:relative(name)
def archive_pass(write=False):
seen=set()
with tarfile.open(args.archive,'r:gz') as tar:
for member in tar:
assert member.isfile() and not member.issym() and not member.islnk()
f=tar.extractfile(member)
if member.name=='manifest.json':assert f.read()==raw;continue
assert re.fullmatch('blobs/[0-9a-f]{64}',member.name);h=member.name.split('/')[1];assert h in references and h not in seen
data=f.read();assert hashlib.sha256(data).hexdigest()==h and all(len(data)==v[2]['bytes'] for v in references[h]);seen.add(h)
if write:
for root,name,row in references[h]:
target=args.destination_base/root/name;target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes(data);target.chmod(row['mode']);os.utime(target,ns=(row['mtime_ns'],row['mtime_ns']))
assert seen==set(references)
archive_pass()
assert sum(len(r['files']) for r in m['roots'])==m['files']
if args.verify_only:print(json.dumps(dict(verified=True,files=m['files'],logical_bytes=m['logical_bytes'],unique_blobs=len(references))));return
assert args.destination_base and (args.files_only or args.repo),'choose explicit destination and repo or files-only'
args.destination_base=args.destination_base.resolve();args.destination_base.mkdir(parents=True,exist_ok=True)
for root in m['roots']:assert not (args.destination_base/root['name']).exists(),'fresh destination required'
if not args.files_only:
assert digest(args.git_bundles)==gm['archive']['sha256'],'Git bundles SHA mismatch'
with tempfile.TemporaryDirectory(prefix='p04-restore-git-') as tmp:
with tarfile.open(args.git_bundles,'r:gz') as tar:
for member in tar:
assert member.isfile() and re.fullmatch('[0-9a-f]{40}.bundle',member.name)
target=pathlib.Path(tmp)/member.name;target.write_bytes(tar.extractfile(member).read());record=next(r for r in gm['commits'] if r.get('file')==member.name);assert digest(target)==record['sha256']
subprocess.run(['git','-C',str(args.repo),'bundle','verify',str(target)],check=True,capture_output=True)
subprocess.run(['git','-C',str(args.repo),'bundle','unbundle',str(target)],check=True,capture_output=True)
for root in m['roots']:subprocess.run(['git','-C',str(args.repo),'worktree','add','--detach',str(args.destination_base/root['name']),root['head']],check=True)
else:
for root in m['roots']:(args.destination_base/root['name']).mkdir()
archive_pass(write=True)
for root in m['roots']:
destination=args.destination_base/root['name']
for name,record in sorted(root['directories'].items(),key=lambda q:len(pathlib.PurePosixPath(q[0]).parts),reverse=True):
target=destination/name;target.mkdir(parents=True,exist_ok=True);target.chmod(record['mode']);os.utime(target,ns=(record['mtime_ns'],record['mtime_ns']))
actual={f.relative_to(destination).as_posix() for f in destination.rglob('*') if f.is_file() and f.relative_to(destination).as_posix()!='.git'};assert actual==set(root['files'])
for name,row in root['files'].items():
f=destination/name;assert digest(f)==row['sha256'] and f.stat().st_size==row['bytes'] and f.stat().st_mtime_ns==row['mtime_ns']
(args.destination_base/'RESTORED_COMMITS.json').write_text(json.dumps([{k:r[k] for k in ['name','head']} for r in m['roots']],indent=2)+'\n')
print(json.dumps(dict(restored=True,files=m['files'],destination=str(args.destination_base))))
if __name__=='__main__':main()
@@ -0,0 +1,32 @@
import pathlib,json,gzip,hashlib,subprocess,stat,shutil,sqlite3,datetime,time
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r12-20261016';prep=json.loads((E/'PREPARATION.json').read_text());m=json.loads(gzip.decompress((E/'MANIFEST.json.gz').read_bytes()));cloud=json.loads((E/'CLOUD_ALL_BYTES_VERIFIED.json').read_text());assert cloud['all_seven_cloud_files_full_readback_verified'] and cloud['whole_archive_sha256']==prep['archive']['sha256']
C=sqlite3.connect('file:/Users/korizatou114/Library/Application Support/agent-control/the-tree-p04-01/state.sqlite?mode=ro',uri=True);assert not C.execute("SELECT 1 FROM runs WHERE status='running'").fetchone(),'wait for Runner writer to end'
pg=subprocess.run(['/usr/bin/pgrep','-fl','/Applications/Godot.app|Godot.*headless'],capture_output=True,text=True);assert pg.returncode==1 and not pg.stdout.strip(),'wait for all owned engines'
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
checks=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert root.parent==pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01') and root.name==row['name'] and root.name.startswith('P04-01-validation-')
assert git(root,'rev-parse','HEAD')==row['head'];assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx')
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),'open source validation files'
actual={p.relative_to(root).as_posix() for p in root.rglob('*') if p.is_file() and p.relative_to(root).as_posix()!='.git'};assert actual==set(row['files'])
for name,v in row['files'].items():
p=root/name;s=p.stat();assert not p.is_symlink() and s.st_size==v['bytes'] and stat.S_IMODE(s.st_mode)==v['mode'] and s.st_mtime_ns==v['mtime_ns'];assert hashlib.sha256(p.read_bytes()).hexdigest()==v['sha256']
checks.append({'path':str(root),'head':row['head'],'all_files_rehashed':len(actual),'clean':True,'open_files':False})
(E/'SOURCE_RECHECK.json').write_text(json.dumps({'checks':checks,'cloud_full_bytes_verified':True,'all_sources_retained_at_check':True},ensure_ascii=False,indent=2)+'\n')
before=shutil.disk_usage(R).free;started=time.time();removed=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert git(root,'rev-parse','HEAD')==row['head'];subprocess.run(['git','-C',str(R),'worktree','remove',str(root)],check=True,capture_output=True);assert not root.exists();removed.append({'path':str(root),'head':row['head']})
after_sources=shutil.disk_usage(R).free
T=pathlib.Path(prep['archive']['path']).parent;gitmeta=json.loads((E/'GIT_RESTORE.json').read_text());kit=json.loads((E/'RESTORE_KIT.json').read_text());expected={prep['archive']['path']:prep['archive']['sha256'],kit['path']:kit['sha256'],gitmeta['archive']['path']:gitmeta['archive']['sha256']}
for part in prep['upload_parts']:expected[part['path']]=part['sha256']
for v in gitmeta['commits']:
if v.get('file'):expected[str(T/'git-bundles'/v['file'])]=v['sha256']
actual={str(p) for p in T.rglob('*') if p.is_file()};assert actual==set(expected),'unknown temporary data must not be removed'
temporary_bytes=0
for name,h in expected.items():
p=pathlib.Path(name);assert p.is_relative_to(T) and not p.is_symlink() and hashlib.sha256(p.read_bytes()).hexdigest()==h;temporary_bytes+=p.stat().st_size
for name in expected:pathlib.Path(name).unlink()
for p in sorted([p for p in T.rglob('*') if p.is_dir()],key=lambda p:len(p.parts),reverse=True):p.rmdir()
T.rmdir();after_all=shutil.disk_usage(R).free
report={'removed_validation_checkouts':removed,'source_file_count':m['files'],'source_logical_bytes':m['logical_bytes'],'cloud_all_bytes_verified':True,'source_files_all_rehashed_before_normal_git_worktree_remove':True,'before_sources_free_bytes':before,'after_sources_free_bytes':after_sources,'observed_source_retirement_free_delta_bytes':after_sources-before,'temporary_pack_logical_bytes_removed':temporary_bytes,'after_own_temporary_cleanup_free_bytes':after_all,'own_temporary_cleanup_observed_delta_bytes':after_all-after_sources,'measurement_note':'Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.','elapsed_seconds':time.time()-started,'recorded_at':datetime.datetime.now(datetime.timezone.utc).isoformat()}
(E/'RETIREMENT.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');(E/'retire.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps(report,ensure_ascii=False),flush=True)
@@ -0,0 +1,16 @@
{
"full_catalog_member": "MANIFEST.json.gz",
"bytes": 853091,
"sha256": "1d1cbca486ec1e8398489313a854a11b343bf2e9abf20c8f0286da70a8b1d36b",
"cloud_restore_kit": {
"part": 6,
"id": "1Dorq6G-aquM44YMxrydfaP_xBg_mXnBU",
"url": "https://drive.google.com/file/d/1Dorq6G-aquM44YMxrydfaP_xBg_mXnBU/view?usp=drivesdk",
"bytes": 1462988,
"sha256": "7e96067c0d340efb743e1dc613dbb070671e614057f158dc01f00af52d686442",
"full_readback_verified": true
},
"local_catalog_needed_for_active_work": false,
"local_catalog_retained": false,
"why": "Exact full catalog is preserved in fully readback-verified Drive restore kit. Keep small restore instructions and hashes locally; avoid multiplying this catalog into every future Git checkout. Download/extract kit before restore.py or re-auditing all original paths."
}
@@ -0,0 +1,65 @@
{
"parts": [
{
"part": 0,
"id": "1AeW1dgteV76UWSr2-Zc73cYsQ6MoE62b",
"url": "https://drive.google.com/file/d/1AeW1dgteV76UWSr2-Zc73cYsQ6MoE62b/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "ea0e113b223abe195d38440708bef29eccbb585ba63f40a62171c8d8ecc6de4d",
"full_readback_verified": true
},
{
"part": 1,
"id": "1bvBFoT7Qneos5iFaRVS0icC94MrXKfGW",
"url": "https://drive.google.com/file/d/1bvBFoT7Qneos5iFaRVS0icC94MrXKfGW/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "67789867a734522002a5e6d235d4ff4c94f1a7fddf897fa2ee785a623de4ab6c",
"full_readback_verified": true
},
{
"part": 2,
"id": "1xi0pMC9ldz29TWvXCZT-TwK_lUuafe3d",
"url": "https://drive.google.com/file/d/1xi0pMC9ldz29TWvXCZT-TwK_lUuafe3d/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "df985a28db55799e608963cab39b1b30895e1596505c54d5ad3fa7d8a24e07e8",
"full_readback_verified": true
},
{
"part": 3,
"id": "12vZRvi3zEYfZgwYeX8GPyMOKZP53esnJ",
"url": "https://drive.google.com/file/d/12vZRvi3zEYfZgwYeX8GPyMOKZP53esnJ/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "84ed6b257991aa8268b7ab7916907310b467abfe458abb2ef6d270b3a8ef6d1e",
"full_readback_verified": true
},
{
"part": 4,
"id": "1eTWEKCdQUywwPjrWf1N_2EZ_gJJhr7yP",
"url": "https://drive.google.com/file/d/1eTWEKCdQUywwPjrWf1N_2EZ_gJJhr7yP/view?usp=drivesdk",
"bytes": 16777216,
"sha256": "4a6906e6ab665558bbeeaa450f395cfc205e87445b1cfdced4f6104bd6fd242a",
"full_readback_verified": true
},
{
"part": 5,
"id": "1fSSFF9vBr5XrxjZwAwwdegBQFxZuVUGE",
"url": "https://drive.google.com/file/d/1fSSFF9vBr5XrxjZwAwwdegBQFxZuVUGE/view?usp=drivesdk",
"bytes": 6870154,
"sha256": "4366d1e75531b5e7599d315e58d41cb10d9588b82d5c414a28e5b775d61c0e57",
"full_readback_verified": true
}
],
"restore_kit": {
"part": 6,
"id": "1Dorq6G-aquM44YMxrydfaP_xBg_mXnBU",
"url": "https://drive.google.com/file/d/1Dorq6G-aquM44YMxrydfaP_xBg_mXnBU/view?usp=drivesdk",
"bytes": 1462988,
"sha256": "7e96067c0d340efb743e1dc613dbb070671e614057f158dc01f00af52d686442",
"full_readback_verified": true
},
"whole_archive_sha256": "57a77f24ac897582898c98a8db41829e5dfcd2457b632b68a6020269fc73ce47",
"whole_archive_bytes": 90756234,
"all_cloud_part_bytes_verified": true,
"all_seven_cloud_files_full_readback_verified": true,
"source_not_removed": true
}
@@ -0,0 +1,46 @@
{
"origin_main_at_pack": "8af0d5af8c4a15f6b7130617dbaa78ed736e604a",
"commits": [
{
"head": "29a641c540430cfc7ea24498b242c9afa30686c1",
"file": "29a641c540430cfc7ea24498b242c9afa30686c1.bundle",
"bytes": 126005,
"sha256": "6e8d31808b9cdc8afc966cde22eac8731cbbe978b3e7687c7b746f1c5ee5c25a",
"reachable_from_origin_main": false
},
{
"head": "cc3a377841a2ca44d32a91122365fc9bcbdef341",
"file": "cc3a377841a2ca44d32a91122365fc9bcbdef341.bundle",
"bytes": 124354,
"sha256": "e317905208a865b027d1b5728a2c70348d41331dee06c6d682c0961dafcb309b",
"reachable_from_origin_main": false
},
{
"head": "accd07c91d4e34d9b7c7fc20e389df2424b167e1",
"file": "accd07c91d4e34d9b7c7fc20e389df2424b167e1.bundle",
"bytes": 140461,
"sha256": "649942e7da747aeced1265c7a833c63a76d87a0a1aab1a7ee0136fced887d7d1",
"reachable_from_origin_main": false
},
{
"head": "c0bc92a469e2b1967b2f05b3474d8f1112c3f870",
"file": "c0bc92a469e2b1967b2f05b3474d8f1112c3f870.bundle",
"bytes": 109074,
"sha256": "cf96eb3a391d3e6b21bebb0c0bce6fd2a5494e6fe81eca77a908271d79f797a4",
"reachable_from_origin_main": false
},
{
"head": "877dee40bc19559bf726502ff2d1f3fb84bac034",
"file": "877dee40bc19559bf726502ff2d1f3fb84bac034.bundle",
"bytes": 109709,
"sha256": "2e50bf94ecd1a62a041feb01d91ca71938e9506af03beef71ffb75fc0719c770",
"reachable_from_origin_main": false
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.git-bundles.tar.gz",
"bytes": 604403,
"sha256": "1e3f79dce7c67944a109aa8d5b5c5b3bfb947ef3a5606128d3f14dd6615f8fa1"
},
"purpose": "Retain actual Git commits for five ended validation HEADs; full source archive independently complete."
}
@@ -0,0 +1,80 @@
{
"source_initial_free_bytes": 3296309248,
"source_logical_bytes": 687528462,
"unique_content_bytes": 126277528,
"file_count": 14962,
"roots": [
{
"name": "P04-01-validation-12de591b",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-12de591b",
"head": "29a641c540430cfc7ea24498b242c9afa30686c1"
},
{
"name": "P04-01-validation-5836cfaf",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-5836cfaf",
"head": "cc3a377841a2ca44d32a91122365fc9bcbdef341"
},
{
"name": "P04-01-validation-7919a6ad",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-7919a6ad",
"head": "accd07c91d4e34d9b7c7fc20e389df2424b167e1"
},
{
"name": "P04-01-validation-a2c8ffdb",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-a2c8ffdb",
"head": "c0bc92a469e2b1967b2f05b3474d8f1112c3f870"
},
{
"name": "P04-01-validation-cc96b2b5",
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-cc96b2b5",
"head": "877dee40bc19559bf726502ff2d1f3fb84bac034"
}
],
"archive": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz",
"bytes": 90756234,
"sha256": "57a77f24ac897582898c98a8db41829e5dfcd2457b632b68a6020269fc73ce47"
},
"manifest": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r13-20261016/MANIFEST.json.gz",
"bytes": 853091,
"sha256": "1d1cbca486ec1e8398489313a854a11b343bf2e9abf20c8f0286da70a8b1d36b"
},
"upload_parts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part000",
"bytes": 16777216,
"sha256": "ea0e113b223abe195d38440708bef29eccbb585ba63f40a62171c8d8ecc6de4d"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part001",
"bytes": 16777216,
"sha256": "67789867a734522002a5e6d235d4ff4c94f1a7fddf897fa2ee785a623de4ab6c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part002",
"bytes": 16777216,
"sha256": "df985a28db55799e608963cab39b1b30895e1596505c54d5ad3fa7d8a24e07e8"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part003",
"bytes": 16777216,
"sha256": "84ed6b257991aa8268b7ab7916907310b467abfe458abb2ef6d270b3a8ef6d1e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part004",
"bytes": 16777216,
"sha256": "4a6906e6ab665558bbeeaa450f395cfc205e87445b1cfdced4f6104bd6fd242a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.cas.tar.gz.part005",
"bytes": 6870154,
"sha256": "4366d1e75531b5e7599d315e58d41cb10d9588b82d5c414a28e5b775d61c0e57"
}
],
"local_tar_all_blobs_roundtrip": true,
"prepared_seconds": 25.539520978927612,
"free_after_preparation": 3106832384,
"source_removed": false,
"retirement_requires_cloud_full_readback_and_source_recheck": true
}
@@ -0,0 +1,24 @@
# 終了済みP04検証checkout5個の復元
対象はPREPARATION.jsonの5個だけ。実装worktree/build/native原raw/cache/通常saveは対象外。
全14,962ファイル687,528,462bytesをSHA重複排除し、CAS tar.gzに内容を全保持する。
全file mode/mtime_ns、directory metadata、Git HEADとGit bundleを保存。.git管理pointerは記録し、復元時にgit worktree addで作る。
Driveのpart000からpart005とrestore-kit.zipを同じ空フォルダへダウンロードし、kitを展開する。
6partを番号順にバイナリ連結してp04-ended-validation-r13.cas.tar.gzを作る。
whole SHA256: 57a77f24ac897582898c98a8db41829e5dfcd2457b632b68a6020269fc73ce47
検証のみ(source生成なし):
```
python3 restore.py --archive p04-ended-validation-r13.cas.tar.gz --verify-only
```
Git版の復元(全main履歴を持つrepoを使用、既存destination上書き拒否):
```
python3 restore.py --archive p04-ended-validation-r13.cas.tar.gz --repo '/Users/korizatou114/Projects/とりにく工房ゲーム制作部' --destination-base '/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01'
```
Gitなしで全sourceだけ新規フォルダへ復元:
```
python3 restore.py --archive p04-ended-validation-r13.cas.tar.gz --files-only --destination-base '/absolute/fresh-restored-parent'
```
全Git版受入の再現にはGit復元を使用。restore.pyはarchive全SHA/全blob/全manifest参照を検証し、復元後にも全file SHA/size/mtimeを確認する。
クラウド全partとkitの全byte読み戻し一致、終了済みclean状態、全source再照合・未使用が揃うまでローカル元checkoutは保持する。
実解放容量は元checkoutと今回専用packの後始末を別々に実測する。
@@ -0,0 +1,6 @@
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/offload-validation-r13-20261016/p04-ended-validation-r13.restore-kit.zip",
"bytes": 1462988,
"sha256": "7e96067c0d340efb743e1dc613dbb070671e614057f158dc01f00af52d686442",
"all_zip_members_checked": true
}
@@ -0,0 +1,45 @@
{
"removed_validation_checkouts": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-12de591b",
"head": "29a641c540430cfc7ea24498b242c9afa30686c1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-5836cfaf",
"head": "cc3a377841a2ca44d32a91122365fc9bcbdef341"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-7919a6ad",
"head": "accd07c91d4e34d9b7c7fc20e389df2424b167e1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-a2c8ffdb",
"head": "c0bc92a469e2b1967b2f05b3474d8f1112c3f870"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-cc96b2b5",
"head": "877dee40bc19559bf726502ff2d1f3fb84bac034"
}
],
"source_file_count": 14962,
"source_logical_bytes": 687528462,
"cloud_all_bytes_verified": true,
"source_files_all_rehashed_before_normal_git_worktree_remove": true,
"before_sources_free_bytes": 3098464256,
"after_sources_free_bytes": 3836186624,
"observed_source_retirement_free_delta_bytes": 737722368,
"temporary_pack_logical_bytes_removed": 184189462,
"after_own_temporary_cleanup_free_bytes": 4020428800,
"own_temporary_cleanup_observed_delta_bytes": 184242176,
"measurement_note": "Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.",
"concurrent_isolated_implementation": [
[
"24d43100b6dc47d784ed6bac550c501a",
"P04-01",
"implementer",
16771
]
],
"elapsed_seconds": 3.257444143295288,
"recorded_at": "2026-10-15T20:04:25.767843+00:00"
}
@@ -0,0 +1,41 @@
{
"checks": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-12de591b",
"head": "29a641c540430cfc7ea24498b242c9afa30686c1",
"all_files_rehashed": 2993,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-5836cfaf",
"head": "cc3a377841a2ca44d32a91122365fc9bcbdef341",
"all_files_rehashed": 2993,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-7919a6ad",
"head": "accd07c91d4e34d9b7c7fc20e389df2424b167e1",
"all_files_rehashed": 2996,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-a2c8ffdb",
"head": "c0bc92a469e2b1967b2f05b3474d8f1112c3f870",
"all_files_rehashed": 2990,
"clean": true,
"open_files": false
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-validation-cc96b2b5",
"head": "877dee40bc19559bf726502ff2d1f3fb84bac034",
"all_files_rehashed": 2990,
"clean": true,
"open_files": false
}
],
"cloud_full_bytes_verified": true,
"all_sources_retained_at_check": true
}
@@ -0,0 +1,43 @@
import pathlib,subprocess,json,hashlib,tarfile,gzip,stat,shutil,os,time,io
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');BASE=pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r13-20261016';TEMP=BASE/'.runtime/offload-validation-r13-20261016';NAMES=['P04-01-validation-12de591b','P04-01-validation-5836cfaf','P04-01-validation-7919a6ad','P04-01-validation-a2c8ffdb','P04-01-validation-cc96b2b5']
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
assert not E.exists() and not TEMP.exists()
initial=shutil.disk_usage(R).free;started=time.time();roots=[];unique={};total=0
for name in NAMES:
root=BASE/name;assert root.is_dir() and not root.is_symlink();assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx'),'ignored/untracked content must be classified first'
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),('open files',name,ps.stdout)
files={};dirs={}
for p in sorted(root.rglob('*')):
rel=p.relative_to(root).as_posix();st=p.lstat();assert not stat.S_ISLNK(st.st_mode),str(p)
if rel=='.git':continue
if p.is_dir():dirs[rel]={'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};continue
assert p.is_file(),str(p);v=p.read_bytes();h=hashlib.sha256(v).hexdigest();assert len(v)==st.st_size
files[rel]={'bytes':len(v),'sha256':h,'mode':stat.S_IMODE(st.st_mode),'mtime_ns':st.st_mtime_ns};total+=len(v)
unique.setdefault(h,{'source':str(p),'bytes':len(v)})
roots.append({'path':str(root),'name':name,'head':git(root,'rev-parse','HEAD'),'git_pointer':(root/'.git').read_text(),'files':files,'directories':dirs})
unique_bytes=sum(v['bytes'] for v in unique.values());assert shutil.disk_usage(R).free>=1024**3+unique_bytes+64*1024**2
E.mkdir(parents=True);TEMP.mkdir(parents=True)
manifest={'protocol':'p04-ended-validation-cas-v1','production_repo':str(R),'scope':'Only five ended clean Runner validation checkouts; current implementation/build/native raw/cache are excluded. All file bytes and metadata retained; .git administrative pointers are recorded for normal git worktree restoration.','roots':roots,'files':sum(len(v['files']) for v in roots),'logical_bytes':total,'unique_content_bytes':unique_bytes,'unique_blobs':len(unique)}
raw=json.dumps(manifest,ensure_ascii=False,sort_keys=True,separators=(',',':')).encode();mp=E/'MANIFEST.json.gz';mp.write_bytes(gzip.compress(raw,compresslevel=9,mtime=0))
archive=TEMP/'p04-ended-validation-r13.cas.tar.gz'
with tarfile.open(archive,'w:gz',compresslevel=6) as tar:
ti=tarfile.TarInfo('manifest.json');ti.size=len(raw);ti.mtime=0;ti.mode=0o644;tar.addfile(ti,io.BytesIO(raw))
for h,v in sorted(unique.items()):
p=pathlib.Path(v['source']);assert sha(p)==h;ti=tarfile.TarInfo('blobs/'+h);ti.size=v['bytes'];ti.mtime=0;ti.mode=0o644
with p.open('rb') as f:tar.addfile(ti,f)
with tarfile.open(archive,'r:gz') as tar:
seen=set();m=tar.extractfile('manifest.json').read();assert m==raw
for member in tar:
if member.name=='manifest.json':continue
assert member.name.startswith('blobs/');h=member.name.split('/')[1];v=tar.extractfile(member).read();assert h in unique and len(v)==unique[h]['bytes'] and hashlib.sha256(v).hexdigest()==h;seen.add(h)
assert seen==set(unique)
parts=[];limit=16*1024**2
if archive.stat().st_size>limit:
with archive.open('rb') as f:
i=0
while block:=f.read(limit):
p=TEMP/(archive.name+'.part%03d'%i);p.write_bytes(block);parts.append({'path':str(p),'bytes':len(block),'sha256':hashlib.sha256(block).hexdigest()});i+=1
else:parts=[{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)}]
prep={'source_initial_free_bytes':initial,'source_logical_bytes':total,'unique_content_bytes':unique_bytes,'file_count':manifest['files'],'roots':[{k:v[k] for k in ['name','path','head']} for v in roots],'archive':{'path':str(archive),'bytes':archive.stat().st_size,'sha256':sha(archive)},'manifest':{'path':str(mp),'bytes':mp.stat().st_size,'sha256':sha(mp)},'upload_parts':parts,'local_tar_all_blobs_roundtrip':True,'prepared_seconds':time.time()-started,'free_after_preparation':shutil.disk_usage(R).free,'source_removed':False,'retirement_requires_cloud_full_readback_and_source_recheck':True}
(E/'PREPARATION.json').write_text(json.dumps(prep,ensure_ascii=False,indent=2)+'\n');(E/'prepare.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps({k:prep[k] for k in ['source_logical_bytes','unique_content_bytes','file_count','archive','manifest','upload_parts','prepared_seconds','free_after_preparation']},ensure_ascii=False),flush=True)
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""Verify all bytes, or restore five archived validation sources into fresh paths."""
import argparse,gzip,hashlib,json,os,pathlib,re,shutil,subprocess,tarfile,tempfile
HERE=pathlib.Path(__file__).resolve().parent
def digest(path):
h=hashlib.sha256()
with path.open('rb') as f:
while block:=f.read(1024*1024):h.update(block)
return h.hexdigest()
def relative(name):
p=pathlib.PurePosixPath(name)
if p.is_absolute() or '..' in p.parts or not p.parts or p.parts[0]=='.git':raise ValueError('unsafe source path')
return p
def main():
p=argparse.ArgumentParser(description=__doc__);p.add_argument('--archive',type=pathlib.Path,required=True);p.add_argument('--verify-only',action='store_true');p.add_argument('--destination-base',type=pathlib.Path);p.add_argument('--repo',type=pathlib.Path);p.add_argument('--files-only',action='store_true');p.add_argument('--git-bundles',type=pathlib.Path,default=HERE/'git-bundles.tar.gz');args=p.parse_args()
prep=json.loads((HERE/'PREPARATION.json').read_text());gm=json.loads((HERE/'GIT_RESTORE.json').read_text());assert digest(args.archive)==prep['archive']['sha256'],'archive SHA mismatch'
raw=gzip.decompress((HERE/'MANIFEST.json.gz').read_bytes());m=json.loads(raw);references={}
for root in m['roots']:
assert re.fullmatch(r'P04-01-validation-[0-9a-f]{8}',root['name']) and re.fullmatch('[0-9a-f]{40}',root['head'])
for name,row in root['files'].items():relative(name);references.setdefault(row['sha256'],[]).append((root['name'],name,row));assert row['bytes']>=0
for name in root['directories']:relative(name)
def archive_pass(write=False):
seen=set()
with tarfile.open(args.archive,'r:gz') as tar:
for member in tar:
assert member.isfile() and not member.issym() and not member.islnk()
f=tar.extractfile(member)
if member.name=='manifest.json':assert f.read()==raw;continue
assert re.fullmatch('blobs/[0-9a-f]{64}',member.name);h=member.name.split('/')[1];assert h in references and h not in seen
data=f.read();assert hashlib.sha256(data).hexdigest()==h and all(len(data)==v[2]['bytes'] for v in references[h]);seen.add(h)
if write:
for root,name,row in references[h]:
target=args.destination_base/root/name;target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes(data);target.chmod(row['mode']);os.utime(target,ns=(row['mtime_ns'],row['mtime_ns']))
assert seen==set(references)
archive_pass()
assert sum(len(r['files']) for r in m['roots'])==m['files']
if args.verify_only:print(json.dumps(dict(verified=True,files=m['files'],logical_bytes=m['logical_bytes'],unique_blobs=len(references))));return
assert args.destination_base and (args.files_only or args.repo),'choose explicit destination and repo or files-only'
args.destination_base=args.destination_base.resolve();args.destination_base.mkdir(parents=True,exist_ok=True)
for root in m['roots']:assert not (args.destination_base/root['name']).exists(),'fresh destination required'
if not args.files_only:
assert digest(args.git_bundles)==gm['archive']['sha256'],'Git bundles SHA mismatch'
with tempfile.TemporaryDirectory(prefix='p04-restore-git-') as tmp:
with tarfile.open(args.git_bundles,'r:gz') as tar:
for member in tar:
assert member.isfile() and re.fullmatch('[0-9a-f]{40}.bundle',member.name)
target=pathlib.Path(tmp)/member.name;target.write_bytes(tar.extractfile(member).read());record=next(r for r in gm['commits'] if r.get('file')==member.name);assert digest(target)==record['sha256']
subprocess.run(['git','-C',str(args.repo),'bundle','verify',str(target)],check=True,capture_output=True)
subprocess.run(['git','-C',str(args.repo),'bundle','unbundle',str(target)],check=True,capture_output=True)
for root in m['roots']:subprocess.run(['git','-C',str(args.repo),'worktree','add','--detach',str(args.destination_base/root['name']),root['head']],check=True)
else:
for root in m['roots']:(args.destination_base/root['name']).mkdir()
archive_pass(write=True)
for root in m['roots']:
destination=args.destination_base/root['name']
for name,record in sorted(root['directories'].items(),key=lambda q:len(pathlib.PurePosixPath(q[0]).parts),reverse=True):
target=destination/name;target.mkdir(parents=True,exist_ok=True);target.chmod(record['mode']);os.utime(target,ns=(record['mtime_ns'],record['mtime_ns']))
actual={f.relative_to(destination).as_posix() for f in destination.rglob('*') if f.is_file() and f.relative_to(destination).as_posix()!='.git'};assert actual==set(root['files'])
for name,row in root['files'].items():
f=destination/name;assert digest(f)==row['sha256'] and f.stat().st_size==row['bytes'] and f.stat().st_mtime_ns==row['mtime_ns']
(args.destination_base/'RESTORED_COMMITS.json').write_text(json.dumps([{k:r[k] for k in ['name','head']} for r in m['roots']],indent=2)+'\n')
print(json.dumps(dict(restored=True,files=m['files'],destination=str(args.destination_base))))
if __name__=='__main__':main()
@@ -0,0 +1,41 @@
import pathlib,json,gzip,hashlib,subprocess,stat,shutil,sqlite3,datetime,time
R=pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p04-ended-validation-r13-20261016';prep=json.loads((E/'PREPARATION.json').read_text());m=json.loads(gzip.decompress((E/'MANIFEST.json.gz').read_bytes()));cloud=json.loads((E/'CLOUD_ALL_BYTES_VERIFIED.json').read_text());assert cloud['all_seven_cloud_files_full_readback_verified'] and cloud['whole_archive_sha256']==prep['archive']['sha256']
C=sqlite3.connect('file:/Users/korizatou114/Library/Application Support/agent-control/the-tree-p04-01/state.sqlite?mode=ro',uri=True);running=C.execute("SELECT id,task_id,role,pid FROM runs WHERE status='running'").fetchall()
# Only this separately scoped implementation may run; none of the five ended
# validation paths is an input to it. Recheck each target with lsof below.
for run_id,task_id,role,pid in running:
assert run_id=='24d43100b6dc47d784ed6bac550c501a' and task_id=='P04-01' and role=='implementer'
assert C.execute('SELECT worktree FROM tasks WHERE id=?',(task_id,)).fetchone()[0]=='/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement'
subprocess.run(['/bin/kill','-0',str(pid)],check=True,capture_output=True)
cwd=subprocess.check_output(['/usr/sbin/lsof','-a','-p',str(pid),'-d','cwd','-Fn'],text=True)
assert '\nn/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement\n' in cwd
pg=subprocess.run(['/usr/bin/pgrep','-fl','/Applications/Godot.app|Godot.*headless'],capture_output=True,text=True);assert pg.returncode==1 and not pg.stdout.strip(),'wait for all owned engines'
def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args],text=True).strip()
checks=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert root.parent==pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01') and root.name==row['name'] and root.name.startswith('P04-01-validation-')
assert git(root,'rev-parse','HEAD')==row['head'];assert not git(root,'status','--porcelain','--untracked-files=all');assert not git(root,'clean','-ndx')
ps=subprocess.run(['/usr/sbin/lsof','-t','+D',str(root)],capture_output=True,text=True);assert ps.returncode==1 and not ps.stdout.strip(),'open source validation files'
actual={p.relative_to(root).as_posix() for p in root.rglob('*') if p.is_file() and p.relative_to(root).as_posix()!='.git'};assert actual==set(row['files'])
for name,v in row['files'].items():
p=root/name;s=p.stat();assert not p.is_symlink() and s.st_size==v['bytes'] and stat.S_IMODE(s.st_mode)==v['mode'] and s.st_mtime_ns==v['mtime_ns'];assert hashlib.sha256(p.read_bytes()).hexdigest()==v['sha256']
checks.append({'path':str(root),'head':row['head'],'all_files_rehashed':len(actual),'clean':True,'open_files':False})
(E/'SOURCE_RECHECK.json').write_text(json.dumps({'checks':checks,'cloud_full_bytes_verified':True,'all_sources_retained_at_check':True},ensure_ascii=False,indent=2)+'\n')
before=shutil.disk_usage(R).free;started=time.time();removed=[]
for row in m['roots']:
root=pathlib.Path(row['path']);assert git(root,'rev-parse','HEAD')==row['head'];subprocess.run(['git','-C',str(R),'worktree','remove',str(root)],check=True,capture_output=True);assert not root.exists();removed.append({'path':str(root),'head':row['head']})
after_sources=shutil.disk_usage(R).free
T=pathlib.Path(prep['archive']['path']).parent;gitmeta=json.loads((E/'GIT_RESTORE.json').read_text());kit=json.loads((E/'RESTORE_KIT.json').read_text());expected={prep['archive']['path']:prep['archive']['sha256'],kit['path']:kit['sha256'],gitmeta['archive']['path']:gitmeta['archive']['sha256']}
for part in prep['upload_parts']:expected[part['path']]=part['sha256']
for v in gitmeta['commits']:
if v.get('file'):expected[str(T/'git-bundles'/v['file'])]=v['sha256']
actual={str(p) for p in T.rglob('*') if p.is_file()};assert actual==set(expected),'unknown temporary data must not be removed'
temporary_bytes=0
for name,h in expected.items():
p=pathlib.Path(name);assert p.is_relative_to(T) and not p.is_symlink() and hashlib.sha256(p.read_bytes()).hexdigest()==h;temporary_bytes+=p.stat().st_size
for name in expected:pathlib.Path(name).unlink()
for p in sorted([p for p in T.rglob('*') if p.is_dir()],key=lambda p:len(p.parts),reverse=True):p.rmdir()
T.rmdir();after_all=shutil.disk_usage(R).free
report={'removed_validation_checkouts':removed,'source_file_count':m['files'],'source_logical_bytes':m['logical_bytes'],'cloud_all_bytes_verified':True,'source_files_all_rehashed_before_normal_git_worktree_remove':True,'before_sources_free_bytes':before,'after_sources_free_bytes':after_sources,'observed_source_retirement_free_delta_bytes':after_sources-before,'temporary_pack_logical_bytes_removed':temporary_bytes,'after_own_temporary_cleanup_free_bytes':after_all,'own_temporary_cleanup_observed_delta_bytes':after_all-after_sources,'measurement_note':'Source retirement interval excludes cleanup of this run own archive/parts/bundles/kit. Free-space deltas are observed intervals and may include concurrent OS activity, not logical byte totals. Current implementation/build/native raw/cache/default saves are retained.','concurrent_isolated_implementation':running,'elapsed_seconds':time.time()-started,'recorded_at':datetime.datetime.now(datetime.timezone.utc).isoformat()}
(E/'RETIREMENT.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');(E/'retire.py').write_bytes(pathlib.Path(__file__).read_bytes());print(json.dumps(report,ensure_ascii=False),flush=True)
@@ -0,0 +1,42 @@
{
"files": [
{
"name": "new-objects-r08.tar.gz",
"id": "1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT",
"url": "https://drive.google.com/file/d/1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT/view?usp=drivesdk",
"bytes": 1800566,
"sha256": "2ef5e8150023a0d1e3038aa3b7df78b720ee56343b4f2cb831568e2a5164ddc8",
"actual_cloud_readback": true
},
{
"name": "MANIFEST.json.gz",
"id": "10l7V2Y7dpzsKzvEZ7mL5IyE3fXX94-hn",
"url": "https://drive.google.com/file/d/10l7V2Y7dpzsKzvEZ7mL5IyE3fXX94-hn/view?usp=drivesdk",
"bytes": 487346,
"sha256": "3454136bcae00d3eaf4ee19c5dc197352914e87c041aea9eabb44634e6e9d88f",
"actual_cloud_readback": true
},
{
"name": "restore.py",
"id": "1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg",
"url": "https://drive.google.com/file/d/1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg/view?usp=drivesdk",
"bytes": 2439,
"sha256": "14d11436359fd567aec937bcf615fbd0c9c9447b41edf1a3671f6df26af1d4af",
"actual_cloud_readback": true
},
{
"name": "RESTORE.md",
"id": "1EwIpLv31pJJUxROYz_L9BzhNqRXp1yaO",
"url": "https://drive.google.com/file/d/1EwIpLv31pJJUxROYz_L9BzhNqRXp1yaO/view?usp=drivesdk",
"bytes": 3253,
"sha256": "942e46e389475a5844ab5190658e7eea2dd37fe64fa5f30754bfbf060a25c695",
"actual_cloud_readback": true
}
],
"all_four_raw_bytes_identical": true,
"all_new_objects_individually_verified": 188,
"prior_archive_readback_reused": true,
"original_file_mappings": 8245,
"original_source_retired": false,
"formal_credit": 0
}
@@ -0,0 +1,42 @@
{
"archive": {
"accepted_input": "file_uri",
"success": true,
"id": "1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT",
"title": "p18-review-r08-new-objects-r08.tar.gz",
"file_name": "p18-review-r08-new-objects-r08.tar.gz",
"mime_type": "application/gzip",
"url": "https://drive.google.com/file/d/1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT",
"title": "p18-review-r08-new-objects-r08.tar.gz",
"file_name": "p18-review-r08-new-objects-r08.tar.gz",
"mime_type": "application/gzip",
"url": "https://drive.google.com/file/d/1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
},
"restore": {
"accepted_input": "file_uri",
"success": true,
"id": "1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg",
"title": "p18-review-r08-restore.py",
"file_name": "p18-review-r08-restore.py",
"mime_type": "text/x-python",
"url": "https://drive.google.com/file/d/1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK",
"structuredContent": {
"accepted_input": "file_uri",
"success": true,
"id": "1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg",
"title": "p18-review-r08-restore.py",
"file_name": "p18-review-r08-restore.py",
"mime_type": "text/x-python",
"url": "https://drive.google.com/file/d/1OU7J5Asf_xeLyq2fpm5fd07RWuh0X7Eg/view?usp=drivesdk",
"parent_id": "1Xa2b6rQmwBFq4jWIDFcJgiCbcNYfWXsK"
}
}
}
@@ -0,0 +1,7 @@
{
"only_verified_uploaded_temp_archive_removed": true,
"bytes": 1800566,
"sha256": "2ef5e8150023a0d1e3038aa3b7df78b720ee56343b4f2cb831568e2a5164ddc8",
"restoration_sources": "MANIFEST.json.gz/CLOUD_ALL_BYTES_VERIFIED.json",
"formal_credit": 0
}
@@ -0,0 +1,8 @@
{
"path": "/private/tmp/thetree-p18-cold-r08/new-objects-r08.tar.gz",
"sha256": "2ef5e8150023a0d1e3038aa3b7df78b720ee56343b4f2cb831568e2a5164ddc8",
"bytes": 1800566,
"objects": 188,
"raw_unique_bytes": 10785212,
"prior_logical_bytes_reused": 1893131770
}
@@ -0,0 +1,29 @@
# P18 closed review r08 restore
The backend task is formally completed. This archives only its ended review material. The source Git checkout, all normal Runner result/traceability records, and current canonical native proof remain local.
Download MANIFEST.json.gz and restore.py from the same Drive folder. Download the following archive bytes (existing archives reuse already verified objects):
drive-offload-cold-r06-20261015 — SHA256 75953c3d35d5fbc633e7cb68c6510ea8ad33aa9b7591a83feccd1d8c69389cc0
part 0 SHA256 22c205b386248abf7b39b70c2b858a483654aa7e089a3d64b70a17a571886f53 https://drive.google.com/file/d/1MXFzQ_yfhmdJU9Q_dnWwqD7MNQlp8QYE/view?usp=drivesdk
part 1 SHA256 6e199f6f2d6efb73252038892f0dc2a41892aa1bbb3c2888b5b4b5e45270ba3c https://drive.google.com/file/d/1Ws-lJGHGUPFVg0i43hdhct3vue6pkOW-/view?usp=drivesdk
part 2 SHA256 70bc0439aceba6fd5642b8e819b69959e977db25e993dfa027a9abb3ba2d6549 https://drive.google.com/file/d/1wDnWAWPIdFxs1RqHAG5ow2vOt4mkNekY/view?usp=drivesdk
part 3 SHA256 ff1f41ae4c20f2b8c7b61877671e68f0e7e9fc6a8c8852e1748c5c06f99b0627 https://drive.google.com/file/d/1f-rJ_4Z1yV4lc7F2BBVartTFB84WZEJy/view?usp=drivesdk
drive-offload-review-material-r04-20261015 — SHA256 adf793994e1d0079b226f882d40fd9dc0d8282da42d7b04d24195e2b3a84c151
part 0 SHA256 88c14f4fc36278bdbe953e60a4a9a0c03312c4a90fc4a18b6cdbb44af8c811c8 https://drive.google.com/file/d/1zDFSBgYRTnNh633ee8yzsjtq7dQeHoWp/view?usp=drivesdk
part 1 SHA256 2c05a971176d0b5e9f3c288f69ce5d4ec9dc6c8623d6c52edbd709aa5f4b9b0c https://drive.google.com/file/d/1adCPiKM7VECXZxCX1AHdBZxUSKXIyAiC/view?usp=drivesdk
part 2 SHA256 608f89ef345bee96cd275ae67ee6b0636fc9165e7a3ef539b1e48d1b973f27ac https://drive.google.com/file/d/15_UXbGuW50NkTf1RgbkBSpUodPmXfcY9/view?usp=drivesdk
part 3 SHA256 a6e73590c86b6282ef63fd88863de357911434998f389229cdb2ac1f470a53bc https://drive.google.com/file/d/1ki8e92PBUZeOavzsuvfQU4zoMIvwQdyA/view?usp=drivesdk
part 4 SHA256 a50e262a1ec412b97f1185b469d436f4fcd1fc020cbbe972209a6f609448bb13 https://drive.google.com/file/d/1I8To-mkJC_kmQZyYiRbrCipaeF4cidcl/view?usp=drivesdk
part 5 SHA256 67ba53bbd2dc2416661e888758419d9465d3a5dd5f8ffc191f788493e013f305 https://drive.google.com/file/d/1ILqHWPtXVjZ4nvgkaNBgjw4TrEdIuXpZ/view?usp=drivesdk
part 6 SHA256 a88d6f246cef9c98686f94cf1167b4a6cb980610d44043e404f7515575adb202 https://drive.google.com/file/d/1K1xXtKe-PNuVtpqgjltLXMuJJVlOL-zO/view?usp=drivesdk
r08-new — SHA256 2ef5e8150023a0d1e3038aa3b7df78b720ee56343b4f2cb831568e2a5164ddc8
https://drive.google.com/file/d/1Y4rzlArj92SAMqlTYIAK_P9rZ7QvrcVT/view?usp=drivesdk
Verify each listed part hash and concatenate parts in numeric order for each old archive. Verify complete archive hashes. Use Python 3.12:
`python3 restore.py MANIFEST.json.gz /fresh/destination cold-r06.tar.gz review-material-r04.tar.gz new-objects-r08.tar.gz`
Supply every archive listed above (one argument per complete archive). No archive is downloaded by the script. It checks whole archive hashes, refuses existing output paths, restores .review-material/ only, and verifies every original file size/hash before applying preserved modes/mtimes. Wrong or missing archives fail. This is storage preservation and grants no original game acceptance credit.
@@ -0,0 +1,15 @@
{
"retired_source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/P18-01-CODE-review-7d78df63/.review-material",
"files": 8245,
"logical_bytes": 1903916982,
"free_before": 1438687232,
"free_after": 1445711872,
"net_free_delta": 7024640,
"new_archive_bytes": 1800566,
"all_restore_bytes_verified": true,
"source_worktree_retained": true,
"current_canonical_proof_retained": true,
"normal_run_and_traceability_records_retained": true,
"pointer": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/P18-01-CODE-review-7d78df63.review-material.CLOUD_R08.json",
"formal_original_credit": 0
}
@@ -0,0 +1,8 @@
{
"all8245_file_bytes_modes_mtimes_exact": true,
"no_open_files": true,
"actual_cloud_readback_new_and_prior_objects_complete": true,
"backend_normal_final_verified": true,
"source_worktree_and_current_canonical_proof_excluded": true,
"formal_original_credit": 0
}
@@ -0,0 +1,37 @@
"""Restore byte-verified multi-archive objects to a fresh destination only."""
import argparse,contextlib,gzip,hashlib,json,os,tarfile
from pathlib import Path
def sha(path):
with Path(path).open('rb')as f:return hashlib.file_digest(f,'sha256').hexdigest()
p=argparse.ArgumentParser();p.add_argument('manifest');p.add_argument('destination');p.add_argument('archives',nargs='+');a=p.parse_args();mp=Path(a.manifest);raw=gzip.decompress(mp.read_bytes())if mp.suffix=='.gz'else mp.read_bytes();m=json.loads(raw);dest=Path(a.destination).resolve();rows=m['members'];expected={v['sha256']:k for k,v in m['archives'].items()};provided={}
for archive in a.archives:
h=sha(archive);assert h in expected and expected[h] not in provided;provided[expected[h]]=Path(archive)
needed={x['archive']for x in rows if x['type']=='file'};assert needed<=provided.keys();assert len({x['path']for x in rows})==len(rows);by_hash={}
for x in rows:
path=Path(x['path']);assert not path.is_absolute()and '..'not in path.parts and '.'not in path.parts;q=dest/path;assert q.resolve().is_relative_to(dest)and not q.exists()and not q.is_symlink()
if x['type']=='file':by_hash.setdefault(x['sha256'],[]).append(x)
else:assert x['type']=='directory'
for x in rows:
if x['type']=='directory':(dest/x['path']).mkdir(parents=True,exist_ok=True)
seen=set();restored=0
for label,path in provided.items():
with tarfile.open(path,'r|gz')as t:
for entry in t:
assert entry.isfile()
if not entry.name.startswith('objects/'):continue
key=entry.name[8:];group=[x for x in by_hash.get(key,[])if x['archive']==label]
if not group:continue
assert key not in seen;seen.add(key);assert all(x['bytes']==entry.size for x in group);digest=hashlib.sha256()
with contextlib.ExitStack()as stack:
handles=[stack.enter_context((dest/x['path']).open('xb'))for x in group];source=stack.enter_context(t.extractfile(entry))
for chunk in iter(lambda:source.read(1024**2),b''):
digest.update(chunk)
for f in handles:f.write(chunk)
assert digest.hexdigest()==key
for x in group:
q=dest/x['path'];assert q.stat().st_size==x['bytes'];os.chmod(q,x['mode']);os.utime(q,ns=(x['mtime_ns'],x['mtime_ns']));restored+=1
assert seen==set(by_hash)and restored==m['files']
for x in reversed(rows):
if x['type']=='directory':q=dest/x['path'];os.chmod(q,x['mode']);os.utime(q,ns=(x['mtime_ns'],x['mtime_ns']))
print('Restored and verified',restored,'files')
@@ -0,0 +1,16 @@
from pathlib import Path
import json,gzip,hashlib,time
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');base=r/'docs/plans/original-completion-2026-10-02/execution';root=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/P18-01-CODE-review-7d78df63/.review-material');own=json.loads((root/'manifest.json').read_text());assert own['candidate']=='265ce30f81b1302ca374330f7129f02d6fde4697';refs={}
for batch in ['drive-offload-review-material-r04-20261015','drive-offload-cold-r06-20261015']:
m=json.loads(gzip.decompress((base/batch/'MANIFEST.json.gz').read_bytes()));v=json.loads((base/batch/'CLOUD_ARCHIVE_VERIFIED.json').read_text());assert v['actual_cloud_readback']
for x in m['members']:
if x['type']=='file':refs.setdefault(x['sha256'],{'batch':batch,'bytes':x['bytes']})
rows=[];missing={};t=time.monotonic()
for p in sorted(root.rglob('*')):
assert not p.is_symlink();s=p.stat();row={'path':str(p.relative_to(root)),'type':'directory' if p.is_dir() else 'file','mode':s.st_mode&0o777,'mtime_ns':s.st_mtime_ns}
if p.is_file():
with p.open('rb') as f:h=hashlib.file_digest(f,'sha256').hexdigest()
ref=refs.get(h);assert ref is None or ref['bytes']==s.st_size;row.update(bytes=s.st_size,sha256=h,existing_cloud_batch=ref['batch'] if ref else None)
if not ref:missing.setdefault(h,{'path':str(p),'bytes':s.st_size})
rows.append(row)
result={'source':str(root),'candidate':own['candidate'],'backend_completed':True,'members':rows,'file_count':sum(x['type']=='file' for x in rows),'logical_bytes':sum(x.get('bytes',0)for x in rows),'uncovered_unique_objects':missing,'uncovered_unique_bytes':sum(x['bytes']for x in missing.values()),'seconds':time.monotonic()-t,'source_retired':False,'formal_credit':0};e=base/'drive-offload-p18-review-r08-20261015';e.mkdir(exist_ok=False);raw=json.dumps(result,ensure_ascii=False,indent=2).encode();(e/'COVERAGE_PRECHECK.json.gz').write_bytes(gzip.compress(raw,mtime=0));print({k:v for k,v in result.items() if k not in ['members','uncovered_unique_objects']});print('uncovered_objects',len(missing))
@@ -0,0 +1,20 @@
from pathlib import Path
import json,gzip,hashlib,tarfile,shutil
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');base=r/'docs/plans/original-completion-2026-10-02/execution';e=base/'drive-offload-p18-review-r08-20261015';c=json.loads(gzip.decompress((e/'COVERAGE_PRECHECK.json.gz').read_bytes()));tmp=Path('/private/tmp/thetree-p18-cold-r08');tmp.mkdir(exist_ok=False);archive=tmp/'new-objects-r08.tar.gz';needed=c['uncovered_unique_objects'];assert sum(x['bytes']for x in needed.values())<50*1024**2
with tarfile.open(archive,'w:gz')as t:
for h,x in sorted(needed.items()):
p=Path(x['path']);assert p.stat().st_size==x['bytes']
with p.open('rb')as f:assert hashlib.file_digest(f,'sha256').hexdigest()==h
info=tarfile.TarInfo('objects/'+h);info.size=x['bytes'];info.mode=0o600
with p.open('rb')as f:t.addfile(info,f)
newhash=hashlib.sha256(archive.read_bytes()).hexdigest();archives={}
for batch in sorted({x.get('existing_cloud_batch')for x in c['members']if x['type']=='file'and x.get('existing_cloud_batch')}):
p=base/batch;v=json.loads((p/'CLOUD_ARCHIVE_VERIFIED.json').read_text());archives[batch]={'sha256':v['whole_archive_sha256'],'cloud_parts':json.loads((p/'CLOUD_PARTS.json').read_text()),'prior_actual_cloud_readback':v}
archives['r08-new']={'sha256':newhash,'cloud_url':None,'bytes':archive.stat().st_size}
rows=[]
root=Path(c['source']);s=root.stat();rows.append({'path':'.review-material','type':'directory','mode':s.st_mode&0o777,'mtime_ns':s.st_mtime_ns})
for x in c['members']:
v={k:val for k,val in x.items()if k!='existing_cloud_batch'};v['path']='.review-material/'+x['path']
if x['type']=='file':v['archive']=x['existing_cloud_batch']or'r08-new'
rows.append(v)
m={'source_root':c['source'],'restore_base':str(root.parent),'candidate':c['candidate'],'backend_completed':True,'members':rows,'files':c['file_count'],'logical_bytes':c['logical_bytes'],'archives':archives,'scope':'Closed independent backend review material only; source worktree/current canonical native proof and all formal run/traceability records stay local','formal_credit':0};(e/'MANIFEST.pending.json').write_text(json.dumps(m,ensure_ascii=False,indent=2)+'\n');(e/'NEW_OBJECTS_PREPARED.json').write_text(json.dumps({'path':str(archive),'sha256':newhash,'bytes':archive.stat().st_size,'objects':len(needed),'raw_unique_bytes':c['uncovered_unique_bytes'],'prior_logical_bytes_reused':c['logical_bytes']-c['uncovered_unique_bytes']},indent=2)+'\n');print({'new_archive_bytes':archive.stat().st_size,'new_objects':len(needed),'original_files':c['file_count']})
@@ -0,0 +1,18 @@
from pathlib import Path
import json,gzip,hashlib,subprocess,shutil
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');e=r/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p18-review-r08-20261015';m=json.loads(gzip.decompress((e/'MANIFEST.json.gz').read_bytes()));v=json.loads((e/'CLOUD_ALL_BYTES_VERIFIED.json').read_text());assert v['all_four_raw_bytes_identical']and v['all_new_objects_individually_verified']==188 and v['original_file_mappings']==8245
root=Path(m['source_root']);assert str(root)=='/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/P18-01-CODE-review-7d78df63/.review-material';assert not root.is_symlink();trace=json.loads((r/'docs/plans/original-completion-2026-10-02/execution/p18-01-resume-20261015/RUNNER_BACKEND_COMPLETION_TRACEABILITY_265_R02.json').read_text());assert trace['implementation_commit']==m['candidate']and all(any(x['kind']==kind and x['passed']==1 and x['commit_sha']==commit for x in trace['evidence'])for kind,commit in [('review',m['candidate']),('final',trace['integration_commit'])])
assert json.loads((root/'manifest.json').read_text())['candidate']==m['candidate'];check=subprocess.run(['lsof','-nP','+D',str(root)],capture_output=True);assert check.returncode==1 and not check.stdout
expected={x['path']for x in m['members']if x['type']=='file'};actual={'.review-material/'+str(x.relative_to(root))for x in root.rglob('*')if x.is_file()};assert actual==expected
for x in m['members']:
p=root.parent/x['path'];assert not p.is_symlink();s=p.stat();assert s.st_mode&0o777==x['mode'] and s.st_mtime_ns==x['mtime_ns']
if x['type']=='file':
with p.open('rb')as f:h=hashlib.file_digest(f,'sha256').hexdigest()
assert h==x['sha256'] and s.st_size==x['bytes']
(e/'SOURCE_RECHECK.json').write_text(json.dumps({'all8245_file_bytes_modes_mtimes_exact':True,'no_open_files':True,'actual_cloud_readback_new_and_prior_objects_complete':True,'backend_normal_final_verified':True,'source_worktree_and_current_canonical_proof_excluded':True,'formal_original_credit':0},indent=2)+'\n')
before=shutil.disk_usage(r).free;quarantine=root.with_name('.review-material-retiring-r08');assert not quarantine.exists();root.rename(quarantine)
for x in m['members']:
if x['type']=='file':
p=quarantine/Path(x['path']).relative_to('.review-material');assert p.stat().st_mtime_ns==x['mtime_ns'];p.unlink()
for p in sorted([p for p in quarantine.rglob('*')if p.is_dir()],key=lambda p:len(p.parts),reverse=True):p.rmdir()
quarantine.rmdir();after=shutil.disk_usage(r).free;pointer=root.parent.with_name(root.parent.name+'.review-material.CLOUD_R08.json');pointer.write_text(json.dumps({'retired_source':str(root),'local_manifest':str(e/'MANIFEST.json.gz'),'cloud_files':v['files'],'restore_instructions':str(e/'RESTORE.md'),'prior_archives_required':list(m['archives']),'source_worktree_retained':True,'formal_original_credit':0},indent=2)+'\n');result={'retired_source':str(root),'files':8245,'logical_bytes':m['logical_bytes'],'free_before':before,'free_after':after,'net_free_delta':after-before,'new_archive_bytes':1800566,'all_restore_bytes_verified':True,'source_worktree_retained':root.parent.exists(),'current_canonical_proof_retained':Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/.runtime/P18-01-CODE/build/p18-relationship-evidence/receipt.json').exists(),'normal_run_and_traceability_records_retained':True,'pointer':str(pointer),'formal_original_credit':0};(e/'RETIREMENT.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');print(json.dumps(result,ensure_ascii=False))
@@ -0,0 +1,30 @@
[
{
"name": "raw.tar.gz",
"bytes": 12544116,
"sha256": "a4c357ca3ad013698e7d02a468a0e63df5bed09eab89e02db70878103cb3b833",
"drive_url": "https://drive.google.com/file/d/1p6dH56r0KKmMJ8ZdkmcUUJTXxNiORFTf/view?usp=drivesdk",
"whole_raw_readback_verified": true
},
{
"name": "MANIFEST.json.gz",
"bytes": 147106,
"sha256": "5707dbf0e701444dacd0f6435923aa231ca18fe6fe1d3b32fb5b5ad0398f46cf",
"drive_url": "https://drive.google.com/file/d/1pKUdud66nQ0mKTnYoQU3EXpP3uDBSGj4/view?usp=drivesdk",
"whole_raw_readback_verified": true
},
{
"name": "restore.py",
"bytes": 1857,
"sha256": "7c4bb9ec983762b91b9b02b36f0caab5627c8b1ed8fc1d2bcdfbd090f95cdb98",
"drive_url": "https://drive.google.com/file/d/1yNBFrvlSQSvwFrZJnoy0qu8w2xjhJFOO/view?usp=drivesdk",
"whole_raw_readback_verified": true
},
{
"name": "RESTORE.md",
"bytes": 1284,
"sha256": "e1974c4cbd083094e849c074982ad1381d7e658c2c560cd7b325210220b159ae",
"drive_url": "https://drive.google.com/file/d/1AgFqZSWs1BEhu-XZFUYkp0G6m2gnYF1P/view?usp=drivesdk",
"whole_raw_readback_verified": true
}
]
@@ -0,0 +1,13 @@
{
"scope": "Ended historical P23 native impact 19fc3f5 local remainder. Preserve all raw/image/save/lifecycle bytes. Its stage was previously verified in cloud r03; existing pointer preserved, not duplicated. Restore both layers before any complete raw review. No new acceptance credit.",
"source": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-03-native-impact-19fc3f5-r01",
"archive": {
"path": "/private/tmp/thetree-p23-impact-cold-r11.tar.gz",
"bytes": 12544116,
"sha256": "a4c357ca3ad013698e7d02a468a0e63df5bed09eab89e02db70878103cb3b833"
},
"local_roundtrip_verified": true,
"ended_result_sha256": "70ef0d2dca0f2ade5291d88f53bdd42123d090ce0c4bfb3cb91b478c1bf33d0d",
"free_before_archive": 1475330048,
"retirement_pending_cloud_readback": true
}
@@ -0,0 +1,13 @@
# P23 impact 19fc3f5 old raw restore
This archive preserves the complete remaining local files of the ended historical `p23-03-native-impact-19fc3f5-r01` run, including all original layout states, images, save evidence and lifecycle records. It does not grant new game/device acceptance.
The stage was already archived by r03. Its original CLOUD_STAGE_ARCHIVE_R03.json pointer is included unchanged; restore that separate r03 layer as well before a full source/stage audit. This r11 does not duplicate that prior cloud stage.
Download the r11 whole gzip archive, MANIFEST.json.gz and restore.py recorded in CLOUD_ALL_BYTES_VERIFIED.json. On a volume with space for the restored 229,945,347 bytes, run:
`python3 restore.py MANIFEST.json.gz evidence.tar.gz /absolute/fresh/restored-impact-r11`
The archive is 12,544,116 bytes, SHA-256 `a4c357ca3ad013698e7d02a468a0e63df5bed09eab89e02db70878103cb3b833`. The script rejects an existing destination and verifies the archive plus every file before restoring mode and mtime_ns.
Local retirement is allowed only after cloud raw readback matches every uploaded byte and the complete original tree is rehashed and verified closed. The final physical free-space measurement is in RETIREMENT.json; logical totals are not physical recovery.
@@ -0,0 +1,16 @@
{
"retired_root": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-03-native-impact-19fc3f5-r01",
"files": 2694,
"logical_bytes": 229945347,
"free_before_retirement": 3267485696,
"free_after_retirement": 3280805888,
"delta_including_temporary_archive_removal": 13320192,
"temporary_archive_bytes_removed": 12544116,
"delta_excluding_temporary_archive": 776076,
"free_before_preparation": 1475330048,
"net_free_change_since_preparation": 1805475840,
"archive_and_metadata_cloud_raw_readback_verified": true,
"all_original_stage_pointer_bytes_preserved_in_archive": true,
"current_P04_source_raw_and_cache_untouched": true,
"formal_credit": 0
}
@@ -0,0 +1,6 @@
{
"files": 2694,
"bytes_mode_mtime_sha_all_exact": true,
"no_open_files": true,
"all_cloud_archive_and_restore_bytes_verified": true
}
@@ -0,0 +1,25 @@
from pathlib import Path
import hashlib,json,os,shutil,tarfile,time
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');S=R/'artifacts/original-completion-2026-10-02/p23-03-native-impact-19fc3f5-r01';E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p23-impact-r11-20261016';E.mkdir(exist_ok=False);T=Path('/private/tmp/thetree-p23-impact-cold-r11.tar.gz');assert not T.exists();sha=lambda p:hashlib.file_digest(p.open('rb'),'sha256').hexdigest();result=json.loads((S/'runner-ended.json').read_text());assert result['error']is None and not result['cleanup_errors']and all(z['engine_ended']for z in result['cleanup']);rows=[];dirs=[]
for p in [S]+sorted(S.rglob('*')):
assert not p.is_symlink();st=p.stat();n='.'if p==S else str(p.relative_to(S));meta={'path':n,'mode':st.st_mode&0o777,'mtime_ns':st.st_mtime_ns}
if p.is_dir():dirs.append(meta)
elif p.is_file():rows.append(dict(meta,bytes=st.st_size,sha256=sha(p)))
else:raise RuntimeError('special file')
free=shutil.disk_usage(S).free;budget=free-400*1024**2;assert budget>350*1024**2
class Guard:
def __init__(self,f):self.f=f
def write(self,b):
assert self.f.tell()+len(b)<budget,'archive bounded by measured free-space budget'
return self.f.write(b)
def __getattr__(self,n):return getattr(self.f,n)
with T.open('wb') as f:
with tarfile.open(fileobj=Guard(f),mode='w:gz',compresslevel=2)as out:
for d in dirs:out.add(S if d['path']=='.'else S/d['path'],arcname=d['path'],recursive=False)
for row in rows:out.add(S/row['path'],arcname=row['path'],recursive=False)
with tarfile.open(T,'r:gz')as archive:
for row in rows:
f=archive.extractfile(row['path']);assert f and hashlib.file_digest(f,'sha256').hexdigest()==row['sha256']
record={'scope':'Ended historical P23 native impact 19fc3f5 local remainder. Preserve all raw/image/save/lifecycle bytes. Its stage was previously verified in cloud r03; existing pointer preserved, not duplicated. Restore both layers before any complete raw review. No new acceptance credit.','source':str(S),'files':rows,'directories':dirs,'archive':{'path':str(T),'bytes':T.stat().st_size,'sha256':sha(T)},'local_roundtrip_verified':True,'ended_result_sha256':sha(S/'runner-ended.json'),'free_before_archive':free,'retirement_pending_cloud_readback':True};import gzip
with gzip.open(E/'MANIFEST.json.gz','wt')as f:json.dump(record,f,ensure_ascii=False,separators=(',',':'))
(E/'PREPARATION.json').write_text(json.dumps({k:v for k,v in record.items()if k not in ['files','directories']},indent=2)+'\n');print({'files':len(rows),'logical_bytes':sum(z['bytes']for z in rows),'archive':record['archive'],'manifest':str(E/'MANIFEST.json.gz')})
@@ -0,0 +1,27 @@
"""Restore historical P23 impact proof into a fresh directory; no overwrite."""
import argparse,gzip,hashlib,json,os,tarfile
from pathlib import Path
def sha(p):
with p.open('rb') as f:return hashlib.file_digest(f,'sha256').hexdigest()
p=argparse.ArgumentParser();p.add_argument('manifest',type=Path);p.add_argument('archive',type=Path);p.add_argument('target',type=Path);a=p.parse_args()
with gzip.open(a.manifest,'rt') as f:m=json.load(f)
assert sha(a.archive)==m['archive']['sha256'] and a.archive.stat().st_size==m['archive']['bytes']
assert not a.target.exists();a.target.mkdir(parents=True)
files={x['path']:x for x in m['files']};dirs={x['path']:x for x in m['directories']}
with tarfile.open(a.archive,'r:gz') as t:
members=t.getmembers();assert len(members)==len(files)+len(dirs) and {x.name for x in members}==set(files)|set(dirs)
for x in members:
n=Path(x.name);assert not n.is_absolute() and '..' not in n.parts and not x.issym() and not x.islnk()
dest=a.target/n
if x.isdir():assert x.name in dirs;dest.mkdir(parents=True,exist_ok=True)
else:
assert x.isfile() and x.name in files
dest.parent.mkdir(parents=True,exist_ok=True)
with t.extractfile(x) as source,dest.open('xb') as out:
while block:=source.read(1024**2):out.write(block)
for row in m['files']:
f=a.target/row['path'];assert f.stat().st_size==row['bytes'] and sha(f)==row['sha256'];os.chmod(f,row['mode']);os.utime(f,ns=(row['mtime_ns'],row['mtime_ns']))
for row in sorted(m['directories'],key=lambda x:len(Path(x['path']).parts),reverse=True):
f=a.target/row['path'];os.chmod(f,row['mode']);os.utime(f,ns=(row['mtime_ns'],row['mtime_ns']))
print(json.dumps({'restored_files':len(files),'all_bytes_sha256_verified':True,'mode_mtime_ns_restored':True,'target':str(a.target)}))
@@ -0,0 +1,9 @@
from pathlib import Path
import json,gzip,hashlib,subprocess,shutil
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p23-impact-r11-20261016';verified=json.loads((E/'CLOUD_ALL_BYTES_VERIFIED.json').read_text());assert len(verified)==4 and all(x['whole_raw_readback_verified']for x in verified);m=json.loads(gzip.decompress((E/'MANIFEST.json.gz').read_bytes()));S=Path(m['source']);assert S==R/'artifacts/original-completion-2026-10-02/p23-03-native-impact-19fc3f5-r01';archive=Path(m['archive']['path']);sha=lambda p:hashlib.file_digest(p.open('rb'),'sha256').hexdigest();assert archive.is_file()and sha(archive)==m['archive']['sha256']==next(x['sha256']for x in verified if x['name']=='raw.tar.gz');assert {str(p.relative_to(S))for p in S.rglob('*')if p.is_file()}=={x['path']for x in m['files']}
for row in m['files']:
p=S/row['path'];s=p.stat();assert not p.is_symlink()and s.st_size==row['bytes']and s.st_mode&0o777==row['mode']and s.st_mtime_ns==row['mtime_ns']and sha(p)==row['sha256']
closed=subprocess.run(['/usr/sbin/lsof','-nP','+D',str(S)],capture_output=True,text=True);assert closed.returncode==1 and not closed.stdout.strip()and not closed.stderr.strip();pointer={'state':'cloud_archived','source_root':str(S),'scope':'Historical ended impact raw/layout/save/lifecycle only; stage already separately cloud archived r03, pointer included in r11; no new acceptance credit','manifest':str(E/'MANIFEST.json.gz'),'restore':str(E/'RESTORE.md'),'cloud_files':verified,'all_source_files_rehashed_before_retirement':True};(E/'SOURCE_RECHECK.json').write_text(json.dumps({'files':len(m['files']),'bytes_mode_mtime_sha_all_exact':True,'no_open_files':True,'all_cloud_archive_and_restore_bytes_verified':True},indent=2)+'\n');before=shutil.disk_usage(R).free
for row in m['files']:(S/row['path']).unlink()
for d in sorted((p for p in S.rglob('*')if p.is_dir()),key=lambda p:len(p.parts),reverse=True):d.rmdir()
assert not list(S.iterdir());(S/'CLOUD_R11.json').write_text(json.dumps(pointer,indent=2)+'\n');archive.unlink();after=shutil.disk_usage(R).free;result={'retired_root':str(S),'files':len(m['files']),'logical_bytes':sum(x['bytes']for x in m['files']),'free_before_retirement':before,'free_after_retirement':after,'delta_including_temporary_archive_removal':after-before,'temporary_archive_bytes_removed':m['archive']['bytes'],'delta_excluding_temporary_archive':after-before-m['archive']['bytes'],'free_before_preparation':m['free_before_archive'],'net_free_change_since_preparation':after-m['free_before_archive'],'archive_and_metadata_cloud_raw_readback_verified':True,'all_original_stage_pointer_bytes_preserved_in_archive':True,'current_P04_source_raw_and_cache_untouched':True,'formal_credit':0};(E/'RETIREMENT.json').write_text(json.dumps(result,indent=2)+'\n');print(result)
@@ -0,0 +1,6 @@
{
"drive_url": "https://drive.google.com/file/d/1eslpvIz5OAubtMwGs3ifWcRlUUeLIvCm/view?usp=drivesdk",
"bytes": 4139,
"sha256": "1a362a5bfa6e185bc7d667f0e3a3be6da0e88fcd1bacbcaa76539f1740d5aee5",
"whole_raw_readback_verified": true
}
@@ -0,0 +1,16 @@
[
{
"name": "MANIFEST.json.gz",
"bytes": 354272,
"sha256": "fbb20c5ea84d1591e1764279100b8e30e126f624d48dcca692f1cb4edcda6df6",
"drive_url": "https://drive.google.com/file/d/1xue8YgVnvt2kZV9LCqdmBte4W6QE0Yzo/view?usp=drivesdk",
"whole_raw_readback_verified": true
},
{
"name": "restore.py",
"bytes": 1857,
"sha256": "b79504fe8d6950896f8a791a83f9f7b4fc342b878d0227f9f6bd186ff77a5bbb",
"drive_url": "https://drive.google.com/file/d/1AmbnamrmJs9Yh4y1Ifi2GHkbUAXpZGTS/view?usp=drivesdk",
"whole_raw_readback_verified": true
}
]
@@ -0,0 +1,6 @@
{
"bytes": 2294,
"sha256": "6ce84b50e5c48f6b1e2a908ec03dfcee8cc2d4dfd2ed702657d1faf0eb511d2c",
"drive_url": "https://drive.google.com/file/d/1T4KFGSxzKlhgw-Trxr0UZ-vaaNVp1bos/view?usp=drivesdk",
"whole_raw_verified": true
}
@@ -0,0 +1,5 @@
{
"archive_sha256": "dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b",
"upload_failed": "connector blob upload timeout after 300002ms; no confirmed archive Drive file",
"handling": "32MiB exact-byte chunks with same concatenated hash; source raw retained until all cloud raw readbacks verified"
}
@@ -0,0 +1,95 @@
{
"archive_sha256": "dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b",
"archive_bytes": 245023778,
"local_concat_hash_verified": true,
"parts": [
{
"part": 0,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part00",
"bytes": 33554432,
"sha256": "11f7bd9aec8c1e35bd2dec4e907de57666654bb1990968d6941698f79e321ff7",
"drive_url": "https://drive.google.com/file/d/1wPBGZys37ZajhknUh7tRnx_idnFPixuL/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 1,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part01",
"bytes": 33554432,
"sha256": "19051bb69f538285b7a7332b92d5385a9dca9365d862f52517d610ac668fa5cc",
"drive_url": "https://drive.google.com/file/d/1aK3KRotL1JQ30aRxTbVeVQ_QjAh-zCiP/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 2,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part02",
"bytes": 33554432,
"sha256": "cd0207ee21190cc642563c3abfcbe433ff456a0deb63dd6c4b176531020d9c61",
"drive_url": "https://drive.google.com/file/d/17qPEuyF3vj7VpBxCvz1XgFTzphHBTocS/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 3,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part03",
"bytes": 33554432,
"sha256": "5f645d1534d89cf029ab160a0714c404274026aaac30c38b96a2d9c737a6d936",
"drive_url": "https://drive.google.com/file/d/1yif3ZK6pRp2FN6Oi9O1wDmIz3M5xELR7/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 4,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part04",
"bytes": 33554432,
"sha256": "a76550841defbcb586162e2acb5676e181c59eed6eb6f7d7d61c5a73a5354ba1",
"drive_url": "https://drive.google.com/file/d/1inyT7mVWsvCs7KSqVK2scD6NfnrOTMU2/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 5,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part05",
"bytes": 33554432,
"sha256": "4d118656c80196f1e753ac4ecaa3f4a4868bd0769e65a4793b2c66950284309c",
"drive_url": "https://drive.google.com/file/d/1nR161ngD1PtWba63xyQa2Iz2532QGHN-/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 6,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part06",
"bytes": 33554432,
"sha256": "8a8998a3d5cb80a7ff8610f2039f251ac14a63443989f25f980dc4ef74ba258b",
"drive_url": "https://drive.google.com/file/d/1797U2YfQJbddTkM4dM3buk8qh4lgQUSm/view?usp=drivesdk",
"whole_cloud_raw_verified": true
},
{
"part": 7,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part07",
"bytes": 10142754,
"sha256": "461753179ed8837f3ea2e90085147b61ee674e485b3ee07b538776e6749a21d5",
"drive_url": "https://drive.google.com/file/d/1hMa59x1brxbHIdF7sHGTypscC-E7zPmK/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
],
"all_parts_cloud_raw_verified": true,
"whole_archive_identity": "Each cloud part SHA/length equals the local part sequence whose concatenated SHA/length was verified before upload; same archive bytes without duplicated download/reassembly.",
"restore_metadata": [
{
"name": "MANIFEST.json.gz",
"bytes": 354272,
"sha256": "fbb20c5ea84d1591e1764279100b8e30e126f624d48dcca692f1cb4edcda6df6",
"drive_url": "https://drive.google.com/file/d/1xue8YgVnvt2kZV9LCqdmBte4W6QE0Yzo/view?usp=drivesdk",
"whole_raw_readback_verified": true
},
{
"name": "restore.py",
"bytes": 1857,
"sha256": "b79504fe8d6950896f8a791a83f9f7b4fc342b878d0227f9f6bd186ff77a5bbb",
"drive_url": "https://drive.google.com/file/d/1AmbnamrmJs9Yh4y1Ifi2GHkbUAXpZGTS/view?usp=drivesdk",
"whole_raw_readback_verified": true
}
],
"restore_instructions": {
"bytes": 2294,
"sha256": "6ce84b50e5c48f6b1e2a908ec03dfcee8cc2d4dfd2ed702657d1faf0eb511d2c",
"drive_url": "https://drive.google.com/file/d/1T4KFGSxzKlhgw-Trxr0UZ-vaaNVp1bos/view?usp=drivesdk",
"whole_raw_verified": true
}
}
@@ -0,0 +1,55 @@
{
"archive_sha256": "dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b",
"archive_bytes": 245023778,
"local_concat_hash_verified": true,
"parts": [
{
"part": 0,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part00",
"bytes": 33554432,
"sha256": "11f7bd9aec8c1e35bd2dec4e907de57666654bb1990968d6941698f79e321ff7"
},
{
"part": 1,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part01",
"bytes": 33554432,
"sha256": "19051bb69f538285b7a7332b92d5385a9dca9365d862f52517d610ac668fa5cc"
},
{
"part": 2,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part02",
"bytes": 33554432,
"sha256": "cd0207ee21190cc642563c3abfcbe433ff456a0deb63dd6c4b176531020d9c61"
},
{
"part": 3,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part03",
"bytes": 33554432,
"sha256": "5f645d1534d89cf029ab160a0714c404274026aaac30c38b96a2d9c737a6d936"
},
{
"part": 4,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part04",
"bytes": 33554432,
"sha256": "a76550841defbcb586162e2acb5676e181c59eed6eb6f7d7d61c5a73a5354ba1"
},
{
"part": 5,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part05",
"bytes": 33554432,
"sha256": "4d118656c80196f1e753ac4ecaa3f4a4868bd0769e65a4793b2c66950284309c"
},
{
"part": 6,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part06",
"bytes": 33554432,
"sha256": "8a8998a3d5cb80a7ff8610f2039f251ac14a63443989f25f980dc4ef74ba258b"
},
{
"part": 7,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part07",
"bytes": 10142754,
"sha256": "461753179ed8837f3ea2e90085147b61ee674e485b3ee07b538776e6749a21d5"
}
]
}
@@ -0,0 +1,8 @@
{
"part": 0,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part00",
"bytes": 33554432,
"sha256": "11f7bd9aec8c1e35bd2dec4e907de57666654bb1990968d6941698f79e321ff7",
"drive_url": "https://drive.google.com/file/d/1wPBGZys37ZajhknUh7tRnx_idnFPixuL/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 1,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part01",
"bytes": 33554432,
"sha256": "19051bb69f538285b7a7332b92d5385a9dca9365d862f52517d610ac668fa5cc",
"drive_url": "https://drive.google.com/file/d/1aK3KRotL1JQ30aRxTbVeVQ_QjAh-zCiP/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 2,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part02",
"bytes": 33554432,
"sha256": "cd0207ee21190cc642563c3abfcbe433ff456a0deb63dd6c4b176531020d9c61",
"drive_url": "https://drive.google.com/file/d/17qPEuyF3vj7VpBxCvz1XgFTzphHBTocS/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 3,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part03",
"bytes": 33554432,
"sha256": "5f645d1534d89cf029ab160a0714c404274026aaac30c38b96a2d9c737a6d936",
"drive_url": "https://drive.google.com/file/d/1yif3ZK6pRp2FN6Oi9O1wDmIz3M5xELR7/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 4,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part04",
"bytes": 33554432,
"sha256": "a76550841defbcb586162e2acb5676e181c59eed6eb6f7d7d61c5a73a5354ba1",
"drive_url": "https://drive.google.com/file/d/1inyT7mVWsvCs7KSqVK2scD6NfnrOTMU2/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 5,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part05",
"bytes": 33554432,
"sha256": "4d118656c80196f1e753ac4ecaa3f4a4868bd0769e65a4793b2c66950284309c",
"drive_url": "https://drive.google.com/file/d/1nR161ngD1PtWba63xyQa2Iz2532QGHN-/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 6,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part06",
"bytes": 33554432,
"sha256": "8a8998a3d5cb80a7ff8610f2039f251ac14a63443989f25f980dc4ef74ba258b",
"drive_url": "https://drive.google.com/file/d/1797U2YfQJbddTkM4dM3buk8qh4lgQUSm/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,8 @@
{
"part": 7,
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz.part07",
"bytes": 10142754,
"sha256": "461753179ed8837f3ea2e90085147b61ee674e485b3ee07b538776e6749a21d5",
"drive_url": "https://drive.google.com/file/d/1hMa59x1brxbHIdF7sHGTypscC-E7zPmK/view?usp=drivesdk",
"whole_cloud_raw_verified": true
}
@@ -0,0 +1,13 @@
{
"scope": "Ended failed P23-03 R14 entire cold artifact. Preserve negative history, current source and all acceptance requirements. No acceptance credit. Restore before any future direct raw review.",
"source": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-03-native-os-9a26f9a-r14",
"archive": {
"path": "/private/tmp/thetree-p23-r14-cold-r10.tar.gz",
"bytes": 245023778,
"sha256": "dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b"
},
"local_roundtrip_verified": true,
"ended_result_sha256": "8e8393203389cda699c426cb812c76fc733da626dd6bdfee2d63fb463d7d2c2f",
"free_before_archive": 1055105024,
"retirement_pending_cloud_readback": true
}
@@ -0,0 +1,15 @@
# 終了済みP23-03 R14の退避と復元
対象は `artifacts/original-completion-2026-10-02/p23-03-native-os-9a26f9a-r14` の全ファイルです。R14はスクリーン倍率校正のgateに失敗した負履歴であり、合格には変更しません。元の候補9a26f9a、画像、入力、ログ、stage、receiptを内容の削除・要約なしで保管します。現作業のP04/P18ソースと証拠は対象外です。
245,023,778バイトのgzipアーカイブは、大きなblob転送のタイムアウトを避けるため、32MiBずつ8個に分割しています。これは転送単位であり、レビュー資料や証跡内容の制限ではありません。`PARTS.json` の順序とDrive URLから全8個、`MANIFEST.json.gz`、`restore.py`を取得します。PARTS.jsonに各部分のSHA-256と長さ、MANIFEST.json.gzに全6,434ファイルのSHA-256・長さ・mode・mtime_nsがあります。
部分ごとのSHA-256を照合し、番号順にバイナリ結合して任意の空き容量のある場所へ `evidence.tar.gz` を作ります。結合後のSHA-256は `dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b`、長さは245,023,778バイトです。
```sh
python3 restore.py MANIFEST.json.gz evidence.tar.gz /absolute/path/to/fresh-restored-r14
```
復元先は未作成の新しいディレクトリに限定します。スクリプトはアーカイブ全体、各ファイルの内容と長さを検証し、modeとmtime_nsも復元します。稼働中のcheckoutやproofを上書きしません。過去の絶対パスが必要な再監査では、まず元のRoot記録および `CLOUD_R10.json` を確認し、既存ファイルがないことを確かめてから元の場所へ戻します。別プロセスの保存先への参照を、復元したことだけで実機受入へ読み替えません。
元ファイルのローカル退避は、全8部分のDrive原バイト読戻し、結合SHA一致、manifest・復元スクリプトの原バイト読戻し、元全ファイルの再照合、開かれていないことの確認をすべて満たした後だけ行います。最終状態はRETIREMENT.jsonで確認してください。退避準備や転送成功だけでは削除済みとは扱いません。
@@ -0,0 +1,17 @@
{
"retired_source": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-03-native-os-9a26f9a-r14",
"files": 6434,
"logical_bytes": 835064070,
"source_free_before_retirement": 768565248,
"free_after_retirement": 1801052160,
"measured_delta_including_temp_part_removal": 1032486912,
"temporary_parts_bytes_removed": 245023778,
"measured_delta_excluding_temp_part_bytes": 787463134,
"free_before_archive_preparation": 1055105024,
"net_free_change_since_preparation": 745947136,
"all_cloud_parts_raw_verified": true,
"all_restore_metadata_raw_verified": true,
"original_failed_status_preserved": true,
"source_and_current_work_proofs_untouched": true,
"formal_credit": 0
}
@@ -0,0 +1,7 @@
{
"files": 6434,
"all_bytes_mode_mtime_exact": true,
"source_has_no_open_files": true,
"all_cloud_parts_and_restore_metadata_full_raw_verified": true,
"archive_original_sha256": "dcc28679f7c7e8df7ce5bcac69d7c631114d5d16f38243a9c29ed8c9bbd9bb7b"
}
@@ -0,0 +1,25 @@
from pathlib import Path
import hashlib,json,os,shutil,tarfile,time
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');S=R/'artifacts/original-completion-2026-10-02/p23-03-native-os-9a26f9a-r14';E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p23-r14-r10-20261016';E.mkdir(exist_ok=False);T=Path('/private/tmp/thetree-p23-r14-cold-r10.tar.gz');assert not T.exists();sha=lambda p:hashlib.file_digest(p.open('rb'),'sha256').hexdigest();result=json.loads((R/'docs/plans/original-completion-2026-10-02/execution/p23-03/ROOT_9A26F9A_NATIVE_OS_R14_RESULT.json').read_text());assert result['collection_exit_code']==1 and all(z['engine_ended']for z in result['roles']);rows=[];dirs=[]
for p in [S]+sorted(S.rglob('*')):
assert not p.is_symlink();st=p.stat();n='.'if p==S else str(p.relative_to(S));meta={'path':n,'mode':st.st_mode&0o777,'mtime_ns':st.st_mtime_ns}
if p.is_dir():dirs.append(meta)
elif p.is_file():rows.append(dict(meta,bytes=st.st_size,sha256=sha(p)))
else:raise RuntimeError('special file')
free=shutil.disk_usage(S).free;budget=free-400*1024**2;assert budget>350*1024**2
class Guard:
def __init__(self,f):self.f=f
def write(self,b):
assert self.f.tell()+len(b)<budget,'archive bounded by measured free-space budget'
return self.f.write(b)
def __getattr__(self,n):return getattr(self.f,n)
with T.open('wb') as f:
with tarfile.open(fileobj=Guard(f),mode='w:gz',compresslevel=2)as out:
for d in dirs:out.add(S if d['path']=='.'else S/d['path'],arcname=d['path'],recursive=False)
for row in rows:out.add(S/row['path'],arcname=row['path'],recursive=False)
with tarfile.open(T,'r:gz')as archive:
for row in rows:
f=archive.extractfile(row['path']);assert f and hashlib.file_digest(f,'sha256').hexdigest()==row['sha256']
record={'scope':'Ended failed P23-03 R14 entire cold artifact. Preserve negative history, current source and all acceptance requirements. No acceptance credit. Restore before any future direct raw review.','source':str(S),'files':rows,'directories':dirs,'archive':{'path':str(T),'bytes':T.stat().st_size,'sha256':sha(T)},'local_roundtrip_verified':True,'ended_result_sha256':sha(R/'docs/plans/original-completion-2026-10-02/execution/p23-03/ROOT_9A26F9A_NATIVE_OS_R14_RESULT.json'),'free_before_archive':free,'retirement_pending_cloud_readback':True};import gzip
with gzip.open(E/'MANIFEST.json.gz','wt')as f:json.dump(record,f,ensure_ascii=False,separators=(',',':'))
(E/'PREPARATION.json').write_text(json.dumps({k:v for k,v in record.items()if k not in ['files','directories']},indent=2)+'\n');print({'files':len(rows),'logical_bytes':sum(z['bytes']for z in rows),'archive':record['archive'],'manifest':str(E/'MANIFEST.json.gz')})
@@ -0,0 +1,27 @@
"""Restore complete cold P23 R14 proof into a fresh directory; no overwrite."""
import argparse,gzip,hashlib,json,os,tarfile
from pathlib import Path
def sha(p):
with p.open('rb') as f:return hashlib.file_digest(f,'sha256').hexdigest()
p=argparse.ArgumentParser();p.add_argument('manifest',type=Path);p.add_argument('archive',type=Path);p.add_argument('target',type=Path);a=p.parse_args()
with gzip.open(a.manifest,'rt') as f:m=json.load(f)
assert sha(a.archive)==m['archive']['sha256'] and a.archive.stat().st_size==m['archive']['bytes']
assert not a.target.exists();a.target.mkdir(parents=True)
files={x['path']:x for x in m['files']};dirs={x['path']:x for x in m['directories']}
with tarfile.open(a.archive,'r:gz') as t:
members=t.getmembers();assert len(members)==len(files)+len(dirs) and {x.name for x in members}==set(files)|set(dirs)
for x in members:
n=Path(x.name);assert not n.is_absolute() and '..' not in n.parts and not x.issym() and not x.islnk()
dest=a.target/n
if x.isdir():assert x.name in dirs;dest.mkdir(parents=True,exist_ok=True)
else:
assert x.isfile() and x.name in files
dest.parent.mkdir(parents=True,exist_ok=True)
with t.extractfile(x) as source,dest.open('xb') as out:
while block:=source.read(1024**2):out.write(block)
for row in m['files']:
f=a.target/row['path'];assert f.stat().st_size==row['bytes'] and sha(f)==row['sha256'];os.chmod(f,row['mode']);os.utime(f,ns=(row['mtime_ns'],row['mtime_ns']))
for row in sorted(m['directories'],key=lambda x:len(Path(x['path']).parts),reverse=True):
f=a.target/row['path'];os.chmod(f,row['mode']);os.utime(f,ns=(row['mtime_ns'],row['mtime_ns']))
print(json.dumps({'restored_files':len(files),'all_bytes_sha256_verified':True,'mode_mtime_ns_restored':True,'target':str(a.target)}))
@@ -0,0 +1,15 @@
from pathlib import Path
import gzip,hashlib,json,shutil,subprocess,time
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-p23-r14-r10-20261016';index=json.loads((E/'CLOUD_INDEX_VERIFIED.json').read_text());assert index['whole_raw_readback_verified'];parts=json.loads((E/'PARTS.json').read_text());assert parts['all_parts_cloud_raw_verified'];m=json.loads(gzip.decompress((E/'MANIFEST.json.gz').read_bytes()));S=Path(m['source']);assert S==R/'artifacts/original-completion-2026-10-02/p23-03-native-os-9a26f9a-r14';sha=lambda p:hashlib.file_digest(p.open('rb'),'sha256').hexdigest();actual={str(p.relative_to(S)) for p in S.rglob('*') if p.is_file()};assert actual=={z['path'] for z in m['files']}
for z in m['files']:
p=S/z['path'];s=p.stat();assert not p.is_symlink() and s.st_size==z['bytes'] and s.st_mode&0o777==z['mode'] and s.st_mtime_ns==z['mtime_ns'] and sha(p)==z['sha256']
opened=subprocess.run(['/usr/sbin/lsof','-nP','+D',str(S)],capture_output=True,text=True);assert opened.returncode==1 and not opened.stdout.strip() and not opened.stderr.strip(), 'source must have no open files'
for row in parts['parts']:
p=Path(row['path']);assert p.parent==Path('/private/tmp') and p.name.startswith('thetree-p23-r14-cold-r10.tar.gz.part') and p.stat().st_size==row['bytes'] and sha(p)==row['sha256']
(E/'SOURCE_RECHECK.json').write_text(json.dumps({'files':len(m['files']),'all_bytes_mode_mtime_exact':True,'source_has_no_open_files':True,'all_cloud_parts_and_restore_metadata_full_raw_verified':True,'archive_original_sha256':m['archive']['sha256']},indent=2)+'\n')
before=shutil.disk_usage(R).free
for z in m['files']:(S/z['path']).unlink()
for d in sorted((p for p in S.rglob('*')if p.is_dir()),key=lambda p:len(p.parts),reverse=True):d.rmdir()
assert not list(S.iterdir());pointer={'classification':'Ended failed P23 R14 raw proof moved to verified Drive parts; restore before raw review, no acceptance credit','index':index,'local_restore_metadata':str(E),'all_original_files':len(m['files']),'archive_sha256':m['archive']['sha256']};(S/'CLOUD_R10.json').write_text(json.dumps(pointer,indent=2)+'\n')
for row in parts['parts']:Path(row['path']).unlink()
after=shutil.disk_usage(R).free;result={'retired_source':str(S),'files':len(m['files']),'logical_bytes':sum(z['bytes']for z in m['files']),'source_free_before_retirement':before,'free_after_retirement':after,'measured_delta_including_temp_part_removal':after-before,'temporary_parts_bytes_removed':m['archive']['bytes'],'measured_delta_excluding_temp_part_bytes':after-before-m['archive']['bytes'],'free_before_archive_preparation':m['free_before_archive'],'net_free_change_since_preparation':after-m['free_before_archive'],'all_cloud_parts_raw_verified':True,'all_restore_metadata_raw_verified':True,'original_failed_status_preserved':True,'source_and_current_work_proofs_untouched':True,'formal_credit':0};(E/'RETIREMENT.json').write_text(json.dumps(result,indent=2)+'\n');print(result)
@@ -0,0 +1,14 @@
{
"actual_observations": {
"data_volume_local_snapshots": 0,
"swap_total_MiB": 11776,
"swap_used_MiB": 10962.44,
"swap_free_MiB": 813.56,
"managed_worktrees_du_reported_GiB": 20,
"free_data_volume_display_GiB": 1.9
},
"interpretation": "Swap currently occupies about 10.7GiB. This is an observed current component, not a proven attribution of the whole prior 20GB loss. Managed checkout du totals count shared blocks more than once. Verified duplicate retirement recovered only 983040 bytes; other live clones may share blocks. No Data snapshots were found, so do not claim local Time Machine snapshots caused this observed retention.",
"actions_not_taken": "No user applications stopped, no swap files removed, no security/system settings changed. Current P18 evidence and working P04 source retained.",
"next": "Complete normal P18 integration/final before retiring now-needed review material; archive cold raw results only after byte-verified cloud restore coverage.",
"formal_credit": 0
}
@@ -0,0 +1,31 @@
{
"files": [
{
"name": "MANIFEST.json.gz",
"id": "17HJ557ubOExyFY5b9kA4pwg9w1xVXIEi",
"url": "https://drive.google.com/file/d/17HJ557ubOExyFY5b9kA4pwg9w1xVXIEi/view?usp=drivesdk",
"bytes": 460534,
"sha256": "7cc2109c02fd736d330eee999b5e42ce07ace66ca1632f346da7a2d1b76cd8df",
"actual_cloud_readback_verified": true
},
{
"name": "restore.py",
"id": "16mdDaY1SU16PuQwkMpd2CVpUbWOMntDu",
"url": "https://drive.google.com/file/d/16mdDaY1SU16PuQwkMpd2CVpUbWOMntDu/view?usp=drivesdk",
"bytes": 1921,
"sha256": "341d0558dd720da841a7ca2f6fcb37ca25ef000739f850123c401a0619822ea9",
"actual_cloud_readback_verified": true
},
{
"name": "RESTORE.md",
"id": "1OAHniK0NRDks2DvuQqn3enIrz_yEj8ap",
"url": "https://drive.google.com/file/d/1OAHniK0NRDks2DvuQqn3enIrz_yEj8ap/view?usp=drivesdk",
"bytes": 594,
"sha256": "f869d11402ffe7234739ee5144752c4b609645ceed5bd6d27c3fe2aca0131abc",
"actual_cloud_readback_verified": true
}
],
"all_mapping_and_restore_bytes_identical": true,
"reuses_already_readback_verified_r06_payloads": true,
"formal_credit": 0
}
@@ -0,0 +1,3 @@
# Cold visual r07 restore
Download the four r06 parts listed in MANIFEST.json.gz, verify part sizes and hashes, concatenate in order, verify archive SHA256 75953c3d35d5fbc633e7cb68c6510ea8ad33aa9b7591a83feccd1d8c69389cc0. Run Python 3.12: `python3 restore.py cold-r06.tar.gz MANIFEST.json.gz /fresh/destination`. The prior verified content-addressed archive contains every byte. This restores only proof/ to a fresh destination and rejects existing outputs, wrong archive hashes, path escape, wrong file hashes and size. File modes and mtimes are restored. No new payload archive was created.
@@ -0,0 +1,15 @@
{
"source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p23-03-code/P23-03-visual-r13-64f7596e/.review-material/proof",
"retired_files": 8485,
"logical_bytes": 903401562,
"free_before": 2080239616,
"free_after": 2081222656,
"net_free_delta": 983040,
"raw_payload_upload_bytes": 0,
"cloud_mapping_and_restore_verified": true,
"source_worktree_retained": true,
"remaining_review_material_retained": true,
"current_r14_proof_retained": true,
"pointer": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p23-03-code/P23-03-visual-r13-64f7596e.review-proof.CLOUD_R07.json",
"formal_credit": 0
}
@@ -0,0 +1,14 @@
{
"source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p23-03-code/P23-03-visual-r13-64f7596e/.review-material/proof",
"closed_review_record": "execution/p23-03/R13_VISUAL_BULK_TIMEOUT.json",
"closed_owner_pid": 66756,
"old_review_exit_code": 124,
"same_bulk_restart": false,
"open_files_found": false,
"all_source_payloads_in_verified_r06": true,
"files": 8485,
"logical_bytes": 903401562,
"free_before": 2084601856,
"required_before_retirement": "upload and byte-verify mapping/restore docs, full source rehash; keep source worktree and remaining review material",
"formal_credit": 0
}

Some files were not shown because too many files have changed in this diff Show More