'tests/Feature/Guards/ActionSurfaceContractTest.php', 'seconds' => 31.2], ['file' => 'tests/Feature/Filament/PolicyResourceAdminSearchParityTest.php', 'seconds' => 17.4], ['file' => 'tests/Feature/Filament/PolicyVersionAdminSearchParityTest.php', 'seconds' => 16.1], ['file' => 'tests/Feature/Rbac/BackupItemsRelationManagerUiEnforcementTest.php', 'seconds' => 14.5], ['file' => 'tests/Feature/Rbac/WorkspaceMembershipsRelationManagerUiEnforcementTest.php', 'seconds' => 12.8], ['file' => 'tests/Feature/Filament/TenantReviewHeaderDisciplineTest.php', 'seconds' => 11.7], ['file' => 'tests/Feature/Filament/PanelNavigationSegregationTest.php', 'seconds' => 10.9], ['file' => 'tests/Feature/Filament/Alerts/AlertsKpiHeaderTest.php', 'seconds' => 9.8], ['file' => 'tests/Feature/Guards/OperationLifecycleOpsUxGuardTest.php', 'seconds' => 8.7], ['file' => 'tests/Feature/ProviderConnections/CredentialLeakGuardTest.php', 'seconds' => 7.6], ]; } it('keeps lane artifact paths app-root relative under storage/logs/test-lanes', function (): void { $artifacts = TestLaneReport::artifactPaths('fast-feedback'); expect($artifacts)->toHaveKeys(['junit', 'summary', 'budget', 'report', 'profile']); foreach (array_values($artifacts) as $relativePath) { expect($relativePath)->toStartWith('storage/logs/test-lanes/'); } }); it('keeps only the skeleton file checked into the lane artifact directory', function (): void { $gitignore = base_path('storage/logs/test-lanes/.gitignore'); expect(file_exists($gitignore))->toBeTrue() ->and((string) file_get_contents($gitignore))->toContain('*') ->and((string) file_get_contents($gitignore))->toContain('!.gitignore'); }); it('publishes heavy attribution and budget payloads under the canonical artifact root', function (): void { $durationsByFile = collect(heavyGovernanceSyntheticHotspots()) ->mapWithKeys(static fn (array $entry): array => [$entry['file'] => $entry['seconds']]) ->all(); $slowestEntries = collect(heavyGovernanceSyntheticHotspots()) ->map(static fn (array $entry): array => [ 'label' => $entry['file'].'::synthetic', 'subject' => $entry['file'].'::synthetic', 'filePath' => $entry['file'], 'durationSeconds' => $entry['seconds'], 'wallClockSeconds' => $entry['seconds'], 'laneId' => 'heavy-governance', ]) ->values() ->all(); $report = TestLaneReport::buildReport( laneId: 'heavy-governance', wallClockSeconds: 118.4, slowestEntries: $slowestEntries, durationsByFile: $durationsByFile, ); expect($report['artifactDirectory'])->toBe('storage/logs/test-lanes') ->and($report['slowestEntries'])->toHaveCount(10) ->and(collect($report['classificationAttribution'])->pluck('classificationId')->all()) ->toContain('surface-guard', 'discovery-heavy') ->and(collect($report['familyAttribution'])->pluck('familyId')->all()) ->toContain('action-surface-contract', 'policy-resource-admin-search-parity', 'ops-ux-governance') ->and(collect($report['budgetEvaluations'])->pluck('targetType')->unique()->values()->all()) ->toEqualCanonicalizing(['lane', 'classification', 'family']) ->and($report['familyBudgetEvaluations'])->not->toBeEmpty(); }); it('publishes the shared fixture slimming comparison only for the governed standard lanes', function (): void { $fastFeedback = TestLaneReport::buildReport( laneId: 'fast-feedback', wallClockSeconds: 176.73623, slowestEntries: [], durationsByFile: [], comparisonProfile: 'shared-test-fixture-slimming', ); $heavyGovernance = TestLaneReport::buildReport( laneId: 'heavy-governance', wallClockSeconds: 83.66, slowestEntries: [], durationsByFile: [], comparisonProfile: 'shared-test-fixture-slimming', ); expect($fastFeedback)->toHaveKey('sharedFixtureSlimmingComparison') ->and($heavyGovernance)->not->toHaveKey('sharedFixtureSlimmingComparison'); });