<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="mlflow-e2e" errors="0" failures="21" skipped="5" tests="97" time="272.417" timestamp="2026-11-01T16:17:22.153780+00:00" hostname="e2e-cli-nmanos-ephc-rhoai-smoke-16c-2fsbd-test-mlflow-pod"><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with UPDATE &amp; GET permission can log and download artifacts]" time="6.347" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with UPDATE &amp; GET permission can log and load models]" time="8.906" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with UPDATE permission can verify storage for artifacts]" time="2.928" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with GET permission cannot log models]" time="4.428" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with GET permission on workspace 1 cannot start run in workspace 2]" time="2.165" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with UPDATE permission on workspace 2 cannot log artifacts in workspace 1]" time="4.793" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with GET permission cannot end run]" time="4.601" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with UPDATE permission on workspace 1 cannot log model to run in workspace 2]" time="4.553" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_mlflow_artifacts[User with LIST permission cannot log artifacts without CREATE permission]" time="2.280" /><testcase classname="tests.test_artifacts.TestMLflowArtifacts" name="test_s3_model_download_uses_runner_reachable_presigned_endpoint" time="0.000"><skipped type="pytest.skip" message="requires the in-cluster SeaweedFS S3 backend">/mlflow/mlflow-tests/tests/test_artifacts.py:278: requires the in-cluster SeaweedFS S3 backend</skipped></testcase><testcase classname="tests.test_artifacts.TestMLflowArtifactsServer" name="test_direct_artifact_server_functionality" time="3.547" /><testcase classname="tests.test_artifacts.TestMLflowArtifactsServer" name="test_direct_artifact_server_multipart_functionality" time="0.000"><skipped type="pytest.skip" message="requires an S3-backed artifact server with a direct artifact URI">/mlflow/mlflow-tests/tests/test_artifacts.py:456: requires an S3-backed artifact server with a direct artifact URI</skipped></testcase><testcase classname="tests.test_artifacts.TestMLflowArtifactsServer" name="test_gateway_compatibility_paths_are_served_by_artifact_deployment" time="3.676" /><testcase classname="tests.test_artifacts.TestMLflowArtifactsServer" name="test_gateway_multipart_paths_are_served_by_artifact_deployment" time="0.001"><skipped type="pytest.skip" message="requires live S3 multipart Gateway rewrite validation">/mlflow/mlflow-tests/tests/test_artifacts.py:495: requires live S3 multipart Gateway rewrite validation</skipped></testcase><testcase classname="tests.test_deploy_configuration" name="test_kind_overlay_rebakes_operator_values_from_overlay_params" time="0.388" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET permission can get experiment]" time="1.996" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET permission cannot create experiment]" time="2.008" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET permission on workspace 2 cannot get experiment in workspace 1]" time="2.164" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET permission scoped to one experiment can get that experiment]" time="2.168" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET permission scoped to one experiment cannot get a different experiment in the same workspace]" time="2.156" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with CREATE permission can create experiment]" time="2.392" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with GET, CREATE and DELETE permissions can delete experiment]" time="2.605" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[Validate that user with CREATE permission on workspace 1, cannot create experiment in workspace 2]" time="1.984" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[User with GET permission cannot delete experiment]" time="4.516" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[User with CREATE permission cannot delete experiment without DELETE permission]" time="2.826" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[User with UPDATE permission cannot create experiment without CREATE permission]" time="1.993" /><testcase classname="tests.test_experiments.TestExperiments" name="test_experiment[User with LIST permission cannot delete experiment without DELETE permission]" time="4.529" /><testcase classname="tests.test_garbage_collection.TestGarbageCollection" name="test_garbage_collection_job_removes_deleted_run_and_artifacts" time="0.000"><skipped type="pytest.skip" message="garbage collection live Job requires enabled remote SQL/S3 deployment">/mlflow/mlflow-tests/tests/test_garbage_collection.py:178: garbage collection live Job requires enabled remote SQL/S3 deployment</skipped></testcase><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission can get MCP server]" time="4.499" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission cannot create MCP server]" time="2.149" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission on workspace 1 cannot get MCP server in workspace 2]" time="4.212" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission scoped to one MCP server can get that server]" time="4.834" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission scoped to one MCP server cannot get a different server in the same workspace]" time="4.281" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission scoped to one MCP server cannot create a different server]" time="2.158" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with CREATE permission cannot register an MCP server (add a version) without UPDATE permission]" time="2.151" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with CREATE permission can create a bare MCP server via the direct client API]" time="2.448" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission cannot create a bare MCP server via the direct client API without CREATE permission]" time="1.996" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET, UPDATE and DELETE permissions can delete MCP server]" time="2.610" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission on workspace 1 cannot create MCP server in workspace 2]" time="2.156" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with GET permission cannot delete MCP server]" time="4.468" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with UPDATE permission cannot delete MCP server without DELETE permission]" time="2.777" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with DELETE permission cannot create MCP server without UPDATE permission]" time="2.155" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with DELETE permission cannot get MCP server without GET permission]" time="4.269" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with UPDATE permission can create MCP server]" time="2.453" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with LIST permission cannot delete MCP server without DELETE permission]" time="4.584" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that MCP server search results are scoped to the active workspace]" time="4.391" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Full MCP server lifecycle: create, add version and access endpoint, then delete]" time="2.779" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission can create an MCP access endpoint]" time="2.610" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with CREATE permission cannot create an MCP access endpoint without UPDATE permission]" time="4.686" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with GET permission can get an MCP access endpoint]" time="4.642" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission cannot get an MCP access endpoint without GET permission]" time="2.626" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that MCP access endpoint search results are scoped to the active workspace]" time="4.569" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission can update an MCP access endpoint]" time="2.806" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with GET permission cannot update MCP access endpoint without UPDATE permission]" time="5.040" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with DELETE permission cannot update MCP access endpoint without UPDATE permission]" time="4.817" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[Validate that user with UPDATE permission can delete an MCP access endpoint]" time="4.819" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with GET permission cannot delete MCP access endpoint without UPDATE permission]" time="5.039" /><testcase classname="tests.test_mcp_servers.TestMCPServers" name="test_mcp_server[User with DELETE permission alone cannot delete MCP access endpoint (requires UPDATE, not DELETE)]" time="4.798" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET permission can get registered model]" time="2.017" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET permission cannot create registered model]" time="1.996" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET permission on workspace 1 cannot get registered model in workspace 2]" time="2.157" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET permission scoped to one registered model can get that model]" time="2.167" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET permission scoped to one registered model cannot get a different model in the same workspace]" time="2.157" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with CREATE permission can create registered model]" time="2.383" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with GET, CREATE and DELETE permissions can delete registered model]" time="2.677" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[Validate that user with CREATE permission on workspace 1 cannot create registered model in workspace 2]" time="1.999" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with GET permission cannot delete registered model]" time="4.696" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with CREATE permission cannot delete registered model without DELETE permission]" time="2.515" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with DELETE permission cannot create registered model without CREATE permission]" time="2.001" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with DELETE permission cannot get registered model without GET permission]" time="2.153" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with UPDATE permission cannot create registered model without CREATE permission]" time="1.988" /><testcase classname="tests.test_models.TestRegisteredModels" name="test_registered_model[User with LIST permission cannot delete registered model without DELETE permission]" time="4.274" /><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with CREATE can create a bare Skill via the direct client API]" time="1.842"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-rxyhc1yu in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-rxyhc1yu, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773920&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773920&gt;&gt;
test_data = Test Data: name=User with CREATE can create a bare Skill via the direct client API user_info=UserInfo(workspace='works...y', resource_type=[&lt;ResourceType.SKILLS: 'skills'&gt;], verbs=['create']) workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773920&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-rxyhc1yu in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-rxyhc1yu, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with UPDATE cannot create a bare Skill via the direct client API without CREATE]" time="1.849"><failure message="AssertionError: Action failed with unexpected error for user test-user-wqsscu4c: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}. Expected permission/authentication error.">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773e60&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773e60&gt;&gt;
test_data = Test Data: name=User with UPDATE cannot create a bare Skill via the direct client API without CREATE user_info=UserInf...y', resource_type=[&lt;ResourceType.SKILLS: 'skills'&gt;], verbs=['update']) workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
tests/base.py:712: in _execute_validation
    validate_func(self.test_context)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

