[], 'issues' => [], 'coverage' => [ 'truncated' => false, 'unprocessed_intervals' => [], 'section_results' => [['status'=>'covered','evidence_refs'=>['segment-1']]], 'objective_results' => [['status'=>'covered','evidence_refs'=>['segment-1']]], ], ]; $cases = [ [$good, true], [array_replace($good, ['missing_inputs'=>['transcript']]), false], [array_replace_recursive($good, ['coverage'=>['truncated'=>true]]), false], [array_replace_recursive($good, ['coverage'=>['unprocessed_intervals'=>[[0,5]]]]), false], [array_replace_recursive($good, ['coverage'=>['section_results'=>[['status'=>'missing']]]]), false], [array_replace($good, ['issues'=>[['severity'=>'major','resolution_status'=>'open']]]), false], [array_replace($good, ['issues'=>[['severity'=>'critical','resolution_status'=>'resolved']]]), false], [array_replace($good, ['issues'=>[['severity'=>'critical','resolution_status'=>'resolved','resolution_evidence'=>'reviewer-note-1']]]), true], ]; foreach ($cases as $index => [$report, $expected]) { if (VideoReviewReportValidator::approvable($report) !== $expected) { throw new RuntimeException("Report case {$index} failed"); } } echo 'PASS ' . count($cases) . " video review report cases\n";