<?php
declare(strict_types=1);
try{
 require __DIR__.'/common.php';$scenario=$_SERVER['HTTP_X_PILOT_SCENARIO']??'';$cases=json_decode(file_get_contents(__DIR__.'/cases.json'),true);if(is_file(__DIR__.'/cases-retry.json'))$cases+=json_decode(file_get_contents(__DIR__.'/cases-retry.json'),true);$check(isset($cases[$scenario]),'Exact frozen case');$case=$cases[$scenario];$tokens=json_decode(file_get_contents($runtime.'/tokens.json'),true);$token=$case['actor']==='none'?'':$tokens[$case['actor']];$body=file_get_contents('php://input');
 $check($_SERVER['REQUEST_METHOD']===$case['method']&&parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH)===$case['path']&&($_SERVER['QUERY_STRING']??'')===$case['query']&&$_SERVER['HTTP_HOST']===$case['host']&&($_SERVER['HTTP_PLATFORM']??'')===$case['platform']&&($_SERVER['HTTP_VERSION']??'')===$case['version']&&$body===$case['body_raw']&&($_SERVER['HTTP_ACCESS_TOKEN']??'')===$token,'Exact method/path/query/host/platform/version/Auth/body');if($case['method']==='POST')$check(($_SERVER['CONTENT_TYPE']??'')==='application/x-www-form-urlencoded','Original form encoding');$check(!file_exists($runtime.'/wire-'.$scenario.'.json'),'Never replay successful formal request');
 $_SERVER['SCRIPT_FILENAME']=$root.'/public/index.php';$_SERVER['SCRIPT_NAME']='/index.php';$_SERVER['PHP_SELF']='/index.php';$app=ropeApp($root,$runtime,$scenario);RopeSqlGate::$case=$case;$app->env->set('store.host',['rope1.exact.invalid'=>2147001111,'rope2.exact.invalid'=>2147001112]);$before=$small();
 $http=$app->http;$response=$http->run();$after=$small();$check($before['users']===$after['users']&&$before['staff']===$after['staff']&&$before['store']===$after['store'],'Original User/Staff/Store projections unchanged');if(strpos($scenario,'ADD_')!==0)$check($before['rope']===$after['rope'],'Read/invalid case Rope unchanged');else $check(count($after['rope'])-count($before['rope'])<=1,'At most one own Rope write');
 $source=json_decode(file_get_contents(__DIR__.'/source-frozen-sha.json'),true)['files'];$included=[];foreach(get_included_files() as $file)if(strpos($file,$root.'/')===0){$name=substr($file,strlen($root)+1);$included[$name]=hash_file('sha256',$file);$check(isset($source[$name])&&$source[$name]===$included[$name],'Actual included source freeze '.$name);}
 $persist('wire-'.$scenario.'.json',['scenario'=>$scenario,'case'=>$case,'http_status'=>$response->getCode(),'raw'=>$response->getContent(),'before'=>$before,'after'=>$after,'included_source_sha256'=>$included,'actual_formal_inserts'=>RopeSqlGate::$writes]);$response->send();$http->end($response);
}catch(Throwable $e){if(isset($persist))$persist('harness-failure-'.preg_replace('/[^A-Z0-9_]/','',strtoupper($scenario??'INIT')).'.json',['class'=>get_class($e),'message'=>$e->getMessage(),'file'=>$e->getFile(),'line'=>$e->getLine()]);http_response_code(500);header('Content-Type: application/json');echo json_encode(['harness_error'=>get_class($e),'message'=>$e->getMessage()]);}