test_context = TestContext(workspaces=['workspace1-p8ofsely', 'workspace2-p8ofsely'], active_workspace='workspace1-p8ofsely', active_..._observed_state={}, k8_manager=None, discovered_workspaces=set(), unlabeled_namespace=None, namespaces_to_delete=set())

    def validate_authentication_denied(test_context: TestContext) -&gt; None:
        """Validate that an action failed due to authentication denial.
    
        Checks that an authentication or authorization error occurred during the action.
    
        Args:
            test_context: Test context containing structured error information.
    
        Raises:
            AssertionError: If no error occurred or error is not permission-related.
        """
        user_name = test_context.active_user.uname
        workspace = test_context.active_workspace
        logger.info(f"Validating that action failed as expected for user '{user_name}' in workspace '{workspace}'")
    
        # Validate that an error occurred
        if test_context.last_error is None:
            logger.error(f"Validation failed: Action should have failed for unauthorized user '{user_name}', but succeeded")
            raise AssertionError(f"Action should have failed for unauthorized user '{user_name}', but succeeded")
    
        error_response: ErrorResponse = test_context.last_error
    
        # Check if it's a permission or authentication error
        if not error_response.is_permission_error():
            logger.error(f"Validation failed: Expected permission/authentication error, got: {error_response.error.code} - {error_response.error.message}")
