extends SceneTree const PAIR_ROOT := "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p03-current1299-batch-later-refusal-native-r02/migration-pair" const MODE := "read" var checks:=0 var failures:=0 var runtime: Variant var clock: Variant var state: Variant var job_id: StringName var serial:=0 var journal: Array[Dictionary]=[] func _initialize() -> void:call_deferred("run") func expect(ok: bool,label: String) -> void: checks+=1 print(("PASS " if ok else "FAIL ")+label) if not ok:failures+=1;push_error("P03_INFLIGHT "+label) func write_proof(name: String,value: Variant) -> void: var path:=PAIR_ROOT.path_join(name) expect(not FileAccess.file_exists(path),"fresh proof "+name) var file:=FileAccess.open(path,FileAccess.WRITE) expect(file!=null,"open proof "+name) if file!=null:file.store_buffer(var_to_bytes(value));file.close() func read_proof(name: String) -> Variant: var data:=FileAccess.get_file_as_bytes(PAIR_ROOT.path_join(name)) expect(not data.is_empty(),"read whole proof "+name) return bytes_to_var(data) func command(kind: StringName,payload: Dictionary) -> CommandResult: serial+=1 var result: CommandResult=runtime.submit_command(kind,payload,&"player",&"",0,-1,StringName("p03.inflight.%d"%serial)) expect(result.is_success(),"public paid command "+String(kind)+": "+result.message) return result func copy_package(source: String,destination: String) -> void: expect(DirAccess.make_dir_recursive_absolute(destination)==OK,"package destination "+destination) for name: String in [SaveService.WORLD_FILE,SaveService.MANIFEST_FILE,SaveService.THUMBNAIL_FILE,SaveService.JOURNAL_FILE]: var original:=FileAccess.get_file_as_bytes(source.path_join(name)) expect(not original.is_empty() and not FileAccess.file_exists(destination.path_join(name)),"fresh formal member "+name) var file:=FileAccess.open(destination.path_join(name),FileAccess.WRITE) expect(file!=null,"open formal member "+name) if file!=null:file.store_buffer(original);file.close() expect(original==FileAccess.get_file_as_bytes(destination.path_join(name)),"complete formal member "+name) func observe(event: SimulationDomainEvent) -> void:journal.append(event.to_dictionary()) func capture(label: String) -> void: var snapshot: Dictionary=runtime.create_snapshot() write_proof(MODE+"-"+label+".var",snapshot) if MODE=="read":expect(var_to_bytes(snapshot)==var_to_bytes(read_proof("write-"+label+".var")),"entire separate-PID snapshot "+label) var room_id: StringName const OLD_TARGET:=Vector3i(-7,3,1) const SLOT: String="user://p03-batch-later-refusal/manual" func package_hashes() -> Dictionary: var values: Dictionary={} for suffix: String in ["",SaveService.MIGRATION_BACKUP_SUFFIX]: for name: String in [SaveService.WORLD_FILE,SaveService.MANIFEST_FILE,SaveService.THUMBNAIL_FILE,SaveService.JOURNAL_FILE]: values[suffix+"/"+name]=FileAccess.get_sha256(ProjectSettings.globalize_path(SLOT+suffix).path_join(name)) return values func refusal(label: String) -> void: var before: Dictionary=runtime.create_snapshot() var packages: Dictionary=package_hashes() var first: Dictionary=runtime.prepare_facility_dimension_snapshot(job_id) expect(first.get(&"ok",false),"first paid legacy job is independently migratable before later refusal") var prepared: Dictionary=runtime.prepare_all_facility_dimension_snapshots() expect(not prepared.get(&"ok",false) and prepared.get(&"facility_id",&"")==room_id and prepared.get(&"rolled_back",false),"actual second-target rejection rolls back earlier applied job") expect(prepared.get(&"details",{}).get(&"routes",{}).get(&"errors",[]).any(func(error: Variant):return error is Dictionary and error.get(&"code",&"")==&"TASK_DESTINATION_CHANGED"),"real old upper-entry task specifically refuses lost destination") var preview: Dictionary=runtime.preview_facility_dimensions_at_path(SLOT) expect(not preview.get(&"ok",false),"formal preview rejects later target") var result: Dictionary=runtime.migrate_facility_dimensions_at_path(SLOT) expect(not result.get(&"ok",false) and result.get(&"code",&"")==&"DIMENSION_MIGRATION_REJECTED" and result.get(&"details",{}).get(&"rolled_back",false),"formal batch refuses and rolls back isolated candidate") expect(var_to_bytes(before)==var_to_bytes(runtime.create_snapshot()),"entire live world unchanged after all three migration paths") expect(package_hashes()==packages,"all original and real preexisting backup files unchanged") write_proof(MODE+"-"+label+"-refusal.var",{&"first":first,&"prepared":prepared,&"preview":preview,&"result":result,&"packages":packages}) capture(label) func run() -> void: root.get_node("GameClock").set_paused(true);root.get_node("GameClock").set_process(false) root.get_node("SimulationRuntime").configure_save_policy({&"enabled":false,&"daily_checkpoint_enabled":false}) runtime=load("res://autoload/simulation_runtime.gd").new();clock=load("res://autoload/game_clock.gd").new();state=load("res://autoload/game_state.gd").new() clock.reset(1,6,0);state.reset();expect(runtime.initialize(clock,state,42588)[&"valid"],"canonical current initialization") clock.set_paused(true);runtime.configure_save_policy({&"enabled":false,&"daily_checkpoint_enabled":false,&"auto_migrate":false}) var paths: Array[String]=FacilityCatalog.FACILITY_PATHS+FacilityCatalog.INFRASTRUCTURE_FACILITY_PATHS+FacilityCatalog.RESCUE_FACILITY_PATHS if MODE=="write": expect(DirAccess.make_dir_recursive_absolute(PAIR_ROOT)==OK,"own fresh evidence directory") paths.append("res://tests/fixtures/legacy_premium_room.tres");paths.append("res://tests/fixtures/legacy_staff_dormitory.tres") expect(runtime.definition_registry.rebuild_from_paths(paths)[&"valid"],"explicit archived definition") for row: Array in [[&"warehouse",Vector3i(-6,0,1)],[&"service_stairs",Vector3i(-7,1,1)],[&"service_stairs",Vector3i(-7,2,1)],[&"service_stairs",Vector3i(-7,3,1)],[&"staff_dormitory",Vector3i(-6,2,1)],[&"reception",Vector3i(-6,0,0)],[&"guest_stairs",Vector3i(4,1,0)],[&"guest_stairs",Vector3i(4,2,0)],[&"guest_stairs",Vector3i(4,3,0)]]: if not command(&"build_facility",{&"definition_id":row[0],&"origin":row[1]}).is_success(): runtime.free();clock.free();state.free() print("Batch later refusal formal "+MODE+": %d checks, %d failures"%[checks,failures]);quit(failures);return clock.advance_minutes(runtime.definition_registry.get_facility(row[0]).build_minutes) for instance: FacilityInstance in runtime.facility_service.get_instances(): if instance.definition_id==&"staff_dormitory":room_id=instance.instance_id expect(not room_id.is_empty(),"normally paid completed archived dormitory") if not command(&"build_facility",{&"definition_id":&"premium_room",&"origin":Vector3i(-6,2,0)}).is_success():runtime.free();clock.free();state.free();quit(1);return clock.advance_minutes(7) for job: ConstructionJob in runtime.construction_service.get_jobs(): if job.definition_id==&"premium_room" and not job.is_terminal():job_id=job.job_id expect(not job_id.is_empty(),"real paid first-target partial job") if job_id.is_empty():runtime.free();clock.free();state.free();quit(1);return var baseline: Dictionary=runtime.create_snapshot() expect(SaveService.save_snapshot(SLOT,baseline)[&"ok"],"formal old room baseline before real backup creation") paths.erase("res://tests/fixtures/legacy_premium_room.tres");paths.append("res://data/facilities/expansion/premium_room.tres") paths.erase("res://tests/fixtures/legacy_staff_dormitory.tres");paths.append("res://data/facilities/expansion/staff_dormitory.tres") expect(runtime.definition_registry.rebuild_from_paths(paths)[&"valid"],"current approved footprint registry") var first: Dictionary=runtime.migrate_facility_dimensions_at_path(SLOT) expect(first.get(&"ok",false) and first.get(&"backup_created",false),"normal unconstrained two-target migration creates actual verified backup") expect(var_to_bytes(runtime.create_snapshot())==var_to_bytes(baseline),"first migration leaves live original geometry") expect(var_to_bytes(SaveService.load_snapshot(SLOT+SaveService.MIGRATION_BACKUP_SUFFIX).get(&"snapshot",{}))==var_to_bytes(baseline),"actual backup exactly restores pre-migration baseline") write_proof("baseline.var",baseline) expect(command(&"register_staff",{&"staff_id":&"batch_maintainer",&"role_id":&"porter",&"options":{&"current_cell":Vector3i(-7,1,1),&"state":StaffRuntime.State.AVAILABLE}}).is_success(),"public worker for actual old-entry task") expect(runtime.staff_service.create_task(&"maintenance",10,clock.absolute_minute,{&"target_entity_id":room_id,&"target_cell":OLD_TARGET,&"estimated_minutes":30},&"batch_old_entry_task").is_success(),"public actual old-entry maintenance task") expect(runtime.staff_service.assign_task_to_staff(&"batch_old_entry_task",&"batch_maintainer",clock.absolute_minute).is_success(),"public real task owner assignment") clock.advance_minutes(1) var task: StaffTask=runtime.staff_service.get_task(&"batch_old_entry_task") expect(not task.is_terminal() and task.assigned_staff_id==&"batch_maintainer" and runtime.staff_service.get_staff(&"batch_maintainer").current_task_id==task.task_id,"real old-entry work remains in flight at formal save") var legacy: Dictionary=runtime.create_snapshot() expect(SaveService.save_snapshot(SLOT,legacy)[&"ok"],"formal original includes partial job and real upper-entry task") write_proof("legacy.var",legacy);write_proof("identity.var",{&"room_id":room_id,&"serial":serial,&"job_id":job_id,&"task_id":&"batch_old_entry_task"}) copy_package(ProjectSettings.globalize_path(SLOT),PAIR_ROOT.path_join("original/formal")) copy_package(ProjectSettings.globalize_path(SLOT+SaveService.MIGRATION_BACKUP_SUFFIX),PAIR_ROOT.path_join("backup/formal")) else: paths.append("res://data/facilities/expansion/premium_room.tres");paths.append("res://data/facilities/expansion/staff_dormitory.tres") expect(runtime.definition_registry.rebuild_from_paths(paths)[&"valid"],"reader current approved footprint registry") var identity: Dictionary=read_proof("identity.var");room_id=identity[&"room_id"];job_id=identity[&"job_id"];serial=identity[&"serial"] copy_package(PAIR_ROOT.path_join("original/formal"),ProjectSettings.globalize_path(SLOT)) copy_package(PAIR_ROOT.path_join("backup/formal"),ProjectSettings.globalize_path(SLOT+SaveService.MIGRATION_BACKUP_SUFFIX)) expect(runtime.restore_snapshot(SaveService.load_snapshot(SLOT+SaveService.MIGRATION_BACKUP_SUFFIX).get(&"snapshot",{})),"separate PID restores real earlier backup") expect(var_to_bytes(runtime.create_snapshot())==var_to_bytes(read_proof("baseline.var")),"whole earlier backup state matches") expect(runtime.restore_snapshot(SaveService.load_snapshot(SLOT).get(&"snapshot",{})),"actual original batch-source package restores") expect(var_to_bytes(runtime.create_snapshot())==var_to_bytes(read_proof("legacy.var")),"whole original batch source restored exactly") capture("checkpoint");refusal("reject1");refusal("reject2") if MODE=="write":copy_package(ProjectSettings.globalize_path(SLOT),PAIR_ROOT.path_join("after-refusal/formal")) expect(runtime.domain_events.subscribe(&"*",&"p03.refusal.uncapped",Callable(self,"observe")),"whole uncapped post-refusal journal") clock.advance_minutes(1);capture("next1") clock.advance_minutes(1);capture("next2") clock.advance_minutes(8);capture("next10") clock.advance_minutes(150);capture("final160") expect(runtime.facility_service.get_instance(room_id).occupied_cells.size()==8,"later rejected dorm retains entire original footprint") var completed: ConstructionJob=runtime.construction_service.get_job(job_id) expect(completed.state==ConstructionJob.State.COMPLETED and runtime.facility_service.get_instance(completed.facility_instance_id).occupied_cells.size()==6,"earlier rolled-back job completes with its original legacy footprint") expect(runtime.staff_service.get_task(&"batch_old_entry_task").state==StaffTask.State.COMPLETED and runtime.staff_service.get_staff(&"batch_maintainer").current_cell==OLD_TARGET and runtime.staff_service.get_staff(&"batch_maintainer").current_task_id.is_empty(),"actual original maintenance reaches old entry and finishes without orphan work") expect(runtime.restore_snapshot(runtime.create_snapshot()),"post-refusal continuation remains canonical") write_proof(MODE+"-events.var",journal) if MODE=="read":expect(var_to_bytes(journal)==var_to_bytes(read_proof("write-events.var")),"entire post-refusal journal matches without deletion or replacement") write_proof(MODE+"-result.var",{&"pid":OS.get_process_id(),&"checks":checks,&"failures":failures,&"events":journal.size()}) runtime.free();clock.free();state.free() print("Batch later refusal formal "+MODE+": %d checks, %d failures"%[checks,failures]);quit(failures)