Compare commits

...
Author SHA1 Message Date
Agent Control Runner a7e3069b16 P13-02-CODE1: P13-02 背面対象参照・占有・保存の非描写機構(全原成果の一部、加算なし) 2026-10-17 17:21:43 +09:00
Agent Control Runner 27fc5f0544 P13-02-CODE1: P13-02 背面対象参照・占有・保存の非描写機構(全原成果の一部、加算なし) 2026-10-17 17:13:56 +09:00
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 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
574 changed files with 196353 additions and 234 deletions
+48
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"))
@@ -565,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.
@@ -666,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 \
@@ -1290,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
@@ -1297,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
@@ -5546,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"))
@@ -10817,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):
@@ -10831,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
@@ -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"
}
@@ -78,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",
@@ -86,7 +86,7 @@
},
"source_marker_lines": [
{
"line": 281,
"line": 481,
"text": "\tprint(\"Required kitchen: %d checks, %d failures\" % [checks, failures])"
}
]
@@ -3724,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": "924efd34414c12a325a1b700f799aef0396de9f15441fd88a3608292ff221657",
"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,22 @@
e15606fdbdc67305730ac9b2aaa8eeef91c9f1c8
100644 9438e65c214f6d4732deee1a86853713f6a62f49 1 docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
100644 2eecb803f5eb6774ff38cd353de1f02847aeb0f9 2 docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
100644 06b74d1d442f1e412dbbb39292ad18774a149bf2 3 docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
100644 5e0252dba4d44335d6d0e1721c0906d9eb1c91de 1 scenes/main/main.gd
100644 fff37f082d750bb91c71f2aa54d168c9e2cb8fe7 2 scenes/main/main.gd
100644 2adc769cb26d7e4163fa8b2f256b10d8034d4cb5 3 scenes/main/main.gd
100644 e1f5b0eb86b64b64216000c48d62e28555dc6536 1 scenes/main/world_preview.gd
100644 fa32fe0344d20565b6d542da1256a94e8dee1845 2 scenes/main/world_preview.gd
100644 5ebf3bd77a2cb114315ea6cb3ce03b47152ab7a0 3 scenes/main/world_preview.gd
100644 dd284aea52a6de48d5322048d5ad201342cd05e5 1 tools/regression/suite-policy.json
100644 ad194ae425fb8123fa191ed3635f404c098f692d 2 tools/regression/suite-policy.json
100644 b233e06a0cdacc18643df1b9de76c73b95dd850a 3 tools/regression/suite-policy.json
Auto-merging docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
CONFLICT (content): Merge conflict in docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json
Auto-merging scenes/main/main.gd
CONFLICT (content): Merge conflict in scenes/main/main.gd
Auto-merging scenes/main/world_preview.gd
CONFLICT (content): Merge conflict in scenes/main/world_preview.gd
Auto-merging tools/regression/suite-policy.json
CONFLICT (content): Merge conflict in tools/regression/suite-policy.json
@@ -0,0 +1,13 @@
{
"actual_project": "the-tree-p04-01",
"actual_task": "P04-01",
"actual_run": "13e728da6d8b449d9310fb72149a0aea",
"actual_role": "commander",
"actual_model": "claude-opus-5-5",
"action": "wait for P04 only; propose independent existing P24-02",
"codex_model": "gpt-6.1-sol",
"no_worker_dispatched": true,
"decision_is_selection_only": true,
"result_sha256": "9322423e484de9a300738257ecf768459ef1a167916b148fd5c2b8984714f718",
"provider_stdout_sha256": "1e03de68115d4fdc4261c2a78110fdfb71a9eb5b36c09ec3f7562710524c8b95"
}
@@ -0,0 +1,98 @@
{
"plan_id": "P24-02",
"title": "操作と通知",
"state": "in_progress; existing Runner submitted, read-only acceptance re-audit started",
"original_denominator": {
"packages": 30,
"units": 88,
"completed": 14,
"partial_credit": false
},
"source": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
"current_main": "32c8d1ce4314f821fe2eb3713fe5c6309b98e4c3",
"existing_project": "the-tree-p24-02-operations",
"existing_worker_checkout": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
"runner_repairs_used": 3,
"max_repairs": null,
"worker_registered": "agy (existing UI assignment retained; no new worker or model switch performed)",
"spec_sha256": "7f4258ef94169c516b5cd1a49a96d0c41f306ca2a05203a8c2a6475b69a1a9ee",
"actual_opus_selection": "docs/plans/original-completion-2026-10-02/execution/next-closure-after-p23-20261017/result.json",
"all_eight_original_conditions": [
{
"condition_id": "placement_and_invalid_drop",
"all_original_required_text": "Original grid snap and connection warnings; valid placement commits once, invalid placement/assignment explains the actual rejection, leaves model/ledger/selection intact, supports equivalent click-based operation.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "ordinary-controls-observations-r05.json; limited valid reception and overlap rejection, full model/selection preserved.",
"missing_or_dependencies": "Invalid assignment/drop, real rejection call paths and equivalent click operations require exact final-source coverage."
},
{
"condition_id": "modal_and_pause_resume",
"all_original_required_text": "Modal open/cancel/confirm, input focus, pausing and resuming preserve pending commands and save identity. Behind-dialog input cannot accidentally build or change assignment. Actual pause freezes simulation and ordinary resume continues exactly once.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "ordinary-controls-observations-r05.json and ordinary-menu-os-observations-r02.json; limited modal open/cancel, IME focus, save/load.",
"missing_or_dependencies": "All modal cancel/confirm, actual behind-dialog input limits, pending commands, actual pause freeze/resume once require mapped evidence."
},
{
"condition_id": "unit_bubbles",
"all_original_required_text": "Unit overhead Zzz, anger, heart correspond to actual existing state. Observe source/model/render bindings and switching/removal without stale symbols; do not invent gameplay thresholds or hidden approved values.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "Existing source bindings were retained by old 9641 candidate; no new whole-condition evidence inferred.",
"missing_or_dependencies": "Real Zzz/anger/heart states, switching and removal without stale symbol; recheck current Runtime and draw source after integration conflicts resolved."
},
{
"condition_id": "event_log",
"all_original_required_text": "Actual production events reach bounded recent log in sequence, readable Japanese with correct amounts/time/reasons, no duplicate events across pause/load. Reuse accepted256-entry log only with matching source applicability.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "Existing local log34 and accepted P24-03 bounded256 evidence are candidates for exact applicability reuse.",
"missing_or_dependencies": "Current production event sequence, readable time/amount/reason, pause/load no duplicate; current UI and Runtime source must match."
},
{
"condition_id": "important_warning_cutin",
"all_original_required_text": "Original important-warning UI for invasion start, duel, defense start is connected to actual existing signals/states with clear text, dismiss/stop/resume behavior; fixture-only signal injection is local testing, not proof ordinary production trigger. Missing upstream/catalog/assets remain explicit dependencies, do not claim complete.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "Prior limited shield-positive-to-zero warning text review; fixtures are local-only. P18 backend265ce30 integrated5f6bc11 is accepted backend only.",
"missing_or_dependencies": "Actual ordinary NTR/duel/defense triggers still depend on whole P18-01/02, P19-01, P21-01 and required content; no synthetic signal pass or invented values. Read upstream-audit-r01 before choosing implementation."
},
{
"condition_id": "click_alternatives",
"all_original_required_text": "Provide/verify click equivalents for necessary pointer/drag/modifier navigation and assignment operations. Reuse existing step/zoom/bounds mechanisms and scales; presentation controls must not change gameplay model. Manual P23 held gestures remain deferred, not waived or relabeled.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "Actual normal menu save-label entrance and limited placement controls.",
"missing_or_dependencies": "Map every required navigation/assignment equivalent. Preserve deferred P23 held gestures as unmet, not waived."
},
{
"condition_id": "japanese_input_and_scale",
"all_original_required_text": "Actual OS Japanese composition/confirmation/cancel, persisted display of valid Japanese text and clear invalid-input feedback, representative window/display scales with clipping/focus/modal inspection. Use existing save display_name metadata for an editable optional Japanese save label if a suitable text field is absent; retain existing default name, cryptographic owned path, old-save preservation and cancel semantics. Do not add new gameplay numbers or rename save paths to user text. Explicitly classify macOS current development verification and still-required same-Windows-release platform acceptance; do not transfer prior Windows evidence.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "ordinary-menu-os-observations-r02.json and preservation-r03: actual IME cancel/confirm, Japanese display_name, old4file content preservation, distinct PID snapshot equality for one construction scenario.",
"missing_or_dependencies": "Invalid labels, every required scale/focus/clip/modal scenario, full applicable content and same-Windows candidate real-device conditions remain. Reuse only if exact relevant UI/input/source/settings/environment match."
},
{
"condition_id": "final_validation_review",
"all_original_required_text": "Static/import, local/affected tests first; batch related fixes then run required full roster on exact final game/source/settings. Exact version/source hashes/config/inputs/artifacts and condition status. Independent separate Claude review with actual runtime evidence (not pending templates alone), current-main integration and final validation. All required conditions/evidence must hold to close P24-02; no partial credit, no counts as acceptance.",
"whole_condition_accepted": false,
"existing_limited_evidence_candidate": "Submitted local-r06 3suites167checks, parse and limited independent delta review only; no whole8 acceptance.",
"missing_or_dependencies": "Resolve actual four current-main merge conflicts retaining both accepted P23/source guards and existing P24 implementation; then static/local/impact, missing actual OS/upstream scenarios, exact final full once, registered validate, separate whole8 Opus review, normal prepare-integration/integration/final and ledger. Reuse matching current full only when all selected source/settings/input/engine pins truly match."
}
],
"current_main_preflight": {
"exit_code": 1,
"conflict_paths": [
"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
"scenes/main/main.gd",
"scenes/main/world_preview.gd",
"tools/regression/suite-policy.json"
],
"not_an_integration_candidate": true,
"not_tested_or_accepted": true
},
"registered_build_directory_currently_exists": false,
"raw_proof_location_audit": "docs/plans/original-completion-2026-10-02/execution/next-closure-after-p23-20261017/P24_EXISTING_LIMITED_EVIDENCE_LOCATION_AND_SHA_AUDIT.json",
"next_bounded_action": "Have the existing P24 commander inspect these actual eight-condition/source/conflict/proof facts and direct one legal same-task continuation. Root does not start a duplicate worker or force submitted to repair_pending. Missing local old proof must use exact archive restore if needed; no repeated full run just to replace available proof.",
"P04_four_unapproved_rules": "Remain pending independent of P24; approved hold/reservation/18:00 rules unchanged.",
"new_engine_runs": 0,
"new_worker_runs": 0,
"new_full_regression_runs": 0,
"unit_accepted": false,
"audited_at_jst": "2026-10-17T00:26:02.956343+09:00"
}
@@ -0,0 +1,491 @@
{
"source": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
"audited_at_jst": "2026-10-17T00:26:02.956343+09:00",
"scope": "Read-only legacy proof availability/pins only; does not establish current main/source applicability or full P24 acceptance. No engine/OS/test started.",
"total_references": 60,
"local_matching": 60,
"local_mismatching": 0,
"local_unavailable": 0,
"rows": [
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/submitted-local-r06.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/local-ended.json",
"expected_sha256": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
"local_exists": true,
"actual_sha256": "a49a9229bc3bde09aebff72daafbfe99d159da9bf1dfc702b036640946654b64",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/submitted-local-r06.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-local-native-preflight-r06/runner-input.json",
"expected_sha256": "577442ab27679b03c4c25a8b0d362aed871599d7c37675aaafd41fa80579dd70",
"local_exists": true,
"actual_sha256": "577442ab27679b03c4c25a8b0d362aed871599d7c37675aaafd41fa80579dd70",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/started.json",
"expected_sha256": "d40a0252aa547b049d30cdc9a15774131438b2535f808ead128f0f86f7bf5954",
"local_exists": true,
"actual_sha256": "d40a0252aa547b049d30cdc9a15774131438b2535f808ead128f0f86f7bf5954",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/process-started.json",
"expected_sha256": "5ba807e0ee65944815542648108322586f4730b074abebb0b117dd61071140b1",
"local_exists": true,
"actual_sha256": "5ba807e0ee65944815542648108322586f4730b074abebb0b117dd61071140b1",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/ended.json",
"expected_sha256": "0b188dcb42995ee09205f233116665cbf54f59a7d1e93f9d2aafc07779ae19a3",
"local_exists": true,
"actual_sha256": "0b188dcb42995ee09205f233116665cbf54f59a7d1e93f9d2aafc07779ae19a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/events.jsonl",
"expected_sha256": "efa3f0eca8bf0001edc89041d968a0fdf9f474ddd5a6803db2a138e4dfd53cc5",
"local_exists": true,
"actual_sha256": "efa3f0eca8bf0001edc89041d968a0fdf9f474ddd5a6803db2a138e4dfd53cc5",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-r02/passive_os.gd",
"expected_sha256": "66e60f81f836fe648f9011660d0255f5c4b780bfdacc820829c90bb655022880",
"local_exists": true,
"actual_sha256": "66e60f81f836fe648f9011660d0255f5c4b780bfdacc820829c90bb655022880",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/started.json",
"expected_sha256": "64ad63ae5b4339cd639f2d22fa076caa7d8d3f9501337fadadc1d4dcfcbbe2d0",
"local_exists": true,
"actual_sha256": "64ad63ae5b4339cd639f2d22fa076caa7d8d3f9501337fadadc1d4dcfcbbe2d0",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/process-started.json",
"expected_sha256": "f116952d77720858065576f41df7116f384801e6c27acb6cf339a329589627b0",
"local_exists": true,
"actual_sha256": "f116952d77720858065576f41df7116f384801e6c27acb6cf339a329589627b0",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/ended.json",
"expected_sha256": "22d0ffd1ea18c06a46dc7aa977613385d3ae5f4a81dab9ed4650f9c10d044d68",
"local_exists": true,
"actual_sha256": "22d0ffd1ea18c06a46dc7aa977613385d3ae5f4a81dab9ed4650f9c10d044d68",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-ime-normal-consumer-r02/events.jsonl",
"expected_sha256": "369eb5e182fcf5b21693380198df187654b508e288c08f6ecb0d3aa6af4ec0ca",
"local_exists": true,
"actual_sha256": "369eb5e182fcf5b21693380198df187654b508e288c08f6ecb0d3aa6af4ec0ca",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/manifest.json",
"expected_sha256": "e8537a6f6cba53683cca36794adc08f7c5958b78ced74fa06e499a3f8c123e4a",
"local_exists": true,
"actual_sha256": "e8537a6f6cba53683cca36794adc08f7c5958b78ced74fa06e499a3f8c123e4a",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-menu-os-observations-r02.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-393c3655f3e84483b9c24fd5d2955dd2-p24-02-os/saves/manual_ui_5e9f8ca3662a2ddf42984ba1403675a7/world.bin",
"expected_sha256": "0424074b51f327ffb3ce3dc8e92ccb2d9d04d657db6e1461cdb83541f1cc0bee",
"local_exists": true,
"actual_sha256": "0424074b51f327ffb3ce3dc8e92ccb2d9d04d657db6e1461cdb83541f1cc0bee",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/started.json",
"expected_sha256": "bc05d5ef0ec62a3fc46e5b957f3724ef95c339078bc02eee04b3c42632bbe1ab",
"local_exists": true,
"actual_sha256": "bc05d5ef0ec62a3fc46e5b957f3724ef95c339078bc02eee04b3c42632bbe1ab",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/process-started.json",
"expected_sha256": "d6d981e157cd7e68a08e9e0133f81faac4113a48d03e74deb04d380cb03e41b1",
"local_exists": true,
"actual_sha256": "d6d981e157cd7e68a08e9e0133f81faac4113a48d03e74deb04d380cb03e41b1",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/ended.json",
"expected_sha256": "bf42d9666d4fe27051403f7d00a96f17abaa1e9b551db9d13c49ee8f7130d5c6",
"local_exists": true,
"actual_sha256": "bf42d9666d4fe27051403f7d00a96f17abaa1e9b551db9d13c49ee8f7130d5c6",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/events.jsonl",
"expected_sha256": "104fb16b406dd123b77356ef98bd5a8f0bd595d660be0870c881cfbf30ce7302",
"local_exists": true,
"actual_sha256": "104fb16b406dd123b77356ef98bd5a8f0bd595d660be0870c881cfbf30ce7302",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/passive_os.gd",
"expected_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
"local_exists": true,
"actual_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-before.json",
"expected_sha256": "aed601473efa522c41e5ca8890c11f1eeb2b06e786fb76cba1e96263934efe82",
"local_exists": true,
"actual_sha256": "aed601473efa522c41e5ca8890c11f1eeb2b06e786fb76cba1e96263934efe82",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-r03/preexisting-slot-after.json",
"expected_sha256": "efb7170f0579bed92a42ead7c03b70dfc37df1e55dde05a96ae67666c6e38063",
"local_exists": true,
"actual_sha256": "efb7170f0579bed92a42ead7c03b70dfc37df1e55dde05a96ae67666c6e38063",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/started.json",
"expected_sha256": "135b779ce605d491bc6110235e9827c4091fefe8b86a49222655b3b713adcad7",
"local_exists": true,
"actual_sha256": "135b779ce605d491bc6110235e9827c4091fefe8b86a49222655b3b713adcad7",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/process-started.json",
"expected_sha256": "e33badfd0b68ff97ce8459fed3a6a6d7275d938fbc1705c82cea94e7ded66314",
"local_exists": true,
"actual_sha256": "e33badfd0b68ff97ce8459fed3a6a6d7275d938fbc1705c82cea94e7ded66314",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/ended.json",
"expected_sha256": "353cfa8e5ea703cb777bf0796b8a0f2f7fa55a5a36b69585414d5e7a16fae94c",
"local_exists": true,
"actual_sha256": "353cfa8e5ea703cb777bf0796b8a0f2f7fa55a5a36b69585414d5e7a16fae94c",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/events.jsonl",
"expected_sha256": "2f93c17152ed41dbbbd7b70b79383591a02ef0f9939d03cf340665ed4ee70ef7",
"local_exists": true,
"actual_sha256": "2f93c17152ed41dbbbd7b70b79383591a02ef0f9939d03cf340665ed4ee70ef7",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/passive_os.gd",
"expected_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
"local_exists": true,
"actual_sha256": "6dceadb5abdf48fda403571f84b6a682a05e7f9ccd64391f2f51176cb5dd842b",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/snapshot-000.bin",
"expected_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
"local_exists": true,
"actual_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-preservation-consumer-r03/loaded-stored-snapshot.bin",
"expected_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
"local_exists": true,
"actual_sha256": "b242cc87abd49bb80d74b7904cfa3492ef57b59e9acfe014e12b35387990da3d",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/manifest.json",
"expected_sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669",
"local_exists": true,
"actual_sha256": "62d801bb42100ade11f3f4957bff85cac7fea573dcefea97faf3806c8a29c669",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui/world.bin",
"expected_sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3",
"local_exists": true,
"actual_sha256": "da65a181c934bf8fe0a2969db5c074863b03cf2483f2b039e5dd588b809b80b3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/manifest.json",
"expected_sha256": "cd450b442c37d497735888f6b96076ba482dca72a420aed1cf6568eb3723824b",
"local_exists": true,
"actual_sha256": "cd450b442c37d497735888f6b96076ba482dca72a420aed1cf6568eb3723824b",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-save-preservation-observations-r03.json",
"path": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os/saves/manual_ui_6789d75c74d103ad3912e8992a815680/world.bin",
"expected_sha256": "a0eb8af6fbb6abcdaea0375b4298164013229c3ba187a9d4c1e54d37ecb75202",
"local_exists": true,
"actual_sha256": "a0eb8af6fbb6abcdaea0375b4298164013229c3ba187a9d4c1e54d37ecb75202",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/started.json",
"expected_sha256": "64397b2e4b9cf67faf78bd02848492895111ac0b0b32c9d4fd629e481103b094",
"local_exists": true,
"actual_sha256": "64397b2e4b9cf67faf78bd02848492895111ac0b0b32c9d4fd629e481103b094",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/process-started.json",
"expected_sha256": "3b73172fa0124a5ef47f7004d5ae4144b057279b7246e8dd4eb84cc5a1097c17",
"local_exists": true,
"actual_sha256": "3b73172fa0124a5ef47f7004d5ae4144b057279b7246e8dd4eb84cc5a1097c17",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ended.json",
"expected_sha256": "9bbdf3d512b5f5ae4a8f9595da1cac52587a5f05009869ec7e0d7c8099c4ed8a",
"local_exists": true,
"actual_sha256": "9bbdf3d512b5f5ae4a8f9595da1cac52587a5f05009869ec7e0d7c8099c4ed8a",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/events.jsonl",
"expected_sha256": "f456f8013343264573c6cab8c7be99807210cb889a78f0a1db1461989d46a3dc",
"local_exists": true,
"actual_sha256": "f456f8013343264573c6cab8c7be99807210cb889a78f0a1db1461989d46a3dc",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/passive_os.gd",
"expected_sha256": "552f9bb40770f1a88bbfb41586782e4f8ba8dff29776336ab83ba64dbd2f4767",
"local_exists": true,
"actual_sha256": "552f9bb40770f1a88bbfb41586782e4f8ba8dff29776336ab83ba64dbd2f4767",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-000.bin",
"expected_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
"local_exists": true,
"actual_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-001.bin",
"expected_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
"local_exists": true,
"actual_sha256": "dfea6817f87a9c79cc970f65e19991e60741277244106f770341d71185321fd4",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-002.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-003.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-004.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-005.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-006.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-007.bin",
"expected_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"local_exists": true,
"actual_sha256": "17399e4292ef33b29079f361bf91d853f0a1b036066e4e23707840d30deac4a3",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-000.json",
"expected_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
"local_exists": true,
"actual_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-001.json",
"expected_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
"local_exists": true,
"actual_sha256": "ec054c36513cf2bc19b4743862b99a6d56ae0cffebe413d731c9ebb6ab53f237",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-002.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-003.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-004.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-005.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-006.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/ui-snapshot-007.json",
"expected_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"local_exists": true,
"actual_sha256": "07cebb2a71ff0c63608f8a218a03618e9504fd171d8c7059b15bcf901dc5f8ec",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-000.png",
"expected_sha256": "4516abb706e829094c19632e6c8005ad68877c7856af4ccfdf346e98b8dabe95",
"local_exists": true,
"actual_sha256": "4516abb706e829094c19632e6c8005ad68877c7856af4ccfdf346e98b8dabe95",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-001.png",
"expected_sha256": "9d61efee38fee61447a3ae10e95e07381f9560254388cc4ce38a79f7a0a21e6d",
"local_exists": true,
"actual_sha256": "9d61efee38fee61447a3ae10e95e07381f9560254388cc4ce38a79f7a0a21e6d",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-002.png",
"expected_sha256": "4f53747098468b37bc23078d70d091a8b1d8c78ae44547476df70d40c153d03e",
"local_exists": true,
"actual_sha256": "4f53747098468b37bc23078d70d091a8b1d8c78ae44547476df70d40c153d03e",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-003.png",
"expected_sha256": "dd60776d2370d79814e874a3944f7bce9152d6d3640bee434c624940f6e000e8",
"local_exists": true,
"actual_sha256": "dd60776d2370d79814e874a3944f7bce9152d6d3640bee434c624940f6e000e8",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-004.png",
"expected_sha256": "e8c2b8027767cd26850f02a2d87d2e594bab4c3d6ebcc5f288ec6140f332146d",
"local_exists": true,
"actual_sha256": "e8c2b8027767cd26850f02a2d87d2e594bab4c3d6ebcc5f288ec6140f332146d",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-005.png",
"expected_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
"local_exists": true,
"actual_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-006.png",
"expected_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
"local_exists": true,
"actual_sha256": "7795cc8c2ee590c673f7bcd16d83e8fbfb85a8fef0af913282e9aa1df54e54c8",
"sha_match": true
},
{
"record": "docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/ordinary-controls-observations-r05.json",
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p24-02-native-os-controls-r05/frame-007.png",
"expected_sha256": "0854ba41fd73e5b092d71e7d11e99fe3efb7b25ee04c2b0c8750b5d9de6d84b3",
"local_exists": true,
"actual_sha256": "0854ba41fd73e5b092d71e7d11e99fe3efb7b25ee04c2b0c8750b5d9de6d84b3",
"sha_match": true
}
]
}
@@ -0,0 +1,48 @@
{
"argv": [
"/Users/korizatou114/.local/bin/claude",
"-p",
"--safe-mode",
"--restricted",
"--output-format",
"json",
"--tools",
"Read,Grep,Glob",
"--strict-mcp-config",
"--mcp-config",
"{\"mcpServers\":{}}",
"--setting-sources",
"",
"--no-session-persistence",
"--permission-mode",
"plan",
"--json-schema",
"{\"type\": \"object\", \"additionalProperties\": false, \"required\": [\"action\", \"task_id\", \"reason\", \"codex_model\", \"codex_model_reason\"], \"properties\": {\"action\": {\"type\": \"string\", \"enum\": [\"request-repair\", \"wait\"]}, \"task_id\": {\"type\": \"string\"}, \"reason\": {\"type\": \"string\"}, \"codex_model\": {\"type\": \"string\", \"enum\": [\"gpt-6.1-sol\", \"gpt-6-astra\"]}, \"codex_model_reason\": {\"type\": \"string\", \"minLength\": 1}}}",
"--model",
"claude-opus-5-5"
],
"cwd": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"env_names": [
"AGY_CLI_DISABLE_AUTO_UPDATE",
"BROWSER_PROFILE_DIR",
"BUILD_OUTPUT_DIR",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC",
"CLAUDE_CODE_OAUTH_TOKEN",
"GIT_TERMINAL_PROMPT",
"HOME",
"LANG",
"LC_ALL",
"LOGNAME",
"MAC_CHROMIUM_TMPDIR",
"PATH",
"PORT",
"PYTHONDONTWRITEBYTECODE",
"TEMP",
"TERM",
"TEST_DATABASE_PATH",
"TMP",
"TMPDIR",
"USER"
],
"execution": "sandbox"
}
@@ -0,0 +1,7 @@
{
"action": "wait",
"task_id": "P04-01",
"reason": "P04-01 (repair_pending, source 2dde759, repairs 29, max null) stays on wait. The repair29 review found the docs accurate to current code. The block is that 4 of the D05 order rules are still undecided, and the spec requires the order across 閉店/停電/破壊/退出/課金/シフト交代/00:00決算 to be stated (順序を明記): (a) whether RELATED_FACILITY_INACTIVE or NO_POWER takes priority, (b) destruction command vs incident completion, (c) command leave vs AI planned exit, (d) the order of a 00:00 new-day sale vs settlement. The Opus-recommended A bundle (keep current behavior) is a candidate the owner has not approved. The owner has approved only two things: dependency-closure hold with no charge, reservation retention and resume once; and 17:59->18:00 completion/payment before the shift change. Another repair cannot supply owner decisions, so request-repair would be speculative and is not used. Nothing in P04 is re-run, re-tested or re-reviewed, and BASELINE183 is not cited as authority for destruction. When the owner answers (a)-(d), the next P04 step is a narrow repair. It writes only the approved rules into order-audit.json and ORDER_AUDIT.md and adds boundary proof for exactly those rules. The seven product-order source files and the static P04 merges are reused only after their hashes are rechecked against the pins.\n\nProposed next independent original unit: P24-02 操作と通知 (existing task the-tree-p24-02-operations, submitted 9641ed52, repairs 3, max null, no active worker). Of the open units it does not touch D05, P06 mana values or P18 production values, and it already has the most collected evidence. That makes it the strongest candidate to close one of the 88 units. Its acceptance is: 無効操作を説明し、クリック代替と日本語入力・表示倍率を確認する. Per docs/spec/acceptance/P24-02-code-r01.json, warnings must come from real upstream triggers, fixture-only completion does not count, and platform-specific conditions are required.\n\nFirst bounded work item (one request-repair on that existing task, not started in this decision). The worker reads P24-02-code-r01.json and maps all 8 whole conditions against the exact 9641ed5 source in a gap matrix. For each condition it records:\n- the real upstream trigger, with the call path from the actual rejection or validation site to the visible explanation;\n- any existing evidence that applies, rechecked by source, config, input and environment hash: Japanese IME normal save/rename, click alternatives, the r03 normal Main 256-entry notification log, the 8 real-viewport operations, and the separate-process resume (314 functions + 23 parse);\n- the concrete evidence still missing.\n\nOnly missing items are then implemented or evidenced, limited to allowed_paths. Remaining conditions likely include invalid drop/placement explanation with a real cause, modal/pause/resume, speech bubble/cut-in, display scaling at each required scale, and the click alternative for every operation not yet covered. Collected IME/click evidence is reused only if 9641ed5, or its successor source, leaves the relevant UI/input files unchanged. Otherwise only the affected items are re-collected. There must be no duplicate whole-test runs and no fixture-only passes.\n\nRequired later checks:\n- the p24 current-source validation;\n- the full suite run once on the final candidate, reusing exact-match full/parse/ended results the way P23-03 did;\n- a separate session for any condition the spec marks platform-specific: native macOS IME/scale evidence, with Windows-only conditions kept individually pending if the spec requires them, not waived;\n- independent Opus review of all 8 conditions with no partial credit;\n- normal final validator, then prepare-integration; main commit/push is already authorized.\n\nGaps: this frozen P04 checkout does not contain P24-02-code-r01.json or the actual DB IME artifacts. The P24-02 dispatch must read them from current main, and the gap matrix there must verify the 8 conditions; this decision has not checked them.",
"codex_model": "gpt-6.1-sol",
"codex_model_reason": "The P04 action is wait, so no Codex run happens and Astra's extra cost would buy nothing. The proposed P24-02 first step is a bounded gap matrix plus a check of whether existing evidence applies. That is ordinary audit and UI-evidence work with explicit spec conditions, so the default model is enough. Astra would be considered only if a later repair needs difficult cross-platform IME/scale fixes in product code."
}

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