&gt;           raise AssertionError(
                f"Action failed with unexpected error for user {user_name}: {error_response.error.code} - {error_response.error.message}. "
                f"Expected permission/authentication error."
            )
E           AssertionError: Action failed with unexpected error for user test-user-wqsscu4c: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}. Expected permission/authentication error.

tests/validations/validation_utils.py:38: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with GET can retrieve a Skill]" time="1.832"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-ebh7ono0 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-ebh7ono0, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773f20&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773f20&gt;&gt;
test_data = Test Data: name=User with GET can retrieve a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773f20&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-ebh7ono0 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-ebh7ono0, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User without GET cannot retrieve a Skill]" time="1.827"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-wqvdmmgj in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-wqvdmmgj, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773fe0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773fe0&gt;&gt;
test_data = Test Data: name=User without GET cannot retrieve a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f773fe0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-wqvdmmgj in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-wqvdmmgj, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with LIST can search Skills]" time="1.839"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-b8jfuobo in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-b8jfuobo, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f89b0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f89b0&gt;&gt;
test_data = Test Data: name=User with LIST can search Skills user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f89b0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-b8jfuobo in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-b8jfuobo, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User without LIST cannot search Skills]" time="1.835"><failure message="AssertionError: Action failed with unexpected error for user test-user-vjwht523: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}. Expected permission/authentication error.">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8050&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8050&gt;&gt;
test_data = Test Data: name=User without LIST cannot search Skills user_info=UserInfo(workspace='workspace1-p8ofsely', resource_type=[&lt;ResourceType.SKILLS: 'skills'&gt;], verbs=['get']) workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
tests/base.py:712: in _execute_validation
    validate_func(self.test_context)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

