toBeTrue() ->and($lane['parallelMode'])->toBe('required') ->and($lane['includedFamilies'])->toContain('unit', 'ui-light') ->and($lane['excludedFamilies'])->toContain('browser', 'surface-guard', 'discovery-heavy') ->and($lane['budget']['baselineDeltaTargetPercent'])->toBe(50) ->and(TestLaneManifest::commandRef('fast-feedback'))->toBe('test') ->and($command)->toContain('--parallel') ->and($command)->toContain('--configuration='.$configurationPath) ->and($command)->toContain('--testsuite=Lane') ->and($configurationContents)->toContain('tests/Feature/Auth/BreakGlassWorkspaceOwnerRecoveryTest.php') ->and($configurationContents)->not->toContain('tests/Feature/Drift/DriftBulkAcknowledgeAllMatchingConfirmationTest.php') ->and($configurationContents)->not->toContain('tests/Feature/Findings/FindingBulkActionsTest.php') ->and($configurationContents)->not->toContain('tests/Feature/Guards/ActionSurfaceContractTest.php') ->and($configurationContents)->not->toContain('tests/Feature/Filament/PolicyResourceAdminSearchParityTest.php'); }); it('keeps fast-feedback narrower than confidence and rejects broad surface or discovery families', function (): void { $fastTargets = TestLaneManifest::discoverFiles('fast-feedback'); $confidenceTargets = TestLaneManifest::discoverFiles('confidence'); $validation = TestLaneManifest::validateLanePlacement( laneId: 'fast-feedback', filePath: 'tests/Feature/Guards/ActionSurfaceContractTest.php', ); expect($fastTargets)->not->toBeEmpty() ->and(count($fastTargets))->toBeLessThan(count($confidenceTargets)) ->and($fastTargets)->not->toContain('tests/Feature/Guards/ActionSurfaceContractTest.php') ->and($validation['valid'])->toBeFalse() ->and($validation['resolvedClassificationId'])->toBe('surface-guard'); }); it('treats pull-request fast-feedback budget policy as hard-fail only after the documented CI tolerance is exceeded', function (): void { $profile = TestLaneBudget::enforcementProfile('fast-feedback', 'pull-request'); $withinTolerance = TestLaneBudget::evaluateLaneForTrigger('fast-feedback', 'pull-request', 210.0); $overTolerance = TestLaneBudget::evaluateLaneForTrigger('fast-feedback', 'pull-request', 216.0); expect($profile['enforcementMode'])->toBe('hard-fail') ->and($profile['effectiveThresholdSeconds'])->toBe(215) ->and($withinTolerance['budgetStatus'])->toBe('warning') ->and($withinTolerance['blockingStatus'])->toBe('non-blocking-warning') ->and($overTolerance['budgetStatus'])->toBe('over-budget') ->and($overTolerance['blockingStatus'])->toBe('blocking'); });