html(); $html = preg_replace('/]*>.*?<\/script>/is', '', $html) ?? $html; $html = preg_replace('/]*>.*?<\/style>/is', '', $html) ?? $html; $html = preg_replace('/\s+wire:snapshot="[^"]*"/', '', $html) ?? $html; $html = preg_replace('/\s+wire:effects="[^"]*"/', '', $html) ?? $html; return trim((string) preg_replace('/\s+/', ' ', strip_tags($html))); } it('shows run outcome and baseline artifact truth as separate facts on the run detail page', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $profile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, ]); $snapshot = BaselineSnapshot::factory()->incomplete(BaselineReasonCodes::SNAPSHOT_CAPTURE_FAILED)->create([ 'workspace_id' => (int) $tenant->workspace_id, 'baseline_profile_id' => (int) $profile->getKey(), ]); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_capture', 'status' => 'completed', 'outcome' => 'failed', 'context' => [ 'baseline_profile_id' => (int) $profile->getKey(), 'baseline_snapshot_id' => (int) $snapshot->getKey(), 'result' => [ 'snapshot_id' => (int) $snapshot->getKey(), 'snapshot_lifecycle' => 'incomplete', ], 'reason_code' => BaselineReasonCodes::SNAPSHOT_CAPTURE_FAILED, ], 'failure_summary' => [ ['reason_code' => BaselineReasonCodes::SNAPSHOT_CAPTURE_FAILED, 'message' => 'Snapshot capture stopped after persistence failed.'], ], 'completed_at' => now(), ]); $truth = app(ArtifactTruthPresenter::class)->forOperationRun($run->fresh()); $explanation = $truth->operatorExplanation; Filament::setTenant(null, true); $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); session([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); $component = Livewire::actingAs($user) ->test(TenantlessOperationRunViewer::class, ['run' => $run]) ->assertSee('Decision') ->assertSee('Outcome') ->assertSee('Artifact truth') ->assertSee('Execution failed') ->assertSee($explanation?->headline ?? '') ->assertSee($explanation?->evaluationResultLabel() ?? '') ->assertSee($explanation?->trustworthinessLabel() ?? '') ->assertSee('Artifact not usable') ->assertSee('Primary next step') ->assertSee('Artifact truth details') ->assertSee('Inspect the related capture diagnostics before using this snapshot') ->assertDontSee('Artifact next step'); $pageText = visibleLivewireText($component); expect(mb_substr_count($pageText, 'Primary next step'))->toBe(1) ->and(mb_substr_count($pageText, 'Inspect the related capture diagnostics before using this snapshot'))->toBe(1) ->and(mb_strpos($pageText, 'Decision'))->toBeLessThan(mb_strpos($pageText, 'Artifact truth details')); }); it('shows operator explanation facts for baseline compare runs with nested compare reason context', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_compare', 'status' => 'completed', 'outcome' => 'partially_succeeded', 'context' => [ 'baseline_compare' => [ 'reason_code' => 'evidence_capture_incomplete', 'coverage' => [ 'proof' => false, ], 'evidence_gaps' => [ 'count' => 4, ], ], ], 'summary_counts' => [ 'total' => 0, 'processed' => 0, 'errors_recorded' => 0, ], 'completed_at' => now(), ]); $truth = app(ArtifactTruthPresenter::class)->forOperationRun($run->fresh()); $explanation = $truth->operatorExplanation; Filament::setTenant(null, true); $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); session([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); $component = Livewire::actingAs($user) ->test(TenantlessOperationRunViewer::class, ['run' => $run]) ->assertSee('Decision') ->assertSee('Artifact truth') ->assertSee('Result meaning') ->assertSee('Result trust') ->assertSee('Primary next step') ->assertSee('Artifact truth details') ->assertSee($explanation?->headline ?? '') ->assertSee($explanation?->evaluationResultLabel() ?? '') ->assertSee($explanation?->trustworthinessLabel() ?? '') ->assertSee($explanation?->nextActionText ?? '') ->assertSee('The run completed, but normal output was intentionally suppressed.') ->assertSee('Resume or rerun evidence capture before relying on this compare result.') ->assertDontSee('Artifact next step'); $pageText = visibleLivewireText($component); expect(mb_substr_count($pageText, 'Primary next step'))->toBe(1) ->and(mb_substr_count($pageText, 'Resume or rerun evidence capture before relying on this compare result.'))->toBe(1) ->and(mb_strpos($pageText, 'Decision'))->toBeLessThan(mb_strpos($pageText, 'Artifact truth details')); }); it('deduplicates repeated artifact truth explanation text for follow-up runs without a usable artifact', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_compare', 'status' => 'completed', 'outcome' => 'partially_succeeded', 'summary_counts' => [ 'total' => 50, 'processed' => 47, 'failed' => 3, ], 'context' => [], 'completed_at' => now(), ]); Filament::setTenant(null, true); $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); session([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]); $component = Livewire::actingAs($user) ->test(TenantlessOperationRunViewer::class, ['run' => $run]) ->assertSee('Decision') ->assertSee('Artifact truth details') ->assertSee('The run finished without a usable artifact result.'); $pageText = visibleLivewireText($component); expect(mb_substr_count($pageText, 'The run finished without a usable artifact result.'))->toBe(1) ->and(mb_strpos($pageText, 'Decision'))->toBeLessThan(mb_strpos($pageText, 'Artifact truth details')); });