Repository: elastic/kibana
Pull request #217210: [Ai4dSoc][Serverless] Hide `Security` feature sub-privileges in `search_ai_lake` tier
Author: login: ashokaditya
Labels: name: release_note:skip
description: Skip the PR/issue when compiling release notes
name: Team:Defend Workflows
description: “EDR Workflows” sub-team of Security Solution
name: Team:Security Generative AI
description: Security Generative AI
name: backport:version
description: Backport to applied version labels
name: v9.1.0
name: v8.19.0
Created: 2025-04-04T14:53:10Z | Merged: 2025-04-16T21:40:09Z

## Summary

Hides security sub-privileges for ai4soc/search_ai_lake tier.
![Screenshot 2025-04-11 at 10 22 09](https://github.com/user-attachments/assets/6f3294bc-82de-404e-b9d3-22e717d54b65)

### Reasoning for changes added to `x-pack/packages/security`:

Currently, the feature description of Security feature is tied to the fact that it has a list of sub-privileges. This is true on ESS and `essentials/complete` serverless tiers.

With the introduction of the lower `search_ai_lake` tier, security feature would not have any sub-privileges available and thus it does not make sense to show that description. 

The ideal way to handle this would be to load feature privileges config settings at the plugin level (security_solution/security_solution_serverless) and set `description` to `null | undefined` based on the tier, as currently the feature privileges settings live in [kibana_features file (v2_features)](https://github.com/elastic/kibana/blob/795094d8c63dde1439220cfba1808fce50c781d1/x-pack/solutions/security/packages/features/src/security/v2_features/kibana_features.ts#L72) (also another set in v1_features) and the plugins only select a set of those based on the [feature keys available](https://github.com/elastic/kibana/blob/d4a33a2b61f05e85f99f8f5932b0266babb439f2/x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts) on each tier. The refactoring to pass in feature configs at the plugin level (instead of just feature keys) is not in the scope of the work cut out for RSA conf.

Thus the other simpler approach in this PR is to allow overriding the description field on the tier specific config file.

## How to Test

1. While on the Kibana root directory, run ES/Kibana on serverless mode with:

```bash
yarn es serverless --kill --projectType security --kibanaUrl=http://0.0.0.0:5601
```
and on a new window
```bash
yarn serverless-security --no-base-path
```

Enable the AI for SOC tier, by adding the following to your `serverless.security.dev.yaml` file:

```json5
xpack.securitySolutionServerless.productTypes:
  [
    { product_line: 'ai_soc', product_tier: 'search_ai_lake' },
  ]
```

2. Once Kibana is up and running login in with the `admin` role using the role dropdown.
3. Navigate to `app/management/roles/edit`
4. Click on `Assign to space` button and assign a space to that role on the `Assign role to spaces` flyout.
5. Expand the `Security` category and verify that `Security` feature is listed in the list of features.
6. Also verify that there is neither an accordion icon beside `Security` feature nor a description text under it about sub-privileges.

### Checklist

Check the PR satisfies following conditions. 

Reviewers should verify this PR satisfies this list as well.

- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials
- [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios
- [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)
- [ ] This was checked for breaking HTTP API changes, and any breaking changes have been approved by the breaking-change committee. The `release_note:breaking` label should be applied in these situations.
- [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed
- [ ] The PR  description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

### Identify risks

Does this PR introduce any risks? For example, consider risks like hard to test bugs, performance regression, potential of data loss.

Describe the risk, its severity, and mitigation for each identified risk. Invite stakeholders and evaluate how to proceed before merging.

- [ ] [See some risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx)
- [ ] ...





<!--ONMERGE {"backportTargets":["8.19"]} ONMERGE-->


Diff:
diff --git a/config/serverless.security.search_ai_lake.yml b/config/serverless.security.search_ai_lake.yml
index 08f89c6694d29..e0e8049094fbe 100644
--- a/config/serverless.security.search_ai_lake.yml
+++ b/config/serverless.security.search_ai_lake.yml
@@ -9,6 +9,8 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siem.description: null
+  siemV2.description: null
 
 ## Agentless deployment by default
 xpack.fleet.agentless.isDefault: true
diff --git a/x-pack/platform/plugins/shared/features/common/kibana_feature.ts b/x-pack/platform/plugins/shared/features/common/kibana_feature.ts
index d427c28aea575..0fb945fa12904 100644
--- a/x-pack/platform/plugins/shared/features/common/kibana_feature.ts
+++ b/x-pack/platform/plugins/shared/features/common/kibana_feature.ts
@@ -46,7 +46,7 @@ export interface KibanaFeatureConfig {
   /**
    * An optional description that will appear as subtext underneath the feature name
    */
-  description?: string;
+  description?: string | null;
 
   /**
    * The category for this feature.
diff --git a/x-pack/platform/plugins/shared/features/server/config.test.ts b/x-pack/platform/plugins/shared/features/server/config.test.ts
index dcf8597858e68..1a2779b1c47ac 100644
--- a/x-pack/platform/plugins/shared/features/server/config.test.ts
+++ b/x-pack/platform/plugins/shared/features/server/config.test.ts
@@ -39,7 +39,7 @@ describe('config schema', () => {
       ConfigSchema.validate(
         {
           overrides: {
-            featureA: { name: 'new name', hidden: true },
+            featureA: { name: 'new name', description: 'new description', hidden: true },
             featureB: {
               order: 100,
               category: 'management',
@@ -73,6 +73,7 @@ describe('config schema', () => {
       Object {
         "overrides": Object {
           "featureA": Object {
+            "description": "new description",
             "hidden": true,
             "name": "new name",
           },
@@ -114,6 +115,27 @@ describe('config schema', () => {
     `);
   });
 
+  it('can override `description` when it is `null`', () => {
+    expect(
+      ConfigSchema.validate(
+        {
+          overrides: {
+            featureA: { description: null },
+          },
+        },
+        { serverless: true }
+      )
+    ).toMatchInlineSnapshot(`
+      Object {
+        "overrides": Object {
+          "featureA": Object {
+            "description": null,
+          },
+        },
+      }
+    `);
+  });
+
   it('properly validates category override', () => {
     for (const category of Object.keys(DEFAULT_APP_CATEGORIES)) {
       expect(
diff --git a/x-pack/platform/plugins/shared/features/server/config.ts b/x-pack/platform/plugins/shared/features/server/config.ts
index c4941b0eef90e..496c97411bb88 100644
--- a/x-pack/platform/plugins/shared/features/server/config.ts
+++ b/x-pack/platform/plugins/shared/features/server/config.ts
@@ -34,6 +34,7 @@ export const ConfigSchema = schema.object({
         schema.object({
           hidden: schema.maybe(schema.boolean()),
           name: schema.maybe(schema.string({ minLength: 1 })),
+          description: schema.maybe(schema.nullable(schema.string({ minLength: 1 }))),
           category: schema.maybe(
             schema.string({
               validate(categoryName) {
diff --git a/x-pack/platform/plugins/shared/features/server/feature_registry.ts b/x-pack/platform/plugins/shared/features/server/feature_registry.ts
index 8e2de38ecbfe5..90d6bb67fa2fa 100644
--- a/x-pack/platform/plugins/shared/features/server/feature_registry.ts
+++ b/x-pack/platform/plugins/shared/features/server/feature_registry.ts
@@ -123,6 +123,10 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      if (typeof featureOverride.description !== 'undefined') {
+        feature.description = featureOverride.description;
+      }
+
       if (featureOverride.category) {
         feature.category = DEFAULT_APP_CATEGORIES[featureOverride.category];
       }
diff --git a/x-pack/solutions/security/packages/features/src/product_features_keys.ts b/x-pack/solutions/security/packages/features/src/product_features_keys.ts
index e6b1c1e5733f0..67704a0d78aac 100644
--- a/x-pack/solutions/security/packages/features/src/product_features_keys.ts
+++ b/x-pack/solutions/security/packages/features/src/product_features_keys.ts
@@ -30,6 +30,10 @@ export enum ProductFeatureSecurityKey {
    * running endpoint security
    */
   endpointHostManagement = 'endpoint_host_management',
+  /**
+   * Enables access to Endpoint host isolation and release actions
+   */
+  endpointHostIsolation = 'endpoint_host_isolation',
   /**
    * Enables endpoint policy views that enables user to manage endpoint security policies
    */
diff --git a/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts b/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts
index 63d010ce7c274..54617d8c0ec67 100644
--- a/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts
+++ b/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts
@@ -111,6 +111,10 @@ export const securityDefaultProductFeaturesConfig: DefaultSecurityProductFeature
     },
   },
 
+  [ProductFeatureSecurityKey.endpointHostIsolation]: {
+    subFeatureIds: [SecuritySubFeatureId.hostIsolation],
+  },
+
   [ProductFeatureSecurityKey.endpointHostManagement]: {
     subFeatureIds: [SecuritySubFeatureId.endpointList],
   },
diff --git a/x-pack/solutions/security/packages/features/src/security/v1_features/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/security/v1_features/kibana_sub_features.ts
index 8d3c9b4a36a2c..b72220e2a57d8 100644
--- a/x-pack/solutions/security/packages/features/src/security/v1_features/kibana_sub_features.ts
+++ b/x-pack/solutions/security/packages/features/src/security/v1_features/kibana_sub_features.ts
@@ -689,7 +689,7 @@ const endpointExceptionsSubFeature = (): SubFeatureConfig => ({
  */
 export const getSecurityBaseKibanaSubFeatureIds = (
   { experimentalFeatures }: SecurityFeatureParams // currently un-used, but left here as a convenience for possible future use
-): SecuritySubFeatureId[] => [SecuritySubFeatureId.hostIsolation];
+): SecuritySubFeatureId[] => [];
 
 /**
  * Defines all the Security Assistant subFeatures available.
diff --git a/x-pack/solutions/security/packages/features/src/security/v2_features/kibana_sub_features.ts b/x-pack/solutions/security/packages/features/src/security/v2_features/kibana_sub_features.ts
index d698572ae652e..3e50442dfcdff 100644
--- a/x-pack/solutions/security/packages/features/src/security/v2_features/kibana_sub_features.ts
+++ b/x-pack/solutions/security/packages/features/src/security/v2_features/kibana_sub_features.ts
@@ -756,7 +756,7 @@ const globalArtifactManagementSubFeature = (): SubFeatureConfig => ({
  */
 export const getSecurityV2BaseKibanaSubFeatureIds = (
   { experimentalFeatures }: SecurityFeatureParams // currently un-used, but left here as a convenience for possible future use
-): SecuritySubFeatureId[] => [SecuritySubFeatureId.hostIsolation];
+): SecuritySubFeatureId[] => [];
 
 /**
  * Defines all the Security Assistant subFeatures available.
diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts b/x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
index 6f774f6b5da31..02077ffa6b3b9 100644
--- a/x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
+++ b/x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
@@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
   },
   [ProductLine.security]: {
     search_ai_lake: [],
@@ -33,6 +34,7 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.notes,
       ProductFeatureKey.endpointHostManagement,
       ProductFeatureKey.endpointPolicyManagement,
+      ProductFeatureKey.endpointHostIsolation,
     ],
     complete: [
       ProductFeatureKey.detections,
@@ -40,6 +42,7 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.notes,
       ProductFeatureKey.endpointHostManagement,
       ProductFeatureKey.endpointPolicyManagement,
+      ProductFeatureKey.endpointHostIsolation,
       ProductFeatureKey.advancedInsights,
       ProductFeatureKey.assistant,
       ProductFeatureKey.attackDiscovery,
diff --git a/x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts b/x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts
index 1ba7e639ecca6..c7b5ba1308232 100644
--- a/x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts
+++ b/x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts
@@ -34,8 +34,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
         ])}`,
         '--csp.strict=false',
         '--csp.warnLegacyBrowsers=false',
-        '--xpack.features.overrides.securitySolutionTimeline.hidden=true',
-        '--xpack.features.overrides.securitySolutionNotes.hidden=true',
       ],
     },
     testRunner: SecuritySolutionConfigurableCypressTestRunner,
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/ai4dsoc/privileges/security_privileges.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/ai4dsoc/privileges/security_privileges.cy.ts
index 48ce1eb4cbabe..3c25cadf15c32 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/ai4dsoc/privileges/security_privileges.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/ai4dsoc/privileges/security_privileges.cy.ts
@@ -6,8 +6,13 @@
  */
 
 import {
-  NOTES_SUB_PRIVILEGE,
-  TIMELINE_SUB_PRIVILEGE,
+  ATTACK_DISCOVERY_FEATURE,
+  CASES_FEATURE,
+  ELASTIC_AI_ASSISTANT_FEATURE,
+  MACHINE_LEARNING_FEATURE,
+  NOTES_FEATURE,
+  SECURITY_FEATURE,
+  TIMELINE_FEATURE,
 } from '../../../screens/custom_roles/assign_to_space_flyout';
 import { login } from '../../../tasks/login';
 import { visit } from '../../../tasks/navigation';
@@ -21,11 +26,31 @@ describe('Custom role creation', { tags: '@serverless' }, () => {
   });
 
   describe('Security privileges', () => {
-    it('should not show `Timelines` and `Notes` sub-privilege', () => {
+    it('should not show `Security` sub-privileges', () => {
       selectAllSpaces();
-      // should not have timeline/notes sub-privileges
-      cy.get(TIMELINE_SUB_PRIVILEGE).should('not.exist');
-      cy.get(NOTES_SUB_PRIVILEGE).should('not.exist');
+      // should not have Security sub-privileges
+      cy.get(SECURITY_FEATURE).should('exist');
+      cy.get(SECURITY_FEATURE).click();
+      cy.get(`${SECURITY_FEATURE} button.euiAccordion__arrow`).should('not.exist');
+    });
+
+    it('should not show `Timelines` and `Notes` features', () => {
+      selectAllSpaces();
+      // should not have Timeline/Notes sub-privileges
+      cy.get(TIMELINE_FEATURE).should('not.exist');
+      cy.get(NOTES_FEATURE).should('not.exist');
+    });
+
+    it('should show `Cases`, `Machine Learning`, `Elastic AI Assistant` and `Attack discovery` features', () => {
+      selectAllSpaces();
+      // should have Cases sub-privilege
+      cy.get(CASES_FEATURE).should('exist');
+      // should have Machine Learning sub-privilege
+      cy.get(MACHINE_LEARNING_FEATURE).should('exist');
+      // should have Elastic AI Assistant sub-privilege
+      cy.get(ELASTIC_AI_ASSISTANT_FEATURE).should('exist');
+      // should have Attack Discovery sub-privilege
+      cy.get(ATTACK_DISCOVERY_FEATURE).should('exist');
     });
   });
 });
diff --git a/x-pack/test/security_solution_cypress/cypress/screens/custom_roles/assign_to_space_flyout.ts b/x-pack/test/security_solution_cypress/cypress/screens/custom_roles/assign_to_space_flyout.ts
index 79e6e4cd266fc..55d025fc40b23 100644
--- a/x-pack/test/security_solution_cypress/cypress/screens/custom_roles/assign_to_space_flyout.ts
+++ b/x-pack/test/security_solution_cypress/cypress/screens/custom_roles/assign_to_space_flyout.ts
@@ -8,10 +8,19 @@
 export const SPACE_SELECTOR_COMBO_BOX = '[data-test-subj="spaceSelectorComboBox"]';
 
 // Privileges
-export const SECURITY_PRIVILEGE = '[data-test-subj="featureCategory_securitySolution"]';
+export const SECURITY_CATEGORY = '[data-test-subj="featureCategory_securitySolution"]';
 
 // Sub-privileges
-export const TIMELINE_SUB_PRIVILEGE =
+export const SECURITY_FEATURE = '[data-test-subj="featureCategory_securitySolution_siemV2"]';
+
+export const CASES_FEATURE =
+  '[data-test-subj="featureCategory_securitySolution_securitySolutionCasesV3"]';
+export const MACHINE_LEARNING_FEATURE = '[data-test-subj="featureCategory_securitySolution_ml"]';
+export const ELASTIC_AI_ASSISTANT_FEATURE =
+  '[data-test-subj="featureCategory_securitySolution_securitySolutionAssistant"]';
+export const ATTACK_DISCOVERY_FEATURE =
+  '[data-test-subj="featureCategory_securitySolution_securitySolutionAttackDiscovery"]';
+export const TIMELINE_FEATURE =
   '[data-test-subj="featureCategory_securitySolution_securitySolutionTimeline"]';
-export const NOTES_SUB_PRIVILEGE =
+export const NOTES_FEATURE =
   '[data-test-subj="featureCategory_securitySolution_securitySolutionNotes"]';
diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/select_all_spaces.ts b/x-pack/test/security_solution_cypress/cypress/tasks/select_all_spaces.ts
index 1ff7a6d1101df..ae4891cb21f3d 100644
--- a/x-pack/test/security_solution_cypress/cypress/tasks/select_all_spaces.ts
+++ b/x-pack/test/security_solution_cypress/cypress/tasks/select_all_spaces.ts
@@ -7,7 +7,7 @@
 
 import {
   SPACE_SELECTOR_COMBO_BOX,
-  SECURITY_PRIVILEGE,
+  SECURITY_CATEGORY,
 } from '../screens/custom_roles/assign_to_space_flyout';
 import { ASSIGN_TO_SPACE_BUTTON } from '../screens/custom_roles/custom_role_page';
 
@@ -20,5 +20,5 @@ export const selectAllSpaces = (): void => {
   cy.get(SPACE_SELECTOR_COMBO_BOX).type('{enter}');
 
   // expand security privileges
-  cy.get(SECURITY_PRIVILEGE).click();
+  cy.get(SECURITY_CATEGORY).click();
 };


Reviews:
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:10:54Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:15:48Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:16:54Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:20:05Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-08T16:17:38Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T16:45:52Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-09T08:08:58Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T08:37:55Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T08:46:30Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-09T08:47:30Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-09T08:50:18Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T08:51:07Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T09:01:12Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T08:31:06Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T09:38:19Z
user: login: tomsonpl
body: Tested locally, looks good 👍 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T10:17:21Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T14:19:52Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T14:20:24Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T14:37:21Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T14:39:41Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T14:45:26Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T14:47:21Z
user: login: semd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T15:02:37Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T15:04:39Z
user: login: vgomez-el
body: LGTM!
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T16:23:56Z
user: login: tomsonpl
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:34:34Z
user: login: semd
body: LGTM! thanks @ashokaditya 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:38:55Z
user: login: azasypkin
body: The way of hiding the feature description in the feature table feels wrong to me, we should find another way.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T10:10:20Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-14T10:52:21Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-14T13:36:31Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-14T13:37:25Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-14T14:44:22Z
user: login: azasypkin
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T15:24:41Z
user: login: kc13greiner
body: Heya! Just a couple questions. Please see below!
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T16:27:33Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T06:58:21Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T13:45:38Z
user: login: kc13greiner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T16:38:03Z
user: login: kc13greiner
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T16:38:27Z
user: login: kc13greiner
body: Thank you for the changes ( I added 1 additional nit to fix) LGTM!
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T16:38:58Z
user: login: ashokaditya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T17:49:31Z
user: login: copilot-pull-request-reviewer[bot]
body: 

Copilot reviewed 14 out of 14 changed files in this pull request and generated no comments.


<details>
<summary>Comments suppressed due to low confidence (3)</summary>

**x-pack/solutions/security/packages/features/src/security/v2_features/kibana_sub_features.ts:759**
* [nitpick] Consider updating the inline comment or function documentation to remove any remaining reference to 'hostIsolation', clarifying that no sub-features are returned.
```
): SecuritySubFeatureId[] => [];
```
**x-pack/solutions/security/packages/features/src/security/v1_features/kibana_sub_features.ts:692**
* [nitpick] Consider updating the inline comment or documentation to remove references to 'hostIsolation' to avoid confusion with the current empty array return.
```
): SecuritySubFeatureId[] => [];
```
**x-pack/test/security_solution_cypress/cypress/tasks/select_all_spaces.ts:22**
* [nitpick] Consider updating the comment to reflect the new variable name (SECURITY_CATEGORY), e.g., 'expand security category', for clarity.
```
    // expand security privileges
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T11:02:31Z
user: login: azasypkin
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T11:05:51Z
user: login: rudolf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T15:03:09Z
user: login: jloleysens
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T15:03:42Z
user: login: semd
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T15:10:41Z
user: login: rudolf
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T15:31:04Z
user: login: stephmilovic
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T21:40:07Z

Review comments:
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.alertsSummary,
       ProductFeatureKey.configurations,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these addons are available in ai_soc product line
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: semd
body: ```suggestion
    // neither of these tiers are available in ai_soc product line
```
created_at: 2025-04-08T15:10:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -34,6 +34,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
         ])}`,
         '--csp.strict=false',
         '--csp.warnLegacyBrowsers=false',
+        '--xpack.features.overrides.siemV2.hidden=true',
         '--xpack.features.overrides.securitySolutionTimeline.hidden=true',
         '--xpack.features.overrides.securitySolutionNotes.hidden=true',
path: x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts
user: login: semd
body: Also, I still don't get why we need to duplicate these overrides:
```ts
        '--xpack.features.overrides.securitySolutionTimeline.hidden=true',
        '--xpack.features.overrides.securitySolutionNotes.hidden=true',
```
The test server should already have that setup from the tier config (`config/serverless.security.search_ai_lake.yml`)
created_at: 2025-04-08T15:15:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: Why do we need to hide this?
created_at: 2025-04-08T15:16:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: This will obfuscate the value of the main Security feature in the roles UI. What is the goal of this task?
created_at: 2025-04-08T15:20:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: ashokaditya
body: It is so that we hide `security` sub privileges in the roles UI for ai4soc. Correct?
created_at: 2025-04-08T16:17:38Z
author_association: MEMBER
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: This hides the entire _Security_ feature, not only the sub-features. Is that intentional?

Also, the feature (and sub-features) may be granted to the role anyway, even if they are hidden. Could you link the issue or describe the purpose of these changes?
created_at: 2025-04-08T16:45:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: ashokaditya
body: No it doesn't hide the entire Security feature (as you see in the screenshot) it hides only the security sub-feature that has privileges such as host isolation, response actions, trusted apps etc.

Here's the [parent issue](https://github.com/elastic/security-team/issues/11781) and a [breakdown issue ](https://github.com/elastic/security-team/issues/12040)

created_at: 2025-04-09T08:08:58Z
author_association: MEMBER
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: I see, you want to hide the features:
<img width="754" alt="Captura de pantalla 2025-04-09 a les 10 29 02" src="https://github.com/user-attachments/assets/be3bdaf5-524f-4186-bf09-6a4c4a36386c" />
<img width="754" alt="Captura de pantalla 2025-04-09 a les 10 30 47" src="https://github.com/user-attachments/assets/14ff101b-6939-43f3-90ce-0cf1b9858a4b" />

created_at: 2025-04-09T08:37:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: https://github.com/elastic/security-team/issues/11781#issuecomment-2788825208
created_at: 2025-04-09T08:46:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: ashokaditya
body: Oh I see, it's a "feature" like you call it and not sub-feature. 

I actually see it as Security "feature" (not category)  with a list of sub-features within it, one of which is a Security "sub-feature" with list of "privileges". Same with Management feature and a list of privileges listed under it.

But either way the idea is to hide the Security "feature" (sub-feature as I call it).
created_at: 2025-04-09T08:47:30Z
author_association: MEMBER
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: ashokaditya
body: Oh okay I see what you mean with the alerts not working as the Security feature controls other areas of security as well. I'll then go ahead and try and hide the "sub-feature" privilege (same as in your screenshots)
created_at: 2025-04-09T08:50:18Z
author_association: MEMBER
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: Okay, I did not make up these names, it's the Kibana Security framework. Let's name things correctly so everybody is on the same page. Could you update the PR title and description?
created_at: 2025-04-09T08:51:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,8 +7,9 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siemV2.hidden: true
path: config/serverless.security.search_ai_lake.yml
user: login: semd
body: > Oh okay I see what you mean with the alerts not working as the Security feature controls other areas of security as well. I'll then go ahead and try and hide the "sub-feature" privilege (same as in your screenshots)

Okay, but keep in mind that _hiding_ and _disabling_ are different things. If you only hide it, like you did with `siemV2` here, the feature may still be granted to the role without the user noticing, same with sub-features.

If you want to make sure that any custom role has these sub-features, we need to do the same as we did with `Timeline` and `Notes`: shape the Kibana feature config differently depending on the ProductFeatureKey
created_at: 2025-04-09T09:01:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: ashokaditya
body: This logic is to hide description for feature added in https://github.com/elastic/kibana/pull/147709 and updated in https://github.com/elastic/kibana/pull/192273
created_at: 2025-04-11T08:31:06Z
author_association: MEMBER
diff_hunk: @@ -34,6 +34,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
         ])}`,
         '--csp.strict=false',
         '--csp.warnLegacyBrowsers=false',
+        '--xpack.features.overrides.siemV2.hidden=true',
         '--xpack.features.overrides.securitySolutionTimeline.hidden=true',
         '--xpack.features.overrides.securitySolutionNotes.hidden=true',
path: x-pack/test/security_solution_cypress/ai4dsoc_serverless_config.ts
user: login: ashokaditya
body: removed 
created_at: 2025-04-11T09:38:19Z
author_association: MEMBER
diff_hunk: @@ -59,12 +62,14 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.endpointPolicyProtections,
       ProductFeatureKey.endpointArtifactManagement,
       ProductFeatureKey.endpointExceptions,
+      ProductFeatureKey.endpointHostIsolation,
     ],
     complete: [
       ProductFeatureKey.endpointPolicyProtections,
       ProductFeatureKey.endpointArtifactManagement,
       ProductFeatureKey.endpointExceptions,
       ProductFeatureKey.endpointHostIsolationExceptions,
+      ProductFeatureKey.endpointHostIsolation,
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: semd
body: Why are they duplicated in the `ProductLine.endpoint` add-on? They are already included in the `ProductLine.security` base PLI.
created_at: 2025-04-11T14:19:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: semd
body: Actually, the `ProductLine.aiSoc` add-on will be available for _essentials_ (not sure _complete_) eventually, right? 
created_at: 2025-04-11T14:20:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -59,12 +62,14 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.endpointPolicyProtections,
       ProductFeatureKey.endpointArtifactManagement,
       ProductFeatureKey.endpointExceptions,
+      ProductFeatureKey.endpointHostIsolation,
     ],
     complete: [
       ProductFeatureKey.endpointPolicyProtections,
       ProductFeatureKey.endpointArtifactManagement,
       ProductFeatureKey.endpointExceptions,
       ProductFeatureKey.endpointHostIsolationExceptions,
+      ProductFeatureKey.endpointHostIsolation,
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: ashokaditya
body: removed the duplicates
created_at: 2025-04-11T14:37:21Z
author_association: MEMBER
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: ashokaditya
body: Maybe, but from the UX and discussions so far it looks like ai4Soc does not have those tiers at all.
created_at: 2025-04-11T14:39:41Z
author_association: MEMBER
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: semd
body: I thought the plan was to, eventually, be able to add the `ai4Soc` add-on to the _essentials_ tier, to add AI features to it. Has the plan changed?
created_at: 2025-04-11T14:45:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: semd
body: Maybe you are confusing `ai4Soc` add-on with the `searchAiLake` tier? 
created_at: 2025-04-11T14:47:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -111,6 +111,11 @@ export const securityDefaultProductFeaturesConfig: DefaultSecurityProductFeature
     },
   },
 
+  // Endpoint Essentials/Complete tiers
path: x-pack/solutions/security/packages/features/src/security/product_feature_config.ts
user: login: semd
body: This file should be tier-agnostic; this information is already in the `pli_config.ts`
created_at: 2025-04-11T15:02:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -111,6 +111,11 @@ export const securityDefaultProductFeaturesConfig: DefaultSecurityProductFeature
     },
   },
 
+  // Endpoint Essentials/Complete tiers
path: x-pack/solutions/security/packages/features/src/security/product_feature_config.ts
user: login: ashokaditya
body: Got it! I'll remove the comment
created_at: 2025-04-11T15:04:39Z
author_association: MEMBER
diff_hunk: @@ -22,8 +22,9 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = {
       ProductFeatureKey.configurations,
       ProductFeatureKey.externalDetections,
     ],
-    essentials: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
-    complete: [ProductFeatureKey.attackDiscovery, ProductFeatureKey.assistant],
+    // neither of these tiers are available in ai_soc product line
+    essentials: [],
+    complete: [],
path: x-pack/solutions/security/plugins/security_solution_serverless/common/pli/pli_config.ts
user: login: tomsonpl
body: @semd you're right 👍 `ai_soc` will be available in `essentials/complete` in the future.

This comment sums up the current and the next phases: https://github.com/elastic/security-team/issues/11781#issuecomment-2701518004


created_at: 2025-04-14T08:34:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: azasypkin
body: >[!CAUTION]
> Hmm, `feature.description` and sub-feature privileges are two separate things. With this change I won't be able to add a description to my feature if it doesn't have sub-feature privileges, right? If I read the code correctly, then representation of this feature will be broken with this change: https://github.com/elastic/kibana/blob/a1a0d3462dfd7aff84f15eeb4448d1448e73a29e/x-pack/platform/plugins/shared/entity_manager/server/plugin.ts#L85-L122
>
> If your code controls whether or not this feature has sub-features and the feature description depends on the presence of these sub-features, why can't you also omit or rewrite the description if you omit sub-feature privilege registration?
>
> Also, `feature.description && feature.description.length > 0`, is there any case when `feature.description` is truthy, but has a zero length (if not, then `feature.description.length > 0` might not be needed)?
created_at: 2025-04-14T09:54:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: ashokaditya
body: You are right @azasypkin. I've reverted the change.
created_at: 2025-04-14T10:52:21Z
author_association: MEMBER
diff_hunk: @@ -7,8 +7,10 @@ xpack.features.overrides:
   ### The following features are Security features hidden in Role management UI for this specific tier.
   securitySolutionTimeline.hidden: true
   securitySolutionNotes.hidden: true
+  siem.description: ' '
+  siemV2.description: ' '
path: config/serverless.security.search_ai_lake.yml
user: login: ashokaditya
body: overriding description for security feature in search ai lake tier
created_at: 2025-04-14T13:36:31Z
author_association: MEMBER
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: ashokaditya
body: We talked offline and agreed on overriding the description. 15eab834a31dd5c85bffbba27245dc31611c0ba7
created_at: 2025-04-14T13:37:25Z
author_association: MEMBER
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: ashokaditya
body: @azasypkin I've updated the PR description with some reasoning for going with the override approach for hiding security feature description. 

cc @semd ☝🏼 
created_at: 2025-04-14T14:44:22Z
author_association: MEMBER
diff_hunk: @@ -37,6 +37,14 @@ export const FeatureTableCell = ({ feature, className }: Props) => {
     );
   }
 
+  const showFeatureDescription = React.useMemo(
+    () =>
+      feature.description &&
+      feature.description.length > 0 &&
+      feature.getSubFeaturePrivileges().length > 0,
path: x-pack/platform/packages/private/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx
user: login: azasypkin
body: Great, thanks 👍 
created_at: 2025-04-14T15:24:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
+      if (typeof featureOverride.description !== 'undefined') {
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: kc13greiner
body: Question: What is the reason for doing this so far downstream? Could this sort of logic be handled in the feature registration of the plugin that it is required for?
created_at: 2025-04-14T16:22:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -39,7 +39,7 @@ describe('config schema', () => {
       ConfigSchema.validate(
         {
           overrides: {
-            featureA: { name: 'new name', hidden: true },
+            featureA: { name: 'new name', description: 'new description', hidden: true },
path: x-pack/platform/plugins/shared/features/server/config.test.ts
user: login: kc13greiner
body: If this logic does stay in this plugin, tests should be added for the new `null` case
created_at: 2025-04-14T16:23:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
+      if (typeof featureOverride.description !== 'undefined') {
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: ashokaditya
body: @kc13greiner Thanks for the review. Currently at the [plugin level](https://github.com/elastic/kibana/blob/44f072bbe5c5edc6ebf2ab50f0e70bbd4a47e7fd/x-pack/solutions/security/plugins/security_solution_serverless/server/plugin.ts#L79) we select the feature keys to show and that sets the [feature config from the security package](https://github.com/elastic/kibana/blob/main/x-pack/solutions/security/packages/features/src/security/product_feature_config.ts).  If we want to set description of the features at the plugin level then we need to pass each product feature config at the plugin level. So yes it can be done at plugin setup stage, but it would need a lot of code changes/refactoring to sort it out.

For now this approach of being able to override the feature description seems the best and simplest (similar to `name` property) given the scope of the work cut out for Apr 28th.

cc @semd @YulNaumenko Let me know if you think otherwise or I got anything incorrect above.
created_at: 2025-04-15T06:58:21Z
author_association: MEMBER
diff_hunk: @@ -39,7 +39,7 @@ describe('config schema', () => {
       ConfigSchema.validate(
         {
           overrides: {
-            featureA: { name: 'new name', hidden: true },
+            featureA: { name: 'new name', description: 'new description', hidden: true },
path: x-pack/platform/plugins/shared/features/server/config.test.ts
user: login: ashokaditya
body: done
created_at: 2025-04-15T13:45:38Z
author_association: MEMBER
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: kc13greiner
body: Nit: Please remove this line.
created_at: 2025-04-15T16:38:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: kc13greiner
body: *to keep the comment about the functionality more generic
created_at: 2025-04-15T16:38:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: ashokaditya
body: done
created_at: 2025-04-15T17:49:31Z
author_association: MEMBER
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
+      if (typeof featureOverride.description !== 'undefined') {
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: rudolf
body: I'm concerned about the complexity of introducing all these config level overrides and the disconnect it introduces with two sources of truth: 1) the plugin API calls and 2) different product tier configuration files

Has there been any discussions around the level of effort it would require to register feature descriptions and hidden attributes programatically? It sounds like the only reason this approach has been rejected is due to time constraints.
created_at: 2025-04-16T15:03:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -123,6 +123,12 @@ export class FeatureRegistry {
         feature.name = featureOverride.name;
       }
 
+      // We are allowing null values for description to be able to remove the description from the feature.
+      // The override is used in serverless.security.search_ai_lake.yml
+      if (typeof featureOverride.description !== 'undefined') {
path: x-pack/platform/plugins/shared/features/server/feature_registry.ts
user: login: rudolf
body: Approving for now, follow-up refactoring work will be done after Apr 28 and tracked in https://github.com/elastic/kibana/issues/218463
created_at: 2025-04-16T15:30:54Z
author_association: CONTRIBUTOR

PR comments:
user: login: elasticmachine
created_at: 2025-04-08T07:29:28Z
body: Pinging @elastic/security-defend-workflows (Team:Defend Workflows)
author_association: CONTRIBUTOR
user: login: ashokaditya
created_at: 2025-04-14T08:03:43Z
body: /ci
author_association: MEMBER
user: login: elasticmachine
created_at: 2025-04-16T17:35:57Z
body: ## :yellow_heart: Build succeeded, but was flaky
* [Buildkite Build](https://buildkite.com/elastic/kibana-pull-request/builds/293793)
* Commit: ef3c9fb2685e8503d140e2546925054b09431d6d

### Failed CI Steps
* [Jest Integration Tests #3](https://buildkite.com/elastic/kibana-pull-request/builds/293793#01963f10-8c92-4d10-a603-e33985619acc)

### Metrics [[docs](https://www.elastic.co/guide/en/kibana/master/ci-metrics.html)]
#### Page load bundle
> Size of the bundles that are downloaded on every page load. Target size is below 100kb


| id | [before](https://github.com/elastic/kibana/commit/f00f83715c8787033c7904c0794350f847900bfe) | [after](https://github.com/elastic/kibana/commit/ef3c9fb2685e8503d140e2546925054b09431d6d) | diff |
| --- | --- | --- | --- |
| `securitySolution` | 89.2KB | 89.2KB | +50.0B |
| `securitySolutionEss` | 33.5KB | 33.6KB | +50.0B |
| `securitySolutionServerless` | 48.3KB | 48.3KB | +34.0B |
| total |  |  | +134.0B |



### History
* :yellow_heart: [Build #293632](https://buildkite.com/elastic/kibana-pull-request/builds/293632) was flaky 09e10a26f9bd11b8128554937a39b8f7150d94d8
* :broken_heart: [Build #293551](https://buildkite.com/elastic/kibana-pull-request/builds/293551) failed a8d0ff0a5319cf33e5bdd615f0d367ce0d54342a
* :broken_heart: [Build #293529](https://buildkite.com/elastic/kibana-pull-request/builds/293529) failed 448d39f3fa545789293b53f5556e042c1e7bb908
* :broken_heart: [Build #293399](https://buildkite.com/elastic/kibana-pull-request/builds/293399) failed d6254594e6cebe8ea27af0226746b46e061c90b0
* :broken_heart: [Build #293312](https://buildkite.com/elastic/kibana-pull-request/builds/293312) failed 84412b660f1976eae18f2a481110455395249cfd
* :broken_heart: [Build #293251](https://buildkite.com/elastic/kibana-pull-request/builds/293251) failed 64099c7e6f65d0beef03fd943b35d85b5098b86f

cc @ashokaditya

<!--buildkite-pr-comment-kibana-pull-request
{"builds":[{"buildStatus":{"state":"passed","success":true,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293793","number":293793,"commit":"ef3c9fb2685e8503d140e2546925054b09431d6d"},{"buildStatus":{"state":"passed","success":true,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293632","number":293632,"commit":"09e10a26f9bd11b8128554937a39b8f7150d94d8"},{"buildStatus":{"state":"failing","success":false,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293551","number":293551,"commit":"a8d0ff0a5319cf33e5bdd615f0d367ce0d54342a"},{"buildStatus":{"state":"failing","success":false,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293529","number":293529,"commit":"448d39f3fa545789293b53f5556e042c1e7bb908"},{"buildStatus":{"state":"failed","success":false,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293399","number":293399,"commit":"d6254594e6cebe8ea27af0226746b46e061c90b0"},{"buildStatus":{"state":"failed","success":false,"hasRetries":true,"hasNonPreemptionRetries":true},"url":"https://buildkite.com/elastic/kibana-pull-request/builds/293312","number":293312,"commit":"84412b660f1976eae18f2a481110455395249cfd"}],"number":293793}
buildkite-pr-comment-->
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-05-30T08:48:41Z
body: Starting backport for target branches: 8.19

https://github.com/elastic/kibana/actions/runs/15342953504
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-05-30T08:48:41Z
body: Starting backport for target branches: 8.19

https://github.com/elastic/kibana/actions/runs/15342953499
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-05-30T08:54:49Z
body: ## 💔 All backports failed

| Status | Branch | Result |
|:------:|:------:|:------|
|❌|8.19|**Backport failed because of merge conflicts**<br><br>You might need to backport the following PRs to 8.19:<br> - [[Fleet] Introduce new config setting `xpack.fleet.agentless.isDefault` to set agentless deployment by default (#216535)](https://github.com/elastic/kibana/pull/216535)|

### Manual backport
To create the backport manually run:
```
node scripts/backport --pr 217210
```

### Questions ?
Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport)

<!--- Backport version: 9.6.6 -->
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-05-30T08:54:52Z
body: ## 💔 All backports failed

| Status | Branch | Result |
|:------:|:------:|:------|
|❌|8.19|**Backport failed because of merge conflicts**<br><br>You might need to backport the following PRs to 8.19:<br> - [[Fleet] Introduce new config setting `xpack.fleet.agentless.isDefault` to set agentless deployment by default (#216535)](https://github.com/elastic/kibana/pull/216535)|

### Manual backport
To create the backport manually run:
```
node scripts/backport --pr 217210
```

### Questions ?
Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport)

<!--- Backport version: 9.6.6 -->
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-06-02T08:48:41Z
body: Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a `backport:*` label or prevent reminders by adding the `backport:skip` label.
You can also create backports manually by running `node scripts/backport --pr 217210` locally
cc: @ashokaditya
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-06-03T08:48:46Z
body: Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a `backport:*` label or prevent reminders by adding the `backport:skip` label.
You can also create backports manually by running `node scripts/backport --pr 217210` locally
cc: @ashokaditya
author_association: CONTRIBUTOR
user: login: kibanamachine
created_at: 2025-06-04T08:49:06Z
body: Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a `backport:*` label or prevent reminders by adding the `backport:skip` label.
You can also create backports manually by running `node scripts/backport --pr 217210` locally
cc: @ashokaditya
author_association: CONTRIBUTOR
user: login: ashokaditya
created_at: 2025-06-05T07:43:32Z
body: ## 💚 All backports created successfully

| Status | Branch | Result |
|:------:|:------:|:------|
|✅|8.19|[<img src="https://img.shields.io/github/pulls/detail/state/elastic/kibana/222745">](https://github.com/elastic/kibana/pull/222745)|

Note: Successful backport PRs will be merged automatically after passing CI.

### Questions ?
Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport)

<!--- Backport version: 10.0.0 -->
author_association: MEMBER
user: login: kibanamachine
created_at: 2025-06-05T09:48:52Z
body: Friendly reminder: Looks like this PR hasn’t been backported yet.
To create automatically backports add a `backport:*` label or prevent reminders by adding the `backport:skip` label.
You can also create backports manually by running `node scripts/backport --pr 217210` locally
cc: @ashokaditya
author_association: CONTRIBUTOR
user: login: ashokaditya
created_at: 2025-06-06T08:25:44Z
body: ## 💚 All backports created successfully

| Status | Branch | Result |
|:------:|:------:|:------|
|✅|8.19|[<img src="https://img.shields.io/github/pulls/detail/state/elastic/kibana/222933">](https://github.com/elastic/kibana/pull/222933)|

Note: Successful backport PRs will be merged automatically after passing CI.

### Questions ?
Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport)

<!--- Backport version: 10.0.0 -->
author_association: MEMBER