table($t)->orderBy('id')->get()->toJson();$nativeBefore=$native->table('gl_journals')->orderBy('id')->get()->toJson();$host->beginTransaction();try{ $metric='cash_coverage_single_payable';$v=(int)$host->table('an_criteria')->where('metric',$metric)->max('version');$p=$analysisPreview(13,$criterionInput('prepare',$metric,$v,$criterionData($metric)));$ok($host->table('an_criteria')->orderBy('id')->get()->toJson()===$before['an_criteria'],'criterion preview rolled back');$reject(fn()=>$analysisPreview(17,$criterionInput('prepare',$metric,$v,$criterionData($metric))),403,'read-only cannot prepare');$reject(fn()=>$analysisPreview(13,$criterionInput('prepare',$metric,$v,array_replace($criterionData($metric),['denominator_direction'=>'absolute']))),422,'cannot silently use absolute liability');$reject(fn()=>$analysisPreview(13,$criterionInput('prepare',$metric,$v,array_replace($criterionData($metric),['numerator_amount'=>'950']))),422,'client cannot inject financial amounts');$selectAnalysis(13);$prep=$analysis->confirm(13,$p['preview']);$again=$analysis->confirm(13,$p['preview']);$ok($again['replayed']&&$again['id']===$prep['id'],'same command no duplicate criterion');$pending=$analysisPreview(13,$indicatorInput($prep['id']));$ok($pending['impact']['result']['state']==='pending','unreviewed criterion pending');$reject(fn()=>$analysisPreview(13,$criterionInput('review',$metric,$v+1,['decision'=>'reviewed'])),403,'distinct reviewer required'); $cut1=$analysisPreview(14,$criterionInput('review',$metric,$v+1,['decision'=>'reviewed']));$cut2=$analysisPreview(14,$criterionInput('review',$metric,$v+1,['decision'=>'reviewed']));$selectAnalysis(14);$reviewed=$analysis->confirm(14,$cut1['preview']);$reject(fn()=>$analysis->confirm(14,$cut2['preview']),409,'stale second reviewer cut refused');[$result]=$analysisCommand(13,$indicatorInput($reviewed['id']));$selectAnalysis(17);$snapshot=$analysis->detail(17,$result['id'],'result');$r=$snapshot['result'];$ok($r['exact_fraction']==='19/2'&&$r['value']==='9.50'&&$r['unit']==='times','950/100 exact19/2 displayed9.50times');$ok($r['previous_period']===null&&$r['trend']===null,'absent comparison never zero trend');$ok(!$r['real_company_criterion']&&$r['representation_difference_fraction']==='0','hypothetical scope and representation difference explicit'); $expense='cash_expense_share';[$ep]=$analysisCommand(13,$criterionInput('prepare',$expense,0,$criterionData($expense)));[$er]=$analysisCommand(14,$criterionInput('review',$expense,1,['decision'=>'reviewed']));[$ec]=$analysisCommand(13,$indicatorInput($er['id']));$selectAnalysis(17);$e=$analysis->detail(17,$ec['id'],'result')['result'];$ok($e['exact_fraction']==='1/20'&&$e['value']==='5.00'&&$e['unit']==='percent','50/1000 exact1/20 displayed5percent');$report=$analysis->report(17,$ec['id']);$ok(hash('sha256',$report['bytes'])===$report['sha256']&&str_contains($report['bytes'],'NAO E RACIO GERAL'),'internal historical report checksum and limit'); $valid=$analysisSource->values;$analysisSource->values['supplier_credit_minor']='0';$zero=$analysisPreview(13,$indicatorInput($reviewed['id']));$ok($zero['impact']['result']['state']==='pending'&&$zero['impact']['result']['value']===null,'zero denominator pending no infinity');$analysisSource->values=$valid;$analysisSource->values['supplier_credit_minor']='-10000';$negative=$analysisPreview(13,$indicatorInput($reviewed['id']));$ok($negative['impact']['result']['state']==='pending','negative credit direction not coerced');$analysisSource->values=$valid;unset($analysisSource->values['cash_receipts_minor']);$missing=$analysisPreview(13,$indicatorInput($er['id']));$ok($missing['impact']['result']['state']==='pending','absent source not zero');$analysisSource->values=$valid;$analysisSource->values['currency']='USD';$currency=$analysisPreview(13,$indicatorInput($reviewed['id']));$ok($currency['impact']['result']['state']==='pending','currency mismatch pending');$analysisSource->values=$valid;$analysisSource->values['unit']='UN';$dimension=$analysisPreview(13,$indicatorInput($reviewed['id']));$ok($dimension['impact']['result']['state']==='pending','dimension mismatch pending');$analysisSource->values=$valid;$otherDate=$analysisPreview(13,$indicatorInput($reviewed['id'],'2026-11-09'));$ok($otherDate['impact']['result']['state']==='pending','unknown historic window pending');$none=$analysisPreview(13,$indicatorInput(null));$ok($none['impact']['result']['state']==='pending','no first criterion chosen automatically'); $inflight=$analysisPreview(13,$indicatorInput($reviewed['id']));$analysisSource->values['cash_revision']=10;$selectAnalysis(13);$reject(fn()=>$analysis->confirm(13,$inflight['preview']),409,'source change invalidates confirmation');$selectAnalysis(17);$old=$analysis->detail(17,$result['id'],'result');$ok($old['result']===$snapshot['result']&&$old['current_evaluation']['state']==='pending','old result unchanged with current pending exposed');$analysisSource->values=$valid; [$successor]=$analysisCommand(13,$criterionInput('prepare',$metric,$v+2,$criterionData($metric)));$outdated=$analysisPreview(13,$indicatorInput($reviewed['id']));$ok($outdated['impact']['result']['state']==='pending','successor criterion invalidates previous version for new calculation');$review=$analysisPreview(14,$criterionInput('review',$metric,$successor['version'],['decision'=>'reviewed']));$host->beginTransaction();try{$host->table('permission_grants')->where(['user_id'=>13,'permission'=>'financial_analysis.prepare','unit_id'=>2])->delete();$selectAnalysis(14);$reject(fn()=>$analysis->confirm(14,$review['preview']),403,'preparer authority revalidated');}finally{$host->rollBack();} $host->beginTransaction();try{$host->statement("CREATE FUNCTION an_fail_test() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'Injected indicator failure'; END; $$");$host->statement('CREATE TRIGGER an_fail_test BEFORE INSERT ON an_commands FOR EACH ROW EXECUTE FUNCTION an_fail_test()');$n=$host->table('an_criteria')->count();$selectAnalysis(14);$failed=false;try{$analysis->confirm(14,$review['preview']);}catch(Illuminate\Database\QueryException){$failed=true;}$ok($failed&&$host->table('an_criteria')->count()===$n,'failed command receipt rolls back reviewed criterion');}finally{$host->rollBack();}$selectAnalysis(14);$recovered=$analysis->confirm(14,$review['preview']);$ok($recovered['state']==='reviewed','same review recovers after failure'); $selectAnalysis(13);$key=$host->table('an_commands')->where('actor_id',13)->orderBy('id')->value('command_key');$ok($analysis->receipt(13,$key)['operation_executed']===false,'own historical receipt no execution');$selectAnalysis(14);$reject(fn()=>$analysis->receipt(14,$key),404,'other actor cannot recover key');$selectAnalysis(17);$listing=$analysis->listing(17,['view'=>'results','per_page'=>100]);$ok($listing['records']['total']===2&&!$listing['capabilities']['prepare']&&!$listing['capabilities']['review'],'read-only results catalogue and paged history');$reject(fn()=>$analysis->listing(17,['tenant_id'=>2]),422,'scope override refused'); }finally{$host->rollBack();}foreach($before as$t=>$json)$ok($host->table($t)->orderBy('id')->get()->toJson()===$json,'unchanged '.$t);$ok($native->table('gl_journals')->orderBy('id')->get()->toJson()===$nativeBefore,'native ledger unchanged');file_put_contents($work.'/analysis-result.json',json_encode(['passed'=>true,'checks'=>$checks,'origin_simulated_in_harness'=>true,'rolled_back'=>true,'new_financial_effects'=>0],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/analysis-result.json']).PHP_EOL;