create([ 'capabilities' => [ PlatformCapabilities::ACCESS_SYSTEM_PANEL, ], 'is_active' => true, ]); $this->actingAs($platformUser, 'platform') ->get('/system/ops/failures') ->assertForbidden(); }); it('prefilters failures page to failed runs', function () { $failedRun = OperationRun::factory()->create([ 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Failed->value, 'type' => 'inventory_sync', 'context' => [ 'reconciliation' => [ 'reconciled_at' => now()->toIso8601String(), 'reason' => 'run.infrastructure_timeout_or_abandonment', 'reason_code' => 'run.infrastructure_timeout_or_abandonment', 'source' => 'failed_callback', ], ], ]); $succeededRun = OperationRun::factory()->create([ 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, 'type' => 'inventory_sync', ]); $platformUser = PlatformUser::factory()->create([ 'capabilities' => [ PlatformCapabilities::ACCESS_SYSTEM_PANEL, PlatformCapabilities::OPERATIONS_VIEW, ], 'is_active' => true, ]); $this->actingAs($platformUser, 'platform') ->get('/system/ops/failures') ->assertSuccessful() ->assertSee('Failed operations') ->assertSee('Show all operations') ->assertSee('Automatically reconciled') ->assertSee(SystemOperationRunLinks::view($failedRun)) ->assertDontSee(SystemOperationRunLinks::view($succeededRun)); }); it('renders governance artifact failures without resolving tenant artifact routes on the system panel', function () { $tenant = Tenant::factory()->create(); $initiator = User::factory()->create(); $evidenceRun = $this->makeArtifactTruthRun( tenant: $tenant, type: 'tenant.evidence.snapshot.generate', attributes: [ 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Failed->value, 'failure_summary' => [ ['code' => 'operation.failed', 'message' => 'Evidence generation failed'], ], ], ); $evidenceSnapshot = $this->makeArtifactTruthEvidenceSnapshot($tenant, [ 'operation_run_id' => (int) $evidenceRun->getKey(), ]); $reviewRun = $this->makeArtifactTruthRun( tenant: $tenant, type: 'tenant.review.compose', attributes: [ 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Failed->value, 'failure_summary' => [ ['code' => 'operation.failed', 'message' => 'Review composition failed'], ], ], ); $review = $this->makeArtifactTruthReview( tenant: $tenant, user: $initiator, snapshot: $evidenceSnapshot, reviewOverrides: [ 'operation_run_id' => (int) $reviewRun->getKey(), ], ); $packRun = $this->makeArtifactTruthRun( tenant: $tenant, type: 'tenant.review_pack.generate', attributes: [ 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Failed->value, 'failure_summary' => [ ['code' => 'operation.failed', 'message' => 'Review pack generation failed'], ], ], ); $this->makeArtifactTruthReviewPack( tenant: $tenant, user: $initiator, snapshot: $evidenceSnapshot, review: $review, packOverrides: [ 'operation_run_id' => (int) $packRun->getKey(), ], ); $platformUser = PlatformUser::factory()->create([ 'capabilities' => [ PlatformCapabilities::ACCESS_SYSTEM_PANEL, PlatformCapabilities::OPERATIONS_VIEW, ], 'is_active' => true, ]); $this->actingAs($platformUser, 'platform') ->get('/system/ops/failures') ->assertSuccessful() ->assertSee('Evidence snapshot generation') ->assertSee('Review composition') ->assertSee('Review pack generation'); });