test_context = TestContext(workspaces=['workspace1-p8ofsely', 'workspace2-p8ofsely'], active_workspace='workspace1-p8ofsely', active_..._observed_state={}, k8_manager=None, discovered_workspaces=set(), unlabeled_namespace=None, namespaces_to_delete=set())

    def validate_authentication_denied(test_context: TestContext) -&gt; None:
        """Validate that an action failed due to authentication denial.
    
        Checks that an authentication or authorization error occurred during the action.
    
        Args:
            test_context: Test context containing structured error information.
    
        Raises:
            AssertionError: If no error occurred or error is not permission-related.
        """
        user_name = test_context.active_user.uname
        workspace = test_context.active_workspace
        logger.info(f"Validating that action failed as expected for user '{user_name}' in workspace '{workspace}'")
    
        # Validate that an error occurred
        if test_context.last_error is None:
            logger.error(f"Validation failed: Action should have failed for unauthorized user '{user_name}', but succeeded")
            raise AssertionError(f"Action should have failed for unauthorized user '{user_name}', but succeeded")
    
        error_response: ErrorResponse = test_context.last_error
    
        # Check if it's a permission or authentication error
        if not error_response.is_permission_error():
            logger.error(f"Validation failed: Expected permission/authentication error, got: {error_response.error.code} - {error_response.error.message}")
&gt;           raise AssertionError(
                f"Action failed with unexpected error for user {user_name}: {error_response.error.code} - {error_response.error.message}. "
                f"Expected permission/authentication error."
            )
E           AssertionError: Action failed with unexpected error for user test-user-vjwht523: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}. Expected permission/authentication error.

