Files
TheTree_mock/docs/plans/original-completion-2026-10-02/execution/p24-02/native-os-input-r01/the-tree-p24-02-native-os-preservation-consumer-r03.py
T

38 lines
3.8 KiB
Python

import os,sys,uuid,json,hashlib,importlib.util,subprocess,time
from pathlib import Path
sys.dont_write_bytecode=True
R=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement')
A=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02')
OUT=A/'p24-02-native-os-preservation-consumer-r03';stage=A/'p24-02-local-native-preflight-r06/stage'
s=importlib.util.spec_from_file_location('p24_os_runner',R/'tools/run_all_tests.py');r=importlib.util.module_from_spec(s);s.loader.exec_module(r)
outer=r.module('p24_os_owned',R/'tools/regression/owned_outer.py');r.require(not outer.native.helper['live_engines'](),'external engine present')
r.require(r.read(stage.parent/'local-ended.json')['passed'],'affected local3 passed before OS')
r.require(subprocess.check_output(['git','rev-parse','HEAD'],cwd=R,text=True).strip()=='9641ed52def2ff8e5b0222449a4a83a1191e1d37','exact immutable candidate')
r.require(not subprocess.check_output(['git','status','--porcelain'],cwd=R,text=True),'candidate clean')
refs=r.source_refs(R);before=r.inventory(stage,stage=True);protected=r.default_player(R);public=(stage/'project.godot').read_bytes()
for n,pin in refs.items():r.require(r.sha(stage/n)==pin['sha256'],'tested stage source exact '+n)
profile=Path('/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-41ed37cd3b6c4de8908b4bba8fe20724-p24-02-os');profile_name=profile.name;r.require(profile.exists(),"actual producer owned profile exists")
r.require(__import__('shutil').disk_usage(OUT).free>=500*1024*1024,'disk admission')
base={'candidate':'9641ed52def2ff8e5b0222449a4a83a1191e1d37','source_map':{n:v['sha256'] for n,v in refs.items()},'stage':str(stage),'profile':str(profile),'owner_pid':os.getpid(),'default_before':protected,'source_before':refs,'formal_acceptance':False,'no_injected_gameplay_or_input':True,'controller_sha256':r.sha(Path(__file__)),'recorder_sha256':r.sha(OUT/'passive_os.gd')}
r.write(OUT/'started.json',base);error=None;children=[];rows=[]
try:
(stage/'project.godot').write_bytes(r.private_project(public,profile_name));env=r.fresh_environment(dict(os.environ));env['P24_OS_OUTPUT']=str(OUT)
argv=['/Applications/Godot.app/Contents/MacOS/Godot','--path',str(stage),'--script',str(OUT/'passive_os.gd')]
with (OUT/'engine-native.log').open('w') as log:
p=subprocess.Popen(argv,cwd=stage,env=env,stdout=log,stderr=subprocess.STDOUT);children.append(p)
r.write(OUT/'process-started.json',dict(base,actual_pid=p.pid,command=argv,monotonic_ns=time.monotonic_ns()))
print(json.dumps({'actual_pid':p.pid,'profile':str(profile),'events':str(OUT/'events.jsonl')}),flush=True)
p.wait(timeout=900)
r.require(p.returncode==0,'ordinary native exit0');raw=(OUT/'engine-native.log').read_text();r.require('ERROR:' not in raw and 'SCRIPT ERROR:' not in raw,'native diagnostics failed')
rows.append({'actual_pid':p.pid,'exit_code':p.returncode,'engine_ended':True,'log_sha256':r.sha(OUT/'engine-native.log')})
except BaseException as e:error=type(e).__name__+': '+str(e)
finally:
cleanup,cleanup_errors=outer.finish_captured(children);(stage/'project.godot').write_bytes(public)
guards=[]
try:
r.require(r.source_refs(R)==refs,'candidate whole source unchanged');r.require(r.inventory(stage,stage=True)==before,'whole stage source unchanged');r.require(r.default_player(R)==protected,'default player unchanged')
except BaseException as e:guards.append(type(e).__name__+': '+str(e))
r.write(OUT/'ended.json',dict(base,rows=rows,error=error,guard_errors=guards,cleanup_errors=cleanup_errors,owned_cleanup=cleanup,passed=not(error or guards or cleanup_errors) and len(rows)==1,formal_acceptance=False))
print(json.dumps({'ended':True,'error':error,'guards':guards,'rows':rows}),flush=True)
sys.exit(1 if error or guards or cleanup_errors else 0)