<?php
declare(strict_types=1);require __DIR__.'/connect.php';require __DIR__.'/schema.php';$check($dm&&$lane==='C','Only approved C target');$check(!is_file($runtime.'/ddl-apply.json'),'Never replay attempted business DDL');$original=json_decode(file_get_contents($runtime.'/equipment-schema-original.json'),true);$fresh=normalizeSchemaNumericMetadata($schema('YOSHOP_EQUIPMENT'));$check($fresh===$original&&count($fresh['columns'])===12&&count($fresh['indexes'])===4&&$fresh['triggers']===[],'Fresh exact original schema12/4/no trigger');$check((int)$q('SELECT COUNT(*) n FROM yoshop_equipment')[0]['n']===0,'Fresh original empty0');$rehearsal=json_decode(file_get_contents($runtime.'/ddl-rehearsal.json'),true);$check($rehearsal['status']==='PASSED'&&$rehearsal['temporary_object_absent']&&$rehearsal['business_original_schema_unchanged'],'Approved isolated rehearsal green/clean');$check($q('SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME=?',['CK_EQ_STATUS_U8_11E70B'])===[],'Actual constraint collision0');$check($q('SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME=?',['CDX_STATUS_PREFLIGHT_11E70B'])===[],'Temporary object absent');$ddl=file_get_contents(__DIR__.'/equipment-status-add.sql');$check(hash('sha256',$ddl)==='f9439485eafc2c54acc59114d58c8aa1fe9c5dff825e179b0364070a9d6ef508','Exact Root-approved business ALTER SHA');$journal=['state'=>'STARTED','HTTP'=>0,'business_DML'=>0,'business_DDL_attempts'=>1,'SQL'=>$ddl,'sha256'=>hash('sha256',$ddl),'UTC_started'=>gmdate('c'),'before'=>$fresh];$persist('ddl-apply.json',$journal);
try{$stmt=$db->prepare($ddl);$check($stmt->execute(),'Single approved ALTER execute succeeded');$journal['driver_success']=true;$journal['driver_rowCount']=$stmt->rowCount();$journal['state']='APPLIED_PENDING_READBACK';$persist('ddl-apply.json',$journal);$after=normalizeSchemaNumericMetadata($schema('YOSHOP_EQUIPMENT'));$journal['after']=$after;$check(count($after['columns'])===13,'Exactly13 columns');$other=array_values(array_filter($after['columns'],static function($c){return $c['column_name']!=='STATUS';}));$check($other===$fresh['columns'],'All original12 column metadata byte values exact');$status=array_values(array_filter($after['columns'],static function($c){return $c['column_name']==='STATUS';}));$check(count($status)===1&&$status[0]['data_type']==='SMALLINT'&&$status[0]['nullable']==='N'&&trim($status[0]['data_default'])==='1','Actual STATUS SMALLINT NOTNULL default1');$new=array_values(array_filter($after['constraints'],static function($c){return $c['constraint_name']==='CK_EQ_STATUS_U8_11E70B';}));$check(count($new)===1&&$new[0]['constraint_type']==='C','Single exact named CHECK');$rest=array_values(array_filter($after['constraints'],static function($c){return $c['constraint_name']!=='CK_EQ_STATUS_U8_11E70B';}));$check($rest===$fresh['constraints'],'Original PK/FK/constraints exact');$consCols=array_values(array_filter($after['constraint_columns'],static function($c){return $c['constraint_name']!=='CK_EQ_STATUS_U8_11E70B';}));$check($consCols===$fresh['constraint_columns'],'Original constraint columns exact');foreach(['indexes','index_columns','triggers'] as $key)$check($after[$key]===$fresh[$key],'Original schema exact '.$key);$check((int)$q('SELECT COUNT(*) n FROM yoshop_equipment')[0]['n']===0,'Still0 original rows');$journal['state']='APPLIED_VERIFIED';$journal['original12_columns_exact']=true;$journal['original_indexes_constraints_triggers_exact']=true;$journal['rows_before_after0']=true;}
catch(Throwable $e){$journal['failure']=['class'=>get_class($e),'message'=>$e->getMessage()];$journal['state']='STOPPED_NO_REPLAY';try{$journal['independent_state_after_failure']=$schema('YOSHOP_EQUIPMENT');$journal['rows_after_failure']=(int)$q('SELECT COUNT(*) n FROM yoshop_equipment')[0]['n'];}catch(Throwable $probe){$journal['readback_failure']=get_class($probe);}}
$journal['UTC_finished']=gmdate('c');$persist('ddl-apply.json',$journal);file_put_contents(__DIR__.'/ddl-apply-C.json',json_encode($journal,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));echo json_encode(['state'=>$journal['state'],'business_DDL_attempts'=>1,'business_DML'=>0,'HTTP'=>0,'original12_columns_exact'=>$journal['original12_columns_exact']??false,'original_indexes_constraints_triggers_exact'=>$journal['original_indexes_constraints_triggers_exact']??false,'rows_before_after0'=>$journal['rows_before_after0']??false]),"\n";exit($journal['state']==='APPLIED_VERIFIED'?0:1);