tests/validations/validation_utils.py:38: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with UPDATE can update a Skill]" time="1.851"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-r9sowy2a in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-r9sowy2a, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8140&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8140&gt;&gt;
test_data = Test Data: name=User with UPDATE can update a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8140&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-r9sowy2a in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-r9sowy2a, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User without UPDATE cannot update a Skill]" time="1.838"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-y3rml1f3 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-y3rml1f3, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8200&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8200&gt;&gt;
test_data = Test Data: name=User without UPDATE cannot update a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8200&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-y3rml1f3 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-y3rml1f3, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User with DELETE can delete a Skill]" time="1.834"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-ivjba55i in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-ivjba55i, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f82f0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f82f0&gt;&gt;
test_data = Test Data: name=User with DELETE can delete a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f82f0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-ivjba55i in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-ivjba55i, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User without DELETE cannot delete a Skill]" time="1.834"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-4itt4b4y in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-4itt4b4y, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f83b0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f83b0&gt;&gt;
test_data = Test Data: name=User without DELETE cannot delete a Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f83b0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-4itt4b4y in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-4itt4b4y, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User cannot retrieve a Skill from another workspace]" time="1.839"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-tsdxvvdt in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-tsdxvvdt, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8470&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8470&gt;&gt;
test_data = Test Data: name=User cannot retrieve a Skill from another workspace user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8470&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-tsdxvvdt in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-tsdxvvdt, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Skill search excludes Skills from another workspace]" time="1.848"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-ezikbbsb in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-ezikbbsb, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8530&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8530&gt;&gt;
test_data = Test Data: name=Skill search excludes Skills from another workspace user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8530&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-ezikbbsb in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-ezikbbsb, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named GET permission allows the named Skill]" time="1.833"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-6ux8912i in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-6ux8912i, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f85f0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f85f0&gt;&gt;
test_data = Test Data: name=Named GET permission allows the named Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f85f0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-6ux8912i in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-6ux8912i, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named GET permission denies a different Skill]" time="1.844"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-g3uzaljk in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-g3uzaljk, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f86b0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f86b0&gt;&gt;
test_data = Test Data: name=Named GET permission denies a different Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f86b0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-g3uzaljk in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-g3uzaljk, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named UPDATE permission denies a different Skill]" time="1.845"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-owtvb8of in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-owtvb8of, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8770&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8770&gt;&gt;
test_data = Test Data: name=Named UPDATE permission denies a different Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8770&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-owtvb8of in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-owtvb8of, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named DELETE permission denies a different Skill]" time="1.831"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-2gjj7vk5 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-2gjj7vk5, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8830&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8830&gt;&gt;
test_data = Test Data: name=Named DELETE permission denies a different Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8830&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-2gjj7vk5 in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-2gjj7vk5, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named UPDATE permission allows the matching Skill]" time="1.833"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-a1jd2f9d in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-a1jd2f9d, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8920&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8920&gt;&gt;
test_data = Test Data: name=Named UPDATE permission allows the matching Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8920&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-a1jd2f9d in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-a1jd2f9d, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named DELETE permission allows the matching Skill]" time="1.837"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-l0co2k5s in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-l0co2k5s, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8aa0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8aa0&gt;&gt;
test_data = Test Data: name=Named DELETE permission allows the matching Skill user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8aa0&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-l0co2k5s in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-l0co2k5s, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Named GET permission does not grant unrestricted Skill search]" time="1.846"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-9o8m8egp in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-9o8m8egp, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8b60&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8b60&gt;&gt;
test_data = Test Data: name=Named GET permission does not grant unrestricted Skill search user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8b60&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 2, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-9o8m8egp in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-9o8m8egp, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[User can complete the Skill lifecycle]" time="1.829"><failure message="AssertionError: Action 'action_create_skill_shell' failed for user test-user-u9sdvsoj in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}&#10;Details: Context: User: test-user-u9sdvsoj, Workspace: workspace1-p8ofsely">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8c20&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8c20&gt;&gt;
test_data = Test Data: name=User can complete the Skill lifecycle user_info=UserInfo(workspace='workspace1-p8ofsely', resource_typ...ILLS: 'skills'&gt;], verbs=['create', 'get', 'list', 'update', 'delete']) workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8c20&gt;
validate_func = &lt;function validate_skill_created at 0x7fa17f83ef20&gt;
step_number = 1, action_name = 'action_create_skill_shell'

    def _execute_validation(self, validate_func, step_number: int, action_name: str) -&gt; None:
        """Execute a single validation function.
    
        Args:
            validate_func: The validation function to execute.
            step_number: The step number for logging.
            action_name: The action that was executed before this validation.
    
        Raises:
            AssertionError: If validation fails.
        """
        validation_name = validate_func.__name__
        logger.info(f"Step {step_number}: Executing validation '{validation_name}' for action '{action_name}'")
    
        # Generic error handling: if action failed and this is not an "expected failure" validation,
        # show the actual action error instead of letting validation give misleading messages
        if (
            self.test_context.last_error is not None
            and validation_name
            not in {
                "validate_authentication_denied",
                "validate_authentication_denied_or_resource_not_found",
                "validate_mcp_access_endpoint_deleted",
                "validate_skill_artifact_registration_unavailable",
                "validate_skill_deleted",
            }
        ):
    
            error_response = self.test_context.last_error
            user_name = self.test_context.active_user.uname if self.test_context.active_user else "unknown"
            workspace = self.test_context.active_workspace or "unknown"
    
            logger.error(f"Validation '{validation_name}' failed because action '{action_name}' encountered an error for user '{user_name}' in workspace '{workspace}': {error_response.error.code} - {error_response.error.message}")
    
            # Provide detailed error message showing the actual action failure
            error_msg = f"Action '{action_name}' failed for user {user_name} in workspace {workspace}: {error_response.error.code} - {error_response.error.message}"
            if error_response.error.details:
                error_msg += f"\nDetails: {error_response.error.details}"
    
&gt;           raise AssertionError(error_msg)
E           AssertionError: Action 'action_create_skill_shell' failed for user test-user-u9sdvsoj in workspace workspace1-p8ofsely: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}
E           Details: Context: User: test-user-u9sdvsoj, Workspace: workspace1-p8ofsely

