<?php
$root=getenv('PM_ROOT');$path=parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH);if($_SERVER['REQUEST_METHOD']!=='POST'){http_response_code(403);exit;}foreach(json_decode(file_get_contents(__DIR__.'/private-source-lock.json'),true)as $file=>$sha)if(hash_file('sha256',__DIR__.'/source/application/'.$file)!==$sha){http_response_code(403);exit;}
require __DIR__.'/state.php';$spec=json_decode(file_get_contents(__DIR__.'/private-spec.json'),true);$case=$_SERVER['HTTP_X_CDX_CASE']??'';$expected=array_map('strval',$spec['params']);ksort($expected);$actual=$_POST;ksort($actual);if($case!==$spec['label']||$path!=='/p/syllabusEvaluate/'.$spec['method']||$actual!==$expected){http_response_code(403);exit;}$before=$state();$guard($before,true);$rows=$own($before);
if(in_array($case,['add_initial','add_retry'],true))$check(count($rows)===0,'No previous own add');if(in_array($case,['update','update_retry','delete'],true)){$check(count($rows)===1&&$rows[0]['uuid']===$actual['uuid']&&!in_array((string)$rows[0]['id'],['1','2'],true)&&$rows[0]['staff_uuid']===$lease['staff_uuid'],'Exact API own UUID/PK before mutation');}
$wirePath=__DIR__.'/private-wire.jsonl';if(is_file($wirePath))foreach(explode("\n",trim(file_get_contents($wirePath)))as $line){$w=json_decode($line,true);$check($w['label']!==$case,'Do not repeat executed case');}
$post=$_POST;$sql=[];$started=microtime(true);$timeBefore=date('Y-m-d H:i:s');$actualSqlMode=null;ob_start();register_shutdown_function(static function()use($case,$path,$post,$before,$state,$guard,$sql,$started,$timeBefore,&$actualSqlMode):void{try{$after=$state();$guard($after,true);$entry=['label'=>$case,'path'=>$path,'params'=>$post,'status'=>http_response_code(),'response'=>(string)ob_get_contents(),'source_before'=>$before,'source_after'=>$after,'window'=>[$timeBefore,date('Y-m-d H:i:s')],'duration_seconds'=>microtime(true)-$started,'actual_sql_mode'=>$actualSqlMode,'sql'=>$GLOBALS['CDX_SQL']??[]];if(strlen($entry['response'])>2097152)throw new RuntimeException('Response cap2MiB');file_put_contents(__DIR__.'/private-wire.jsonl',json_encode($entry,JSON_UNESCAPED_UNICODE)."\n",FILE_APPEND);chmod(__DIR__.'/private-wire.jsonl',0600);}catch(Throwable $e){file_put_contents(__DIR__.'/private-audit-error',get_class($e).': '.$e->getMessage());chmod(__DIR__.'/private-audit-error',0600);}});
$_SERVER['PATH_INFO']=$path;require __DIR__.'/init.php';\think\Config::set('database.debug',true);\think\Db::clear();$GLOBALS['CDX_SQL']=[];\think\Db::listen(static function($query,$runtime){$GLOBALS['CDX_SQL'][]=['sql'=>$query,'runtime'=>$runtime];});if($lane==='B')$actualSqlMode=\think\Db::query('SELECT @@SESSION.sql_mode AS session_sql_mode,@@GLOBAL.sql_mode AS global_sql_mode');\think\App::run()->send();
