<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'business_dml'=>0,'ddl'=>0,'safe'=>false,'tables'=>[],'failure'=>null];$private=[];
try{
 $sourceLock=[];$expectedFiles=['p/controller/FeedingHistory.php'=>'07a04826004f741853fe086cf64b612045a0d060a47204f2e764cf68602f2079','p/logic/FeedingHistory.php'=>'664ada1a3bd7404946802b8cda74664c2a66364601d758d495a00d4655242ee1','model/FeedingHistory.php'=>'4fe151dd635d07b291ae01b8d54d538d34a9af87d61492908b2d1dfa572fd231','validate/FeedingHistory.php'=>'7a19365881338db6ee8369a888d23832d7636e040aa34fa29fc017fc50464dd6'];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'=>'CDXFH'.$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);