tests/base.py:709: AssertionError</failure></testcase><testcase classname="tests.test_skill_registry.TestSkillRegistry" name="test_skill_registry[Local Skill registration is unavailable without artifact serving]" time="1.853"><failure message="AssertionError: Expected the server artifact-serving capability error, got: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}">self = &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8ce0&gt;
create_user_with_permissions = &lt;bound method TestBase._create_user of &lt;tests.test_skill_registry.TestSkillRegistry object at 0x7fa17f7f8ce0&gt;&gt;
test_data = Test Data: name=Local Skill registration is unavailable without artifact serving user_info=None workspace=workspace1-p8ofsely resource_slot=None

    @pytest.mark.parametrize(
        "test_data",
        test_scenarios,
        ids=lambda scenario: scenario.test_name,
    )
    def test_skill_registry(self, create_user_with_permissions, test_data):
        logger.info("Starting test: %s", test_data.test_name)
    
        if test_data.user_info:
            user_info = create_user_with_permissions(
                workspace=test_data.user_info.workspace,
                verbs=test_data.user_info.verbs,
                resource_types=test_data.user_info.resource_types,
                subresources=test_data.user_info.subresources,
                resource_names=test_data.user_info.resource_names,
            )
            self.test_context.active_user = user_info
            self.test_context.user_client = user_info.client
    
        if test_data.workspace_to_use:
            self.test_context.active_workspace = test_data.workspace_to_use
            mlflow.set_workspace(test_data.workspace_to_use)
    
&gt;       self._execute_test_steps(test_data=test_data)

tests/test_skill_registry.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/base.py:634: in _execute_test_steps
    self._execute_validation(validate_func=step.validate_func, step_number=i, action_name=action_name)
tests/base.py:712: in _execute_validation
    validate_func(self.test_context)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

test_context = TestContext(workspaces=['workspace1-p8ofsely', 'workspace2-p8ofsely'], active_workspace='workspace1-p8ofsely', active_..._observed_state={}, k8_manager=None, discovered_workspaces=set(), unlabeled_namespace=None, namespaces_to_delete=set())

    def validate_skill_artifact_registration_unavailable(
        test_context: TestContext,
    ) -&gt; None:
        """Validate local registration failure when artifact serving is disabled."""
        if test_context.last_error is None:
            raise AssertionError(
                "Local Skill registration unexpectedly succeeded without artifact serving"
            )
    
        message = test_context.last_error.error.message
        if "does not serve artifacts" not in message:
&gt;           raise AssertionError(
                "Expected the server artifact-serving capability error, got: "
                f"{test_context.last_error.error.code} - {message}"
            )
E           AssertionError: Expected the server artifact-serving capability error, got: RESOURCE_NOT_FOUND - INTERNAL_ERROR: Response: {'error': {'code': 'ENDPOINT_NOT_FOUND', 'message': 'Endpoint not found.'}}

tests/validations/skill_validations.py:133: AssertionError</failure></testcase><testcase classname="tests.test_trace_archival.TestTraceArchival" name="test_trace_archival_job_archives_multiple_traces[Job created from the trace archival CronJob archives traces and keeps them readable]" time="0.001"><skipped type="pytest.skip" message="trace archival live Job requires object storage and an enabled trace archival configuration">/mlflow/mlflow-tests/tests/test_trace_archival.py:91: trace archival live Job requires object storage and an enabled trace archival configuration</skipped></testcase><testcase classname="tests.test_traces.TestTraces" name="test_trace_logging[Agent with GET and UPDATE on one experiment can send traces to that experiment]" time="2.897" /><testcase classname="tests.test_traces.TestTraces" name="test_trace_logging[Agent with GET and UPDATE on one experiment cannot send traces to a different experiment in the same workspace]" time="2.308" /><testcase classname="tests.test_traces.TestTraces" name="test_trace_logging[Agent with GET and UPDATE in one workspace cannot send traces in a different workspace]" time="2.299" /></testsuite></testsuites>