<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'business_dml'=>0,'ddl'=>0,'safe'=>false,'tables'=>[],'failure'=>null];$private=[];
try{
 $sourceLock=[];$expectedFiles=['p/controller/Treatise.php'=>'f4d8d81f8da7bda4f0e21a6f10b4a25e4d478776b231d36e6080dc12d3fb8c33','p/controller/MatchRecord.php'=>'75d633a07a162bb232dbc5ddb86150864509060c07578fa8e33792375ab986d1','p/logic/Treatise.php'=>'a73095c95538beb0c3f4f858d1ae98a3d215cc305a8b79f23809bb0d123f54db','p/logic/MatchRecord.php'=>'b13843914628e65a3b081a1414dac5338b08f6489db8307ddd1c63c9b3058a91','model/Treatise.php'=>'06ce5ac36889325fbfabb8af2b5c3d6c35754d858d23dc2537e0b7dd997aabdd','model/MatchRecord.php'=>'99aba50f7f2f309832199a550f2660ee1b2e621bc965223cac6ee62cfa74f90b','validate/Treatise.php'=>'092945f9121fd5ff04de1a2162dabfbb77361550f7e7af734e365cecb3fc2033','validate/MatchRecord.php'=>'4400578a73d907959464a253fec5fb2c3db0fb7642d383e3de8ec0771191a81c'];foreach($expectedFiles as $file=>$expectedSha){$check(hash_file('sha256',__DIR__.'/source/application/'.$file)===$expectedSha,'Source SHA drift');$sourceLock[$file]=$expectedSha;}$save('private-source-lock.json',$sourceLock);$report['source_sha_verified']=true;
 if($lane==='B')$check(strpos((string)$db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0,'MySQL5.6');else $check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='ZHCT_APP','DM identity');
 $staff=$q('SELECT UUID,NAME,AI_USER_ID,IS_SHOW,JOB_STATUS FROM '.$p.'staff WHERE NAME LIKE ? ORDER BY ID',['CDXPAY%']);$expected=$lane==='B'?'f483ba1c130ac167b850ae5099196f085b2f5b7db2faf5787a201eb5f7dbf321':'8b7f1416ace012169e9ac5c94fceb49115287a7006c1f0712ebac2d30af000b4';$matches=array_values(array_filter($staff,static function($r)use($expected){return preg_match('/^CDXPAY[A-F0-9]{8}$/D',$r['name'])===1&&hash('sha256',$r['name'])===$expected;}));$check(count($matches)===1,'Exact synthetic staff lease');$staff=$matches[0];$users=$q('SELECT ID,UUID,STAFF_UUID,ACCOUNT,TYPE FROM '.$p.'user WHERE STAFF_UUID=? AND IS_DELETE=0',[$staff['uuid']]);$check(count($users)===1&&$users[0]['account']===$staff['name']&&(int)$staff['is_show']===1,'Exact synthetic user mapping');
 $actor=$q('SELECT ID,UUID,STAFF_UUID,ACCOUNT,TYPE,IS_DELETE FROM '.$p.'user WHERE ID=(SELECT MIN(ID) FROM '.$p.'user WHERE TYPE=0 AND IS_DELETE=0)')[0];
 $private=['staff'=>$staff,'user'=>$users[0],'actor'=>$actor,'marker'=>'CDXPM'.$lane.strtoupper(bin2hex(random_bytes(3)))];$report['consumed_reference']=['marker_sha256'=>$expected,'staff_projection_sha256'=>$hash($staff),'user_projection_sha256'=>$hash($users[0]),'actor_projection_sha256'=>$hash($actor),'actor_uuid_length'=>strlen($actor['uuid']),'readonly_only'=>true];$save('private-lease.json',$private);
 foreach($modules as $module=>$scope){$table=$p.$scope['table'];$entry=['safe'=>false];try{$entry['columns']=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,DATETIME_PRECISION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[strtoupper($table)]);$check($entry['columns']!==[],'Table absent');$entry['indexes']=$lane==='B'?$q('SELECT INDEX_NAME,NON_UNIQUE,SEQ_IN_INDEX,COLUMN_NAME FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$table]):$q('SELECT I.INDEX_NAME,I.UNIQUENESS,C.COLUMN_POSITION,C.COLUMN_NAME FROM USER_INDEXES I JOIN USER_IND_COLUMNS C ON I.INDEX_NAME=C.INDEX_NAME WHERE I.TABLE_NAME=? ORDER BY I.INDEX_NAME,C.COLUMN_POSITION',[strtoupper($table)]);$entry['triggers']=$lane==='B'?$q('SELECT TRIGGER_NAME,EVENT_MANIPULATION FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$table]):$q('SELECT TRIGGER_NAME,STATUS,TRIGGERING_EVENT FROM USER_TRIGGERS WHERE TABLE_NAME=?',[strtoupper($table)]);$entry['foreign_keys']=$lane==='B'?$q('SELECT TABLE_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME=? OR REFERENCED_TABLE_NAME=?) ORDER BY TABLE_NAME,CONSTRAINT_NAME',[$table,$table]):$q("SELECT C.TABLE_NAME,C.CONSTRAINT_NAME,P.TABLE_NAME AS REFERENCED_TABLE_NAME FROM USER_CONSTRAINTS C LEFT JOIN USER_CONSTRAINTS P ON C.R_CONSTRAINT_NAME=P.CONSTRAINT_NAME WHERE C.CONSTRAINT_TYPE='R' AND (C.TABLE_NAME=? OR P.TABLE_NAME=?) ORDER BY C.TABLE_NAME,C.CONSTRAINT_NAME",[strtoupper($table),strtoupper($table)]);$check($entry['triggers']===[]&&$entry['foreign_keys']===[],'Unknown trigger/FK');$rows=$q('SELECT * FROM '.$table.' ORDER BY ID');$entry['rows']=count($rows);$entry['sha256']=$hash($rows);$entry['safe']=true;$entry['failure']=null;$private['natural'][$module]=$rows;}catch(Throwable $e){$entry['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}$report['tables'][$module]=$entry;}
 $report['safe']=(bool)array_filter($report['tables'],static function($v){return $v['safe'];});$report['original_debug']=$cfg['debug']??null;
}catch(Throwable $e){$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}
$save('private-preflight.json',$report);$save('private-baseline.json',$private);echo json_encode($report),"\n";exit($report['safe']?0:2);
