<?php
declare(strict_types=1);
const NF_AMEND_SHA='f794d73cfa9e5288e382c6db87cb33882a7a806b66e95eeaf8956e15a95d7cf6';
function nf_amend_contract(array $a,array $p):void {
 nf_check($a['original_plan_sha256']===NF_PLAN_SHA,'Amend original plan identity');
 nf_check(count($a['replacements'])===2,'Exactly two SELECT replacements');
 $old=[$p['lanes']['C']['natural_protection']['queries'][9],$p['lanes']['C']['five_float_group']['schema_fingerprint_queries'][5]];
 foreach($a['replacements']as $i=>$r){
  nf_check($r['original_sql']===$old[$i]['sql'],'Exact original catalog query');
  nf_check($r['bindings_exact']===$old[$i]['bindings']&&$r['max_rows']===$old[$i]['max_rows'],'All bindings/order/type/rowcap unchanged');
  $suffix=substr($r['original_sql'],strpos($r['original_sql'],' FROM USER_TRIGGERS'));
  nf_check($r['approved_replacement_sql']==='SELECT *'.$suffix,'Projection-only full catalog replacement');
 }
 nf_check($a['budget_cumulative']['C_probe_queries_already_consumed']===2&&$a['budget_cumulative']['C_natural_queries_already_consumed']===10,'Prior read attempts not reset');
 nf_check($a['budget_cumulative']['C_probe_queries_total_cap']===299&&$a['budget_cumulative']['C_natural_queries_total_cap']===40,'Total caps unchanged');
}
function nf_amend_load(string $file,array $p):array {
 nf_check(hash_file('sha256',$file)===NF_AMEND_SHA,'Exact Root-approved catalog amendment bytes');
 $a=json_decode(file_get_contents($file),true,512,JSON_THROW_ON_ERROR);nf_amend_contract($a,$p);return $a;
}
function nf_catalog_sql(string $sql,string $lane,?array $a):string {
 if($lane!=='C'||$a===null)return $sql;
 foreach($a['replacements']as $r)if($sql===$r['original_sql'])return $r['approved_replacement_sql'];
 return $sql;
}
