composer = $composer ?? new AIFQ_SR_Next_Read_Model_Composer(); $this->reviews = $reviews ?? new AIFQ_SR_Review_Repository(); $this->review_reader = $review_reader ?? new AIFQ_SR_Next_Review_Reader(); $this->human_projection = $human_projection ?? new AIFQ_SR_Next_Human_Projection(); $this->mcp_projection = $mcp_projection ?? new AIFQ_SR_Next_MCP_Projection(); $this->fidelity = $fidelity ?? new AIFQ_SR_Next_Projection_Fidelity(); } public function current_model(): ?array { $model = $this->composer->current(); return is_array($model) && AIFQ_SR_Next_Projection_Contract::valid_model($model) ? $model : null; } public function current_projections(): ?array { $model = $this->current_model(); if ($model === null) { return null; } $human = $this->human_projection->project($model); $mcp = $this->mcp_projection->project($model); if ( !is_array($human) || !is_array($mcp) || !$this->fidelity->compare($model, $human, $mcp) ) { return null; } return [ 'model' => $model, 'human' => $human, 'mcp' => $mcp, ]; } public function resolve_current_evidence(string $evidence_id): ?array { $evidence_id = trim($evidence_id); $model = $this->current_model(); if ( $evidence_id === '' || $model === null || !in_array($evidence_id, $model['evidence_inventory_refs'], true) ) { return null; } $metadata = $this->reviews->get_canonical_pair_metadata(); $review_id = trim((string) ($metadata['current_review_id'] ?? '')); if ($review_id === '' || $review_id !== (string) $model['review']['review_id']) { return null; } $review = $this->review_reader->get($review_id); if ($review === null) { return null; } foreach ((array) ($review['next']['evidence_inventory'] ?? []) as $evidence) { if (is_array($evidence) && ($evidence['id'] ?? '') === $evidence_id) { return $evidence; } } return null; } }