<?php
function pf_reference(){return json_decode(<<<'PF_PLAN_JSON'
{
  "status": "ROOT_AUTHORIZED_FORMAL_C_READONLY_MAX80",
  "table": "ZHCT_APP.YDY_PREPAY_ORDER",
  "candidate_trigger": "TRG_YDY_PREPAY_ORDER_UT",
  "columns": [
    "ID",
    "SOURCE",
    "DEVICE_ORDER_NO",
    "MACHID",
    "EQUIPMENT_ID",
    "RESTAURANT_ID",
    "TRACKNO",
    "GOODS_NAME",
    "PRICE",
    "CHANNELID",
    "PREPAY_STATUS",
    "MEAL_ORDER_ID",
    "MEAL_ORDER_NO",
    "USER_ID",
    "SHIP_STATUS",
    "ERRINFO",
    "RAW_REQUEST_A",
    "RAW_REQUEST_C",
    "RAW_REQUEST_B",
    "QRCODE_PAYLOAD",
    "EXPIRE_TIME",
    "PAY_TIME",
    "SHIP_TIME",
    "CREATE_TIME",
    "CREATE_BY",
    "UPDATE_TIME",
    "UPDATE_BY"
  ],
  "date_columns": [
    "EXPIRE_TIME",
    "PAY_TIME",
    "SHIP_TIME",
    "CREATE_TIME",
    "UPDATE_TIME"
  ],
  "CLOB_columns": [
    "RAW_REQUEST_A",
    "RAW_REQUEST_C",
    "RAW_REQUEST_B",
    "QRCODE_PAYLOAD"
  ],
  "budget": {
    "readonly": 17,
    "root_ceiling": 80,
    "DML": 0,
    "DDL": 0,
    "HTTP": 0,
    "max_rows": 100
  },
  "runtime": "/tmp/cdx-prepay-formal-fresh-20261011",
  "queries": [
    {
      "ordinal": 1,
      "label": "identity",
      "SQL": "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS SCHEMA_NAME FROM DUAL",
      "binds": [],
      "PDO_types": []
    },
    {
      "ordinal": 2,
      "label": "version",
      "SQL": "SELECT * FROM V$VERSION",
      "binds": [],
      "PDO_types": []
    },
    {
      "ordinal": 3,
      "label": "columns",
      "SQL": "SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 4,
      "label": "table_ddl",
      "SQL": "SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 5,
      "label": "indexes",
      "SQL": "SELECT * FROM USER_INDEXES WHERE TABLE_NAME=? ORDER BY INDEX_NAME",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 6,
      "label": "index_columns",
      "SQL": "SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME=? ORDER BY INDEX_NAME,COLUMN_POSITION",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 7,
      "label": "constraints",
      "SQL": "SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 8,
      "label": "constraint_columns",
      "SQL": "SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME,POSITION",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 9,
      "label": "foreign_keys",
      "SQL": "SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME=? OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=?))",
      "binds": [
        "YDY_PREPAY_ORDER",
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2,
        2
      ]
    },
    {
      "ordinal": 10,
      "label": "triggers",
      "SQL": "SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?",
      "binds": [
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 11,
      "label": "new_trigger_collision",
      "SQL": "SELECT * FROM USER_TRIGGERS WHERE TRIGGER_NAME=?",
      "binds": [
        "TRG_YDY_PREPAY_ORDER_UT"
      ],
      "PDO_types": [
        2
      ]
    },
    {
      "ordinal": 12,
      "label": "objects",
      "SQL": "SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS WHERE OBJECT_NAME IN (?,?) ORDER BY OBJECT_NAME",
      "binds": [
        "YDY_PREPAY_ORDER",
        "TRG_YDY_PREPAY_ORDER_UT"
      ],
      "PDO_types": [
        2,
        2
      ]
    },
    {
      "ordinal": 13,
      "label": "dependencies",
      "SQL": "SELECT * FROM USER_DEPENDENCIES WHERE REFERENCED_OWNER=? AND REFERENCED_NAME=?",
      "binds": [
        "ZHCT_APP",
        "YDY_PREPAY_ORDER"
      ],
      "PDO_types": [
        2,
        2
      ]
    },
    {
      "ordinal": 14,
      "label": "row_count_before",
      "SQL": "SELECT COUNT(*) AS CNT FROM ZHCT_APP.YDY_PREPAY_ORDER",
      "binds": [],
      "PDO_types": []
    },
    {
      "ordinal": 15,
      "label": "rows_before",
      "SQL": "SELECT T.*,CAST(ID AS VARCHAR(40)) AS ID_EXACT,TO_CHAR(EXPIRE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_EXPIRE_TIME,TO_CHAR(PAY_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_PAY_TIME,TO_CHAR(SHIP_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_SHIP_TIME,TO_CHAR(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_CREATE_TIME,TO_CHAR(UPDATE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_UPDATE_TIME,CAST(CASE WHEN RAW_REQUEST_A IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_A,CAST(CASE WHEN RAW_REQUEST_C IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_C,CAST(CASE WHEN RAW_REQUEST_B IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_B,CAST(CASE WHEN QRCODE_PAYLOAD IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_QRCODE_PAYLOAD FROM ZHCT_APP.YDY_PREPAY_ORDER T ORDER BY ID",
      "binds": [],
      "PDO_types": []
    },
    {
      "ordinal": 16,
      "label": "row_count_after",
      "SQL": "SELECT COUNT(*) AS CNT FROM ZHCT_APP.YDY_PREPAY_ORDER",
      "binds": [],
      "PDO_types": []
    },
    {
      "ordinal": 17,
      "label": "rows_after",
      "SQL": "SELECT T.*,CAST(ID AS VARCHAR(40)) AS ID_EXACT,TO_CHAR(EXPIRE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_EXPIRE_TIME,TO_CHAR(PAY_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_PAY_TIME,TO_CHAR(SHIP_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_SHIP_TIME,TO_CHAR(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_CREATE_TIME,TO_CHAR(UPDATE_TIME,'YYYY-MM-DD HH24:MI:SS.FF6') AS F_UPDATE_TIME,CAST(CASE WHEN RAW_REQUEST_A IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_A,CAST(CASE WHEN RAW_REQUEST_C IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_C,CAST(CASE WHEN RAW_REQUEST_B IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_RAW_REQUEST_B,CAST(CASE WHEN QRCODE_PAYLOAD IS NULL THEN 1 ELSE 0 END AS VARCHAR(1)) AS N_QRCODE_PAYLOAD FROM ZHCT_APP.YDY_PREPAY_ORDER T ORDER BY ID",
      "binds": [],
      "PDO_types": []
    }
  ]
}
PF_PLAN_JSON
,true);}

function pf_assert($v,$m){if(!$v)throw new RuntimeException($m);}
function pf_json($v){$s=json_encode($v,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION);pf_assert($s!==false,'JSON encoding');return $s;}
function pf_gate($p){pf_assert($p===pf_reference(),'Exact frozen literal plan');pf_assert(count($p['queries'])===17&&$p['budget']['readonly']===17,'Readonly budget17');foreach($p['queries']as $i=>$q){pf_assert($q['ordinal']===$i+1&&strpos($q['SQL'],'SELECT ')===0&&strpos($q['SQL'],';')===false,'Exact SELECT only');pf_assert(substr_count($q['SQL'],'?')===count($q['binds'])&&count($q['binds'])===count($q['PDO_types']),'Exact binding arity');foreach($q['binds']as $j=>$v)pf_assert(is_string($v)&&$q['PDO_types'][$j]===PDO::PARAM_STR,'Literal string bind/type');}return true;}
function pf_append($h,$e){pf_assert(fwrite($h,pf_json($e)."\n")!==false&&fflush($h),'Durable append');}
function pf_materialize($rows){$types=[];$streams=[];$bits=[];$keys=[];foreach($rows as $i=>&$r){$keys[$i]=array_keys($r);foreach($r as $k=>&$v){$key=strtolower($k);$types[$i][$key]=gettype($v);if(is_float($v))$bits[$i][$key]=bin2hex(pack('d',$v));if(is_resource($v)){$v=stream_get_contents($v);pf_assert(is_string($v),'Full original stream');$streams[$i][$key]=['bytes'=>strlen($v),'sha256'=>hash('sha256',$v)];}}unset($v);$r=array_change_key_case($r,CASE_LOWER);}unset($r);return [$rows,$types,$streams,$bits,$keys];}
function pf_round0($v){if($v===null)return ['original'=>null,'source_fsp0'=>null,'classification'=>'NULL-preserved'];if(!is_string($v)||!preg_match('/^(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\.(\d{6})$/D',$v,$m)||!checkdate((int)$m[2],(int)$m[3],(int)$m[1])||(int)$m[4]>23||(int)$m[5]>59||(int)$m[6]>59)return ['original'=>$v,'source_fsp0'=>null,'classification'=>'OPEN-invalid-no-policy-change'];$d=DateTimeImmutable::createFromFormat('!Y-m-d H:i:s',substr($v,0,19),new DateTimeZone('UTC'));pf_assert($d!==false,'Calendar parse');$up=(int)$m[7]>=500000;if($up)$d=$d->modify('+1 second');return ['original'=>$v,'source_fsp0'=>$d->format('Y-m-d H:i:s'),'classification'=>$up?'round-up-calendar-second':'round-down-calendar-second'];}
function pf_row_summary($rows,$types,$p){$out=[];foreach($rows as $i=>$r){$native=[];$nt=[];foreach($p['columns']as $c){$k=strtolower($c);pf_assert(array_key_exists($k,$r)&&array_key_exists($k,$types[$i]),'Every27 native field/type');$native[$k]=$r[$k];$nt[$k]=$types[$i][$k];}$x=['id_exact'=>$r['id_exact'],'full27_sha256'=>hash('sha256',pf_json(['values'=>$native,'native_types'=>$nt])),'date_map'=>[],'LOBs'=>[]];foreach($p['date_columns']as $c)$x['date_map'][$c]=pf_round0($r['f_'.strtolower($c)]);foreach($p['CLOB_columns']as $c){$k=strtolower($c);$v=$r[$k];pf_assert($v===null||is_string($v),'Native complete LOB');pf_assert($r['n_'.$k]===($v===null?'1':'0'),'Native LOB NULL distinction');$x['LOBs'][$c]=['null'=>$v===null,'native_type'=>$nt[$k],'bytes'=>$v===null?null:strlen($v),'sha256'=>$v===null?null:hash('sha256',$v)];}$out[]=$x;}return $out;}
function pf_run($p){pf_gate($p);$dir=$p['runtime'];pf_assert(!file_exists($dir),'Once runtime must not exist');pf_assert(mkdir($dir,0700)&&chmod($dir,0700),'Private exclusive runtime');$h=fopen($dir.'/events.jsonl','x');pf_assert(is_resource($h)&&chmod($dir.'/events.jsonl',0600),'Private journal');$count=0;$stmt=null;$results=[];
try{pf_append($h,['event'=>'start','plan_sha256'=>hash_file('sha256',__DIR__.'/plan.json'),'runner_sha256'=>hash_file('sha256',__FILE__),'authorization'=>'Root formal C readonly17 within80; no DML DDL HTTP Auth']);$file='/tmp/zhct-dm-poc-20260928.fcpiiN/store/application/database.php';pf_assert(realpath($file)===$file&&!is_link($file),'Exact config');$cfg=(static function($f){return require $f;})($file);pf_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 C nonprod boundary');$db=new PDO('dm:host=127.0.0.1;port=5237;schema=ZHCT_APP',$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);
foreach($p['queries']as $q){pf_assert($count<17,'Read ceiling');if(strpos($q['label'],'rows_')===0){$prior=$results[$q['label']==='rows_before'?'row_count_before':'row_count_after']['rows'];pf_assert(count($prior)===1&&(int)$prior[0]['cnt']<=100,'Bounded formal row count before full read');}pf_append($h,['event'=>'append-before-read','statement'=>$q]);$count++;$stmt=$db->prepare($q['SQL']);foreach($q['binds']as $i=>$v)pf_assert($stmt->bindValue($i+1,$v,$q['PDO_types'][$i]),'Exact binding');pf_assert($stmt->execute(),'Native SELECT');list($rows,$types,$streams,$bits,$keys)=pf_materialize($stmt->fetchAll(PDO::FETCH_ASSOC));pf_assert(count($rows)<=1000,'Catalog cap');$rec=['event'=>'read-original-result','label'=>$q['label'],'rows'=>$rows,'native_types'=>$types,'native_streams'=>$streams,'native_float_bits'=>$bits,'native_keys'=>$keys,'errorInfo'=>$stmt->errorInfo()];pf_append($h,$rec);$results[$q['label']]=$rec;if($q['label']==='identity')pf_assert(count($rows)===1&&$rows[0]['schema_name']==='ZHCT_APP','Native schema');}
$before=pf_row_summary($results['rows_before']['rows'],$results['rows_before']['native_types'],$p);$after=pf_row_summary($results['rows_after']['rows'],$results['rows_after']['native_types'],$p);$columns=array_column($results['columns']['rows'],'column_name');$dateMeta=[];foreach($results['columns']['rows']as $r)if(in_array($r['column_name'],$p['date_columns'],true))$dateMeta[$r['column_name']]=array_intersect_key($r,array_flip(['data_type','data_scale','nullable','data_default']));$summary=['status'=>$before===$after?'READONLY_FRESH_STABLE':'READONLY_FRESH_DRIFT_NO_WRITE','readonly_attempts'=>$count,'row_count'=>count($before),'columns27_exact'=>$columns===$p['columns'],'trigger_count'=>count($results['triggers']['rows']),'new_trigger_collision'=>count($results['new_trigger_collision']['rows']),'index_count'=>count($results['indexes']['rows']),'constraint_count'=>count($results['constraints']['rows']),'foreign_key_count'=>count($results['foreign_keys']['rows']),'dependency_count'=>count($results['dependencies']['rows']),'date_metadata'=>$dateMeta,'rows'=>$before,'after_full27_sha256'=>array_column($after,'full27_sha256'),'table_ddl_sha256'=>hash('sha256',$results['table_ddl']['rows'][0]['ddl']),'plan_sha256'=>hash_file('sha256',__DIR__.'/plan.json'),'runner_sha256'=>hash_file('sha256',__FILE__)];pf_append($h,['event'=>'complete','summary'=>$summary]);fclose($h);$summary['private_journal_sha256']=hash_file('sha256',$dir.'/events.jsonl');$s=fopen($dir.'/summary.json','x');pf_assert(is_resource($s)&&chmod($dir.'/summary.json',0600),'Summary exclusive');fwrite($s,pf_json($summary)."\n");fclose($s);echo pf_json(['status'=>$summary['status'],'readonly_attempts'=>$count,'row_count'=>$summary['row_count'],'private_journal_sha256'=>$summary['private_journal_sha256']])."\n";return 0;
}catch(Throwable $e){pf_append($h,['event'=>'stopped_no_retry','class'=>get_class($e),'message'=>$e->getMessage(),'readonly_attempts'=>$count,'errorInfo'=>$stmt?$stmt->errorInfo():null]);fclose($h);fwrite(STDERR,pf_json(['status'=>'STOPPED_PRIVATE_ORIGINAL_RETAINED','readonly_attempts'=>$count])."\n");return 1;}}
if(realpath($_SERVER['SCRIPT_FILENAME'])===__FILE__){$mode=$argv[1]??'--gate';$p=json_decode(file_get_contents(__DIR__.'/plan.json'),true);pf_gate($p);if($mode==='--gate'){echo pf_json(['status'=>'PURE_GATE_GREEN','queries'=>17,'connection_created'=>false])."\n";exit(0);}pf_assert($mode==='--execute','Known mode');exit(pf_run($p));}
