<?php
require __DIR__.'/../C-resume/core-overlay.php';
require __DIR__.'/recover.php';
function f27_connect($p){$file=$p['connection']['config_path'];f27_assert(realpath($file)===$file&&!is_link($file),'Original exact config');$cfg=(static function($f){return require $f;})($file);if($p['lane']==='B'){f27_assert($cfg['database']==='zhct','Original B database');$path='/workspace/zhct/zhctproject/ai_api/.env.local';f27_assert(realpath($path)===$path&&!is_link($path),'Original AI private config');$ini=parse_ini_file($path,true,INI_SCANNER_RAW);$other=$ini['DATABASE_ZHCT'];foreach(['hostname'=>'HOSTNAME','database'=>'DATABASE','username'=>'USERNAME','password'=>'PASSWORD']as $k=>$o)f27_assert((string)$cfg[$k]===(string)$other[$o],'Original Store/AI local target agree');f27_assert((string)(empty($cfg['hostport'])?'3306':$cfg['hostport'])===(string)(empty($other['HOSTPORT'])?'3306':$other['HOSTPORT']),'Original ports agree');unset($ini,$other);$dsn='mysql:host='.$cfg['hostname'].';port='.(empty($cfg['hostport'])?'3306':$cfg['hostport']).';dbname=zhct;charset=utf8mb4';}else{f27_assert($cfg['hostname']==='127.0.0.1'&&(string)$cfg['hostport']==='5237'&&$cfg['database']==='ZHCT_APP'&&getenv('POC_HOST')==='127.0.0.1'&&getenv('POC_PORT')==='5237'&&getenv('POC_SCHEMA')==='ZHCT_APP'&&getenv('POC_EXTERNAL_STUBS')==='1'&&getenv('POC_REAL_QUEUE')==='0','Original loopback C nonprod boundary');$dsn='dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';}$db=new PDO($dsn,$cfg['username'],$cfg['password'],[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false]);unset($cfg,$dsn);return $db;}
function f27_execute($p,$hashes){foreach($hashes as $k=>$v)f27_assert(getenv('F27_ROOT_'.strtoupper($k))===$v,'Root exact approval '.$k);$recovered=f27tail_source($p);$sourceMeta=$recovered['meta'];$dir=$p['runtime_directory'];f27_assert(!file_exists($dir)&&!is_link($dir),'Once only runtime; no replay');f27_assert(mkdir($dir,0700),'Private own runtime');$h=fopen($dir.'/events.jsonl','x');f27_assert(is_resource($h)&&chmod($dir.'/events.jsonl',0600),'Exclusive private append journal');$st=['cursor'=>0,'read'=>32,'DML'=>0,'DDL'=>1,'created'=>true,'trigger_created'=>false,'collision_zero'=>true,'protected'=>true,'drop_proof'=>false,'table_drop_proof'=>false];$meta=['created_schema'=>$sourceMeta];$initial=f27_fingerprint($sourceMeta,$p);$compiled=null;$last=[];$lastTypes=[];$before=[];$beforeTypes=[];$pending=null;$ident=$recovered['identity'];$version=$recovered['version'];$stmt=null;
try{f27_append($h,['event'=>'start','hashes'=>$hashes,'budget'=>$p['budget'],'lane'=>$p['lane']]);$db=f27_connect($p);foreach($p['steps']as $s){f27_step_gate($p,$s,$st);f27_append($h,['event'=>'append-before','statement'=>$s,'state'=>$st,'utc'=>gmdate('c')]);$st[$s['kind']]++;$stmt=null;try{$stmt=$db->prepare($s['SQL']);foreach($s['binds']as $i=>$v)f27_assert($stmt->bindValue($i+1,$v,$s['PDO_types'][$i]),'Exact native binds');f27_assert($stmt->execute(),'Native execute');}catch(Throwable $e){f27_append($h,['event'=>'original-statement-error','statement'=>$s,'class'=>get_class($e),'code'=>$e->getCode(),'message'=>$e->getMessage(),'errorInfo'=>$stmt?$stmt->errorInfo():null]);throw $e;}
if($s['kind']!=='read'){f27_append($h,['event'=>'original-write-result','statement'=>$s,'rowCount'=>$stmt->rowCount(),'errorInfo'=>$stmt->errorInfo()]);if($s['role']==='create'){$st['created']=true;$st['protected']=false;}elseif($s['role']==='create_trigger')$st['trigger_created']=true;elseif($s['role']==='drop_trigger')$st['trigger_created']=false;elseif($s['role']==='drop_table')$st['created']=false;elseif($s['kind']==='DML'){$pending=$s;f27_assert(in_array($stmt->rowCount(),[0,1],true),'Original rowCount0/1 only');$st['protected']=false;}}
else{list($rows,$types,$keys,$streams,$bits)=f27_materialize($stmt->fetchAll(PDO::FETCH_ASSOC));f27_assert(count($rows)<=128,'Own/catalog bounded rows');f27_append($h,['event'=>'original-read-result','statement'=>$s,'rows'=>$rows,'native_types'=>$types,'native_keys'=>$keys,'native_streams'=>$streams,'native_float_bits'=>$bits,'errorInfo'=>$stmt->errorInfo(),'full27_sha256'=>$s['read_query']==='snapshot'?hash('sha256',f27_json(f27_native($rows,$types,$p))):null]);$role=$s['role'];$q=$s['read_query'];
if($role==='identity'){if($p['lane']==='B')f27_assert(count($rows)===1&&$rows[0]['db']==='zhct'&&$rows[0]['version']===$p['connection']['expected_version']&&$rows[0]['sql_mode']===$p['connection']['expected_sql_mode']&&$rows[0]['connection_charset']==='utf8mb4','Actual source B identity/SQLmode/charset');else f27_assert($rows===[['schema_name'=>'ZHCT_APP']],'Actual C schema');$ident=$rows;}
elseif($role==='version'){f27_assert(array_column($rows,'banner')===$p['connection']['expected_version_banners'],'Exact DM build');$version=$rows;}
elseif($role==='cleanup_identity')f27_assert($rows===$ident,'Identity unchanged');elseif($role==='cleanup_version')f27_assert($rows===$version,'Version unchanged');
elseif($role==='collision'){f27_assert($rows===[],'Exact own object/index/constraint/trigger/FK/dependency collision0');$next=$p['steps'][$st['cursor']+1];if($next['role']==='create')$st['collision_zero']=true;}
elseif($role==='zero')f27_assert($rows===[],'Final exact own closure0');elseif($role==='warnings'){f27_assert($rows===[],'Original source warnings retained; unexpected warning stops');}
elseif(in_array($role,['created_schema','compiled_schema','cleanup_schema','after_trigger_schema'],true)){$meta[$role][$q]=$rows;$end=$p['lane']==='B'?'ddl':(in_array($role,['compiled_schema','cleanup_schema'],true)?'trigger_ddl':'table_ddl');if($q===$end){$m=$meta[$role];if($role==='created_schema')f27c_fresh($m,$sourceMeta,$p);f27_schema($m,$p,$p['lane']==='C'&&in_array($role,['compiled_schema','cleanup_schema'],true));$fp=f27_fingerprint($m,$p);if($role==='created_schema'){$initial=$fp;$st['protected']=true;}elseif($role==='compiled_schema'){$copy=$fp;foreach(['triggers','objects','dependencies','trigger_ddl']as $k)unset($copy[$k]);$base=$initial;foreach(['triggers','objects','dependencies','trigger_ddl']as $k)unset($base[$k]);f27_assert($copy===$base,'Trigger only table/columns/index/constraint/DDL conserved');$compiled=$fp;$st['protected']=true;}elseif($role==='cleanup_schema'){f27_assert($fp===($p['lane']==='B'?$initial:$compiled)&&$st['created']&&$st['DML']===19&&$pending===null,'Complete successful creation journal + exact all structural bytes');$st['drop_proof']=true;if($p['lane']==='B')$st['table_drop_proof']=true;}else f27_assert($fp===$initial,'Only own trigger removed; original two-index PK closure');}}
elseif($role==='fresh_empty'){f27_snapshot($rows,$types,$p,true);f27_assert($rows===[],'Owned new table0 foreign rows before remaining trigger/DML');}
elseif($role==='before'){f27_snapshot($rows,$types,$p,$s['operation']==='SEED');f27_assert(f27_native($rows,$types,$p)===f27_native($last,$lastTypes,$p),'Before DML full27 native conservation');$before=$rows;$beforeTypes=$types;$st['protected']=true;}
elseif($role==='after'){f27_assert($pending!==null&&$pending['label']===$s['operation'],'Pending exact operation');f27_snapshot($rows,$types,$p);f27_transition($before,$rows,$beforeTypes,$types,$pending,$p);f27_append($h,['event'=>'protected-outcome','operation'=>$pending['label'],'before'=>$before,'before_native_types'=>$beforeTypes,'after'=>$rows,'after_native_types'=>$types,'timestamp_outcome'=>$pending['role']==='mutation'?($rows[0]['update_time']===$before[0]['update_time']?'ANCHOR':'AUTO_CLOCK'):'EXPLICIT_BASELINE']);$last=$rows;$lastTypes=$types;$pending=null;$st['protected']=true;}
elseif($role==='cleanup_snapshot'||$role==='table_drop_snapshot'){f27_snapshot($rows,$types,$p);f27_assert(f27_native($rows,$types,$p)===f27_native($last,$lastTypes,$p),'Cleanup exact full27 native/LOB SHA lease');if($role==='table_drop_snapshot')$st['table_drop_proof']=$st['drop_proof']&&!$st['trigger_created'];}
} $st['cursor']++;}f27_assert($st['read']===$p['budget']['read']&&$st['DML']===19&&$st['DDL']===$p['budget']['DDL']&&!$st['created']&&!$st['trigger_created'],'Exact completed ledger/owned closure');f27_append($h,['event'=>'complete','status'=>'ACTUAL_NEW_FULL27_SOURCE_ORACLE_REVIEW_REQUIRED','state'=>$st,'business_writes'=>0,'HTTP'=>0]);fclose($h);echo f27_json(['status'=>'ACTUAL_NEW_FULL27_SOURCE_ORACLE_REVIEW_REQUIRED','state'=>$st])."\n";return 0;
}catch(Throwable $e){f27_append($h,['event'=>'stopped_no_retry_no_automatic_cleanup','class'=>get_class($e),'message'=>$e->getMessage(),'errorInfo'=>$stmt?$stmt->errorInfo():null,'state'=>$st]);fclose($h);fwrite(STDERR,f27_json(['status'=>'STOPPED_OWNED_STATE_RETAINED','state'=>$st])."\n");return 1;}}
if(realpath($_SERVER['SCRIPT_FILENAME'])===__FILE__){try{$p=json_decode(file_get_contents(__DIR__.'/plan.json'),true);$n=f27tail_gate($p);foreach(['source_core_sha256'=>'runner.php','source_execute_sha256'=>'execute.php','source_plan_sha256'=>'plan-C.json']as $k=>$f)f27_assert(hash_file('sha256',__DIR__.'/../'.$f)===$p['recovery'][$k],'Original tool hash preserved');$hashes=['plan_sha'=>hash_file('sha256',__DIR__.'/plan.json'),'runner_sha'=>hash_file('sha256',__FILE__),'core_sha'=>hash_file('sha256',__DIR__.'/../C-resume/core-overlay.php')];$mode=$argv[1]??'--gate';f27_assert($mode==='--gate'||hash_file('sha256',__DIR__.'/recover.php')===getenv('F27C_ROOT_OVERLAY_SHA'),'Root exact new recovery overlay');if($mode==='--gate'){echo f27_json(['status'=>'PURE_C_TAIL_GATE_GREEN','hashes'=>$hashes,'overlay_sha'=>hash_file('sha256',__DIR__.'/recover.php'),'new_counts'=>$n,'cumulative_read'=>115,'connections'=>0])."\n";exit(0);}f27_assert($mode==='--execute','Known mode');exit(f27_execute($p,$hashes));}catch(Throwable $e){fwrite(STDERR,$e->getMessage()."\n");exit(1);}}
