(int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'status' => EvidenceSnapshotStatus::Active->value, 'completeness_state' => EvidenceCompletenessState::Complete->value, 'summary' => array_replace_recursive([ 'dimension_count' => 5, 'finding_count' => 2, 'report_count' => 2, 'operation_count' => 2, 'missing_dimensions' => 0, 'stale_dimensions' => 0, ], $summaryOverrides), 'fingerprint' => hash('sha256', 'evidence-'.$tenant->getKey().'-'.microtime()), 'generated_at' => now(), ]; return EvidenceSnapshot::query()->create(array_replace($defaults, $snapshotOverrides)); } protected function makeArtifactTruthReview( Tenant $tenant, User $user, ?EvidenceSnapshot $snapshot = null, array $reviewOverrides = [], array $summaryOverrides = [], ): TenantReview { $snapshot ??= $this->makeArtifactTruthEvidenceSnapshot($tenant); $defaults = [ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'evidence_snapshot_id' => (int) $snapshot->getKey(), 'initiated_by_user_id' => (int) $user->getKey(), 'status' => TenantReviewStatus::Ready->value, 'completeness_state' => TenantReviewCompletenessState::Complete->value, 'summary' => array_replace_recursive([ 'publish_blockers' => [], 'section_state_counts' => [ 'complete' => 6, 'partial' => 0, 'missing' => 0, 'stale' => 0, ], 'finding_count' => 2, 'report_count' => 2, 'operation_count' => 2, 'section_count' => 6, ], $summaryOverrides), 'fingerprint' => hash('sha256', 'review-'.$tenant->getKey().'-'.microtime()), 'generated_at' => now(), ]; return TenantReview::query()->create(array_replace($defaults, $reviewOverrides)); } protected function makeArtifactTruthReviewPack( Tenant $tenant, User $user, ?EvidenceSnapshot $snapshot = null, ?TenantReview $review = null, array $packOverrides = [], array $summaryOverrides = [], ): ReviewPack { $snapshot ??= $this->makeArtifactTruthEvidenceSnapshot($tenant); $review ??= $this->makeArtifactTruthReview($tenant, $user, $snapshot); $defaults = [ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'tenant_review_id' => (int) $review->getKey(), 'evidence_snapshot_id' => (int) $snapshot->getKey(), 'initiated_by_user_id' => (int) $user->getKey(), 'status' => ReviewPackStatus::Ready->value, 'summary' => array_replace_recursive([ 'review_status' => $review->status, 'review_completeness_state' => $review->completeness_state, 'finding_count' => 2, 'report_count' => 2, 'operation_count' => 2, 'evidence_resolution' => [ 'outcome' => 'resolved', 'snapshot_id' => (int) $snapshot->getKey(), 'snapshot_fingerprint' => (string) $snapshot->fingerprint, 'completeness_state' => (string) $snapshot->completeness_state, ], ], $summaryOverrides), 'fingerprint' => hash('sha256', 'pack-'.$tenant->getKey().'-'.microtime()), 'file_disk' => 'exports', 'file_path' => 'review-packs/'.microtime(true).'.zip', 'sha256' => hash('sha256', 'pack-file-'.$tenant->getKey().'-'.microtime()), 'file_size' => 1024, 'generated_at' => now(), 'expires_at' => now()->addDays(30), ]; return ReviewPack::query()->create(array_replace($defaults, $packOverrides)); } protected function makeArtifactTruthRun( Tenant $tenant, string $type, array $context = [], array $attributes = [], ): OperationRun { $defaults = [ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => $type, 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, 'initiator_name' => 'Artifact Truth Test', 'context' => $context, 'summary_counts' => [], 'failure_summary' => [], 'started_at' => now()->subMinute(), 'completed_at' => now(), ]; return OperationRun::factory()->create(array_replace($defaults, $attributes)); } }