active()->create([ 'workspace_id' => (int) $tenant->workspace_id, ]); $scopeKey = 'baseline_profile:'.$profile->getKey(); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_compare', ]); $observedAt = CarbonImmutable::parse('2026-02-25T00:00:00Z'); CarbonImmutable::setTestNow($observedAt); $staleFinding = Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'finding_type' => Finding::FINDING_TYPE_DRIFT, 'source' => 'baseline.compare', 'scope_key' => $scopeKey, 'fingerprint' => 'drift-stale', 'recurrence_key' => 'drift-stale', 'status' => Finding::STATUS_NEW, 'resolved_at' => null, 'resolved_reason' => null, ]); $seenFinding = Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'finding_type' => Finding::FINDING_TYPE_DRIFT, 'source' => 'baseline.compare', 'scope_key' => $scopeKey, 'fingerprint' => 'drift-seen', 'recurrence_key' => 'drift-seen', 'status' => Finding::STATUS_NEW, ]); $resolvedCount = app(BaselineAutoCloseService::class)->resolveStaleFindings( tenant: $tenant, baselineProfileId: (int) $profile->getKey(), seenFingerprints: ['drift-seen'], currentOperationRunId: (int) $run->getKey(), ); expect($resolvedCount)->toBe(1); $staleFinding->refresh(); $seenFinding->refresh(); expect($staleFinding->status)->toBe(Finding::STATUS_RESOLVED) ->and($staleFinding->resolved_reason)->toBe('no_longer_drifting') ->and($staleFinding->resolved_at?->toIso8601String())->toBe($observedAt->toIso8601String()) ->and((int) $staleFinding->current_operation_run_id)->toBe((int) $run->getKey()); expect($seenFinding->status)->toBe(Finding::STATUS_NEW); });