<?php
declare(strict_types=1);
require __DIR__.'/gate.php';require __DIR__.'/catalog-amendment.php';
$p=nf_plan(__DIR__.'/probe-plan.json');$a=nf_amend_load(__DIR__.'/catalog-amendment-C.json',$p);$n=0;
foreach(['B','C']as $lane)foreach($p['lanes'][$lane]['five_float_group']['steps']as $st)foreach($st['DML']as $d){nf_check(nf_catalog_sql($d['sql'],$lane,$a)===$d['sql'],'DML identical');$n++;}
foreach($a['replacements']as $r){nf_check(nf_catalog_sql($r['original_sql'],'C',$a)===$r['approved_replacement_sql'],'Catalog exact substitution');nf_check(nf_catalog_sql($r['original_sql'],'B',$a)===$r['original_sql'],'B untouched');$n+=2;}
$mutations=[
 'projection narrowed'=>static function(&$x){$x['replacements'][0]['approved_replacement_sql']=str_replace('SELECT *','SELECT TRIGGER_NAME',$x['replacements'][0]['approved_replacement_sql']);},
 'filter changed'=>static function(&$x){$x['replacements'][0]['approved_replacement_sql']=str_replace('TABLE_NAME IN','TRIGGER_NAME IN',$x['replacements'][0]['approved_replacement_sql']);},
 'bind order changed'=>static function(&$x){$x['replacements'][0]['bindings_exact']=array_reverse($x['replacements'][0]['bindings_exact']);},
 'budget reset'=>static function(&$x){$x['budget_cumulative']['C_probe_queries_already_consumed']=0;},
 'budget widened'=>static function(&$x){$x['budget_cumulative']['C_natural_queries_total_cap']=41;},
 'extra replacement'=>static function(&$x){$x['replacements'][]=$x['replacements'][0];},
 'rowcap widened'=>static function(&$x){$x['replacements'][1]['max_rows']=33;},
];
$rejected=[];foreach($mutations as $name=>$mutation){$x=$a;$mutation($x);try{nf_amend_contract($x,$p);}catch(Throwable $e){$rejected[]=$name;$n++;continue;}throw new RuntimeException('Mutation survived '.$name);}
echo json_encode(['status'=>'AMENDMENT_PURE_GATE_PASS','assertions'=>$n,'negative_gates_rejected'=>$rejected,'plan_sha256'=>NF_PLAN_SHA,'amendment_sha256'=>NF_AMEND_SHA,'DB_connections'=>0,'DDL'=>0,'DML'=>0],JSON_PRETTY_PRINT),"\n";
