table('pa_obligations')->orderBy('id')->value('id');$before=$native->table('pd_due_versions')->orderBy('id')->get()->toJson();$commands=$native->table('pd_due_commands')->orderBy('id')->get()->toJson();$people=$native->table('pa_access')->orderBy('id')->get()->toJson();$version=(int)$native->table('pd_due_versions')->where('obligation_id',$id)->max('version');$data=['due_on'=>'2026-11-30','evidence'=>'QA artificial conferĂȘncia de identidade humana distinta.']; $native->beginTransaction();$host->beginTransaction();try{ [$prep]=$dueCommand(13,$dueInput('prepare',$id,$version,$data));$prepared=json_decode($native->table('pd_due_versions')->find($prep['id'])->data,true);$ok(isset($prepared['_prepared_person']),'preparation records authoritative person');$reader=$dueCall(14,'index',['obligation_id'=>$id,'reference_on'=>'2026-11-30']);$person=$reader['value']['basis']['current_person'];$ok($person!==$prepared['_prepared_person'],'fixture preparer and reviewer distinct humans'); $reviewerId=(int)$native->table('pd_due_versions')->where(['obligation_id'=>$id,'action'=>'review'])->orderByDesc('id')->value('actor_id');$preparerId=(int)$native->table('pd_due_versions')->find($prep['id'])->actor_id;$review=$dueInput('review',$id,$version+1,['decision'=>'approved']); $native->beginTransaction();try{$native->table('pa_access')->where(['user_id'=>$reviewerId,'action'=>'view'])->update(['person'=>$prepared['_prepared_person']]);$rejectCatalogue(fn()=>$dueCall(14,'preview',$review),403,'different accounts same human cannot review');}finally{$native->rollBack();} $native->beginTransaction();try{$native->table('pa_access')->where(['user_id'=>$preparerId,'action'=>'view'])->update(['person'=>'qa-person-identity-changed']);$rejectCatalogue(fn()=>$dueCall(14,'preview',$review),409,'changed preparer human requires new preparation');}finally{$native->rollBack();} $cut=$dueCall(14,'preview',$review);$native->beginTransaction();try{$native->table('pa_access')->where(['user_id'=>$reviewerId,'action'=>'view'])->update(['person'=>'qa-person-reviewer-changed']);$rejectCatalogue(fn()=>$dueCall(14,'confirm',['preview'=>$cut['value']['preview']]),409,'reviewer identity change invalidates observed basis');}finally{$native->rollBack();} $done=$dueCall(14,'confirm',['preview'=>$cut['value']['preview']]);$ok($done['status']===201&&$done['value']['version']===$version+2,'unchanged distinct identity confirms');$again=$dueCall(14,'confirm',['preview'=>$cut['value']['preview']]);$ok($again['status']===200&&$again['value']['replayed'],'same distinct confirmation recovers once'); }finally{while($native->transactionLevel()>0)$native->rollBack();while($host->transactionLevel()>0)$host->rollBack();} $ok($native->table('pd_due_versions')->orderBy('id')->get()->toJson()===$before&&$native->table('pd_due_commands')->orderBy('id')->get()->toJson()===$commands,'versions commands rolled back');$ok($native->table('pa_access')->orderBy('id')->get()->toJson()===$people,'identity fixtures rolled back');file_put_contents($work.'/payable-due-identity.json',json_encode(['passed'=>true,'checks'=>$checks,'fixtures_rolled_back'=>true],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/payable-due-identity.json']).PHP_EOL;