diff --git a/content/admin/managing-accounts-and-repositories/managing-repositories-in-your-enterprise/managing-custom-properties-for-repositories-in-your-enterprise.md b/content/admin/managing-accounts-and-repositories/managing-repositories-in-your-enterprise/managing-custom-properties-for-repositories-in-your-enterprise.md index ca200db9da70..b3b8d557c030 100644 --- a/content/admin/managing-accounts-and-repositories/managing-repositories-in-your-enterprise/managing-custom-properties-for-repositories-in-your-enterprise.md +++ b/content/admin/managing-accounts-and-repositories/managing-repositories-in-your-enterprise/managing-custom-properties-for-repositories-in-your-enterprise.md @@ -31,6 +31,17 @@ People with read permissions to a repository can view the custom property values Additionally, organization owners can search for repositories in their organization by custom property values. See [AUTOTITLE](/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization#searching-and-filtering-repositories-by-custom-property-values). +{% ifversion ghec %} +## About custom property suggestions + +> [!NOTE] +> {% data reusables.organizations.custom-property-suggestions-public-preview %} + +When you create a single-select or multi-select property, {% data variables.product.prodname_copilot_short %} can suggest allowed values for the property definition. Select a suggestion to add it to the list of allowed values. + +This feature is available with {% data variables.copilot.copilot_business_short %} or {% data variables.copilot.copilot_enterprise_short %}. By default, suggestions are enabled for enterprise-level properties and each organization can decide whether to enable suggestions. Enterprise owners can instead enable or disable suggestions everywhere with the **Repository custom property suggestions** policy. See [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-enterprise-policies). +{% endif %} + ## Adding custom properties You can add custom properties to your enterprise to make those properties available in all of your organizations. @@ -38,7 +49,10 @@ You can add custom properties to your enterprise to make those properties availa {% data reusables.enterprise-accounts.access-enterprise %} 1. In the left sidebar, under "Policies", click **Custom properties**. 1. To add a new custom property, in the upper-right corner, click **New property**. -1. Enter a name, description, and type for the custom property. The name must be unique across all of your organizations, can't contain spaces, and cannot exceed 75 characters in length. +1. Enter a name, description, and type for the custom property. The name must be unique across all of your organizations, can't contain spaces, and cannot exceed 75 characters in length.{% ifversion ghec %} + + If you selected a single select or multi select type, {% data variables.product.prodname_copilot_short %} can suggest allowed values for the property definition. Select **{% octicon "check" aria-label="Accept suggestion" %} Accept suggestion** to add it to the list of allowed values.{% endif %} + 1. Optionally, select **Allow repository actors to set this property**. When enabled, repository users and apps with the repository-level `custom properties` fine-grained permission will be able to set and update the property value for their repository. Additionally, any actor creating a repository can set the property on the repository. 1. Optionally, select **Require this property for all repositories** and add a default value. This means that you require that all repositories in your enterprise have a value for this property. Repositories that don’t have an explicit value for this property will inherit the default value. {% data reusables.organizations.custom-properties-required-values %} diff --git a/content/code-security/concepts/code-scanning/ai-powered-security-detections.md b/content/code-security/concepts/code-scanning/ai-powered-security-detections.md index 1de37f973a1b..675c340e2dab 100644 --- a/content/code-security/concepts/code-scanning/ai-powered-security-detections.md +++ b/content/code-security/concepts/code-scanning/ai-powered-security-detections.md @@ -75,6 +75,6 @@ You do not need to select a model to enable AI Scan. * **Enterprise**: The **AI Scan** policy under "Code Security" controls whether organizations can enable the feature. See [AUTOTITLE](/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-policies-for-code-security-and-analysis-for-your-enterprise#enforcing-a-policy-to-manage-ai-scan-in-your-enterprises-repositories). * **Organization**: The **AI Scan** setting under "Code scanning" enables AI Scan for eligible repositories in the organization where {% data variables.product.prodname_code_scanning %} is enabled. See [AUTOTITLE](/code-security/how-tos/secure-at-scale/configure-organization-security/establish-complete-coverage/configure-global-settings#enabling-ai-scan). -* **Repository**: For an organization-owned repository, the **AI Scan** toggle under "Code scanning" lets repository administrators opt out when AI Scan is enabled for the organization. For an eligible public repository owned by a personal account, the toggle enables or disables AI Scan directly. +* **Repository**: For an organization-owned repository, the **AI Scan for pull requests** toggle under "Code scanning" lets repository administrators opt out when AI Scan is enabled for the organization. For an eligible public repository owned by a personal account, the toggle enables or disables AI Scan directly. You can use the REST API to manage the organization or repository `ai-scan` setting. See [AUTOTITLE](/rest/code-scanning/code-scanning#get-the-ai-scan-setting-for-an-organization). diff --git a/content/copilot/concepts/agents/copilot-cli/understanding-local-sandboxing.md b/content/copilot/concepts/agents/copilot-cli/understanding-local-sandboxing.md index 07cea5583c6f..274c0199f5f0 100644 --- a/content/copilot/concepts/agents/copilot-cli/understanding-local-sandboxing.md +++ b/content/copilot/concepts/agents/copilot-cli/understanding-local-sandboxing.md @@ -111,7 +111,7 @@ You can grant extra read/write or read-only paths, deny paths, and change other ## Enterprise-managed policies -If you get {% data variables.product.prodname_copilot_short %} through an enterprise-owned organization, an administrator can enforce a filesystem policy through managed settings. Managed settings act as a restrictive baseline: they can require sandboxing, add denied paths, and limit which paths you are allowed to grant. Where a managed setting applies, the `/sandbox config` dialog shows it as a locked **(managed)** value, and `/sandbox policy` reflects it in the resolved policy. If the effective policy permits sandbox bypass, a user can explicitly disable sandboxing for the rest of the current session from an active bypass permission prompt. This session opt-out does not loosen the saved policy. +If you get {% data variables.product.prodname_copilot_short %} through an enterprise-owned organization, an administrator can enforce a filesystem policy through managed settings. Managed settings act as a restrictive baseline: they can require sandboxing, add denied paths, and limit which paths you are allowed to grant. Where a managed setting applies, the `/sandbox config` dialog shows it as a locked **(managed)** value, and `/sandbox policy` reflects it in the resolved policy. If the effective policy permits sandbox bypass, a user can explicitly disable sandboxing for the rest of the current session, either from an active bypass permission prompt or by running `/sandbox disable`. This session opt-out does not loosen the saved policy. Unlike most settings, where a single source wins, the sandbox policy is composed from every source in force at once. Managed settings can arrive through more than one channel simultaneously—server-managed, MDM, and file-based—and these combine with each other, and with your own settings, in the **most restrictive** direction rather than one source overriding another: a required toggle stays on, denied paths from all sources add up, and the paths you are allowed to grant can only be narrowed. For more information, see [AUTOTITLE](/copilot/reference/enterprise-administrators/enterprise-managed-settings#sandbox). diff --git a/content/copilot/how-tos/cloud-and-local-sandboxes/configuring-local-sandbox-settings.md b/content/copilot/how-tos/cloud-and-local-sandboxes/configuring-local-sandbox-settings.md index ed336b745a2f..4ff11183a735 100644 --- a/content/copilot/how-tos/cloud-and-local-sandboxes/configuring-local-sandbox-settings.md +++ b/content/copilot/how-tos/cloud-and-local-sandboxes/configuring-local-sandbox-settings.md @@ -50,7 +50,7 @@ The **Allow sandbox bypass** setting controls what happens when {% data variable * **On (default)**: If a command fails inside the sandbox, you are prompted to allow {% data variables.product.prodname_copilot_short %} to run the command outside the sandbox. Your response to this prompt applies to this specific attempt to run the command. Optionally, you can choose to disable the sandbox for the rest of the session (if permitted by your enterprise), or you can enter an instruction for {% data variables.product.prodname_copilot_short %} to work on instead. * **Off**: If {% data variables.product.prodname_copilot_short %} can't run a command successfully in the sandbox, it stops working on the task and reports the failure. -If enterprise managed settings set `sandbox.allowBypass` to `false`, you cannot approve individual commands to run outside the sandbox or disable sandboxing for the rest of the session. If managed settings require sandboxing but the effective policy permits bypass, you can disable sandboxing only from an active bypass permission prompt, not through ordinary settings or `/sandbox disable`. +If enterprise managed settings set `sandbox.allowBypass` to `false`, you cannot approve individual commands to run outside the sandbox or disable sandboxing for the rest of the session. If managed settings require sandboxing but the effective policy permits bypass, you cannot turn sandboxing off through ordinary settings, but you can disable it for the rest of the current session—either from an active bypass permission prompt or by running `/sandbox disable`—without loosening the saved policy. ## Configuring authentication settings diff --git a/content/copilot/how-tos/cloud-and-local-sandboxes/using-local-sandboxing.md b/content/copilot/how-tos/cloud-and-local-sandboxes/using-local-sandboxing.md index f163e5637098..6bbf5a7a7693 100644 --- a/content/copilot/how-tos/cloud-and-local-sandboxes/using-local-sandboxing.md +++ b/content/copilot/how-tos/cloud-and-local-sandboxes/using-local-sandboxing.md @@ -20,7 +20,7 @@ docsTeamMetrics: Sandboxing is currently an experimental feature. To use it, start {% data variables.copilot.copilot_cli_short %} with the `‑‑experimental` command line option, or enter `/experimental on` during a session. -When you enable local sandboxing, {% data variables.copilot.copilot_cli_short %} runs most of the commands and tools it invokes on your behalf inside an operating-system sandbox. After you enable local sandboxing, it is used for all your {% data variables.copilot.copilot_cli_short %} sessions until you disable it, or turn it off for a specific session. If enterprise managed settings require sandboxing, ordinary configuration, the `--no-sandbox` command line option, and the `/sandbox disable` command cannot disable it. However, if the effective policy permits sandbox bypass, you can explicitly disable sandboxing for the rest of the current session from an active bypass permission prompt. +When you enable local sandboxing, {% data variables.copilot.copilot_cli_short %} runs most of the commands and tools it invokes on your behalf inside an operating-system sandbox. After you enable local sandboxing, it is used for all your {% data variables.copilot.copilot_cli_short %} sessions until you disable it, or turn it off for a specific session. If enterprise managed settings require sandboxing, ordinary configuration and the `--no-sandbox` command line option cannot disable it. However, if the effective policy permits sandbox bypass, you can explicitly disable sandboxing for the rest of the current session, either from an active bypass permission prompt or by running `/sandbox disable`. This session opt-out does not loosen the saved policy. By default, sandboxed commands and tools can write within your current working directory and temporary folders. Your user profile (home) directory, along with system and tool locations are read-only. Other disk locations are blocked. In a Git repository, the rest of the repository above your current working directory is readable but not writable. Access to your local and private network is permitted, as is outbound internet access. @@ -38,7 +38,7 @@ You manage local sandboxing from within a {% data variables.copilot.copilot_cli_ | `/sandbox policy` | Show the effective filesystem policy for the current directory—the paths that are readable, writable, or blocked, and the network access in force. For more information, see [AUTOTITLE](/copilot/concepts/agents/copilot-cli/understanding-local-sandboxing). | | `/sandbox config` | Open the interactive settings interface. Entering `/sandbox` on its own does the same thing. For more information, see [AUTOTITLE](/copilot/how-tos/cloud-and-local-sandboxes/configuring-local-sandbox-settings). | | `/sandbox enable` | Turn local sandboxing on. See [Enabling local sandboxing](#enabling-local-sandboxing). | -| `/sandbox disable` | Turn local sandboxing off. If enterprise managed settings require sandboxing, this is refused. See [Disabling local sandboxing](#disabling-local-sandboxing). | +| `/sandbox disable` | Turn local sandboxing off. If enterprise managed settings require sandboxing, this is refused unless the effective policy permits sandbox bypass, in which case it disables sandboxing for the rest of the current session only. See [Disabling local sandboxing](#disabling-local-sandboxing). | ## Enabling local sandboxing @@ -60,7 +60,7 @@ After you enable local sandboxing, it continues to be used for the current and f ## Disabling local sandboxing -If enterprise managed settings require sandboxing, `/sandbox disable` is refused. If the effective policy permits sandbox bypass, you can instead explicitly disable sandboxing for the rest of the current session from an active bypass permission prompt. +If enterprise managed settings require sandboxing, `/sandbox disable` is refused unless the effective policy permits sandbox bypass. When bypass is permitted, running `/sandbox disable`—or responding to an active bypass permission prompt—disables sandboxing for the rest of the current session only, without loosening the saved policy. To stop using local sandboxing, enter the following command in an interactive {% data variables.copilot.copilot_cli_short %} session: @@ -84,7 +84,7 @@ copilot --sandbox -p "PROMPT" ## Running a single command outside the sandbox -When a command needs broader access than the sandbox allows, {% data variables.product.prodname_copilot_short %} can request to run that single command outside the sandbox. You are shown a confirmation prompt describing the command. You can approve that single command, keep it inside the sandbox, or disable sandboxing for the rest of the current session. The session opt-out is available only while responding to an active bypass prompt and only if the effective policy permits sandbox bypass. +When a command needs broader access than the sandbox allows, {% data variables.product.prodname_copilot_short %} can request to run that single command outside the sandbox. You are shown a confirmation prompt describing the command. You can approve that single command, keep it inside the sandbox, or disable sandboxing for the rest of the current session. Disabling sandboxing for the session is available only if the effective policy permits sandbox bypass. When it is permitted, you can also do this at any time by running `/sandbox disable`. This behavior is enabled by default and can be turned off in your sandbox settings. diff --git a/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md b/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md index 58159677d4f9..52a82f44f621 100644 --- a/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md +++ b/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md @@ -52,6 +52,7 @@ These metrics appear in the impact dashboard, which groups users into adoption c | Metric | Description | |:--|:--| | Engagement trends | How the organization's adoption cohort mix and pull request throughput (total pull requests merged per month) have changed over the last six months. | +| Feature engagement | Number of active users who engaged with each included {% data variables.product.prodname_copilot_short %} feature on at least two distinct days during the inclusive 28-day window. | | Adoption cohort distribution | Share of licensed users grouped into each adoption phase (Passive users, Phase 1, Phase 2, Phase 3) for the period. Passive users correspond to the `No Cohort` value in the API. | | Adoption multiplier | Compares engaged users (Phase 1, 2, or 3) against passive users on code shipped (pull requests merged per user per month) and time to merge pull requests, to show the relative impact of deeper {% data variables.product.prodname_copilot_short %} adoption. | | Recommendations | Suggested actions, such as configuring {% data variables.copilot.copilot_cloud_agent %} or enabling {% data variables.copilot.copilot_code-review_short %}, based on the organization's current cohort distribution. | @@ -80,8 +81,8 @@ These fields appear in the exported NDJSON reports and in the {% data variables. Reports come in different shapes depending on their scope and granularity, so the fields available in a record depend on which report it comes from: * **Per-user reports** (`*-users-1-day` and `*-users-28-day`) contain one record per user, including `user_id`, `user_login`, `ai_credits_used`, the `used_*` indicators, and `ai_adoption_phase`. They do not contain active-user counts, `pull_requests`, or `totals_by_ai_adoption_phase`. -* **Aggregated reports** (`enterprise-1-day` and `org-1-day`) contain one aggregated record per enterprise or organization, including active-user counts, `pull_requests`, and `totals_by_ai_adoption_phase`. They do not contain `user_id`, `user_login`, or the `used_*` indicators. -* **28-day reports** (`enterprise-28-day` and `org-28-day`) wrap an array of daily aggregated records in a `day_totals` field, with the reporting window at the top level. +* **Aggregated reports** (`enterprise-1-day` and `organization-1-day`) contain one aggregated record per enterprise or organization, including active-user counts, `pull_requests`, and `totals_by_ai_adoption_phase`. They do not contain `user_id`, `user_login`, or the `used_*` indicators. +* **28-day aggregate reports** (`enterprise-28-day` and `organization-28-day`) wrap an array of daily aggregated records in a `day_totals` field, with the reporting window and optional `copilot_feature_engagement` object at the top level. The object is not included in per-user reports. * **User-teams reports** (`*-user-teams-1-day`) map users to the teams they belong to, so you can construct team-level metrics. * **Repository-level reports** (`*-repos-1-day`) contain one record per repository with pull request activity for the day, including pull requests created by {% data variables.copilot.copilot_cloud_agent %} and reviewed by {% data variables.copilot.copilot_code-review_short %}. @@ -126,6 +127,16 @@ Per-user reports contain one record per user for the reporting period. The 28-da | `used_copilot_code_review_active` | `boolean` | Yes | Whether the user actively engaged with {% data variables.copilot.copilot_code-review_short %} that day. A user is considered active if they manually requested a {% data variables.product.prodname_copilot_short %} review, or applied a {% data variables.product.prodname_copilot_short %} review suggestion. Null when there is no {% data variables.copilot.copilot_code-review_short %} signal for the user that day. | | `used_copilot_code_review_passive` | `boolean` | Yes | Whether the user had {% data variables.product.prodname_copilot_short %} automatically assigned to review their pull request that day, without actively engaging with the review. Null when there is no {% data variables.copilot.copilot_code-review_short %} signal for the user that day. | | `ai_adoption_phase` | `object` | No | The user's AI adoption phase for the day. Always present; defaults to the "No Cohort" phase. See [AI adoption phase fields](#ai-adoption-phase-fields). | +| `distinct_skill_use_count` | `integer` | Yes | Number of different skill identifiers with recorded activity for the user. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_custom_agent_use_count` | `integer` | Yes | Number of different custom agent identifiers with recorded activity for the user. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_mcp_use_count` | `integer` | Yes | Number of different Model Context Protocol (MCP) server identifiers with recorded connection activity for the user. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_slash_cmd_use_count` | `integer` | Yes | Number of different slash command identifiers with recorded activity for the user. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_plugin_use_count` | `integer` | Yes | Number of different plugin identifiers with recorded activity for the user. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_skill` | `array` | Yes | Top skills used in {% data variables.copilot.copilot_cli_short %}, ordered by interaction count. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_custom_agent` | `array` | Yes | Top custom agents used in {% data variables.copilot.copilot_cli_short %}, ordered by interaction count. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_mcp` | `array` | Yes | MCP servers with the most connection and reconnection attempts in {% data variables.copilot.copilot_cli_short %}, ordered by interaction count. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_slash_cmd` | `array` | Yes | Top slash commands used in {% data variables.copilot.copilot_cli_short %}, ordered by interaction count. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_plugin` | `array` | Yes | Top plugins used in {% data variables.copilot.copilot_cli_short %}, ordered by interaction count. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | | `totals_by_cli` | `object` | Yes | CLI-specific metrics for the user. Omitted when the user had no {% data variables.copilot.copilot_cli_short %} usage that day. See [{% data variables.copilot.copilot_cli_short %} metrics fields](#copilot-cli-metrics-fields). | | `totals_by_copilot_app` | `object` | Yes | {% data variables.copilot.github_copilot_app_short %} metrics for the user. Omitted when the user had no {% data variables.copilot.github_copilot_app_short %} usage that day. See [{% data variables.copilot.github_copilot_app_short %} metrics fields](#copilot-app-metrics-fields). | | `totals_by_3rd_party_agent` | `array` | Yes | Per-agent usage metrics for recognized {% data variables.copilot.agent_apps %}. Omitted when the user had no recognized {% data variables.copilot.agent_app %} activity during the reporting period. See [{% data variables.copilot.agent_apps_caps %} metrics fields](#agent-apps-metrics-fields). | @@ -171,6 +182,16 @@ Activity totals and breakdowns: | `loc_suggested_to_delete_sum` | `integer` | No | Aggregated lines of code suggested to delete for the day. Same definition as the per-user field. | | `loc_added_sum` | `integer` | No | Aggregated lines of code added for the day. Same definition as the per-user field. | | `loc_deleted_sum` | `integer` | No | Aggregated lines of code deleted for the day. Same definition as the per-user field. | +| `distinct_skill_use_count` | `integer` | Yes | Number of different skill identifiers with recorded activity across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_custom_agent_use_count` | `integer` | Yes | Number of different custom agent identifiers with recorded activity across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_mcp_use_count` | `integer` | Yes | Number of different MCP server identifiers with recorded connection activity across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_slash_cmd_use_count` | `integer` | Yes | Number of different slash command identifiers with recorded activity across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `distinct_plugin_use_count` | `integer` | Yes | Number of different plugin identifiers with recorded activity across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_skill` | `array` | Yes | Top skills used in {% data variables.copilot.copilot_cli_short %} across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_custom_agent` | `array` | Yes | Top custom agents used in {% data variables.copilot.copilot_cli_short %} across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_mcp` | `array` | Yes | MCP servers with the most connection and reconnection attempts in {% data variables.copilot.copilot_cli_short %} across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_slash_cmd` | `array` | Yes | Top slash commands used in {% data variables.copilot.copilot_cli_short %} across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | +| `totals_by_plugin` | `array` | Yes | Top plugins used in {% data variables.copilot.copilot_cli_short %} across the enterprise or organization. See [{% data variables.copilot.copilot_cli_short %} customization fields](#copilot-cli-customization-fields-api-only). | | `totals_by_ide` | `array` | No | Aggregated per-IDE activity breakdown. See [Activity breakdown objects](#activity-breakdown-objects). | | `totals_by_feature` | `array` | No | Aggregated per-feature activity breakdown. See [Activity breakdown objects](#activity-breakdown-objects). | | `totals_by_language_feature` | `array` | No | Aggregated language-and-feature activity breakdown. See [Activity breakdown objects](#activity-breakdown-objects). | @@ -184,15 +205,31 @@ Activity totals and breakdowns: ### 28-day report fields -The 28-day reports (`enterprise-28-day` and `org-28-day`) are wrappers: they carry the reporting window at the top level and an array of daily aggregated records. +The 28-day aggregate reports (`enterprise-28-day` and `organization-28-day`) are wrappers: they carry the reporting window at the top level and an array of daily aggregated records. | Field | Type | Nullable | Description | |:--|:--|:--|:--| | `report_start_day` | `string` | No | First calendar day of the 28-day reporting window, in `YYYY-MM-DD` format. | | `report_end_day` | `string` | No | Last calendar day of the 28-day reporting window, in `YYYY-MM-DD` format. | | `created_at` | `string` | No | Timestamp (ISO 8601) when the report was generated. | +| `copilot_feature_engagement` | `object` | Yes | Rolling feature engagement for the 28-day window. Included only in enterprise and organization aggregate reports. Null or absent when the optional calculation is unavailable or the report predates this field. See [{% data variables.product.prodname_copilot_short %} feature engagement fields](#copilot-feature-engagement-fields). | | `day_totals` | `array` | No | Array of daily aggregated records. Each entry has the same fields as an aggregated 1-day report. See [Aggregated enterprise and organization report fields](#aggregated-enterprise-and-organization-report-fields). | +#### {% data variables.product.prodname_copilot_short %} feature engagement fields + +The optional `copilot_feature_engagement` object summarizes the report's rolling active-user population and engagement with seven features. For the `day_totals` entry whose `day` matches `report_end_day`, `copilot_feature_engagement.active_user_count` equals the sum of the mutually exclusive `totals_by_ai_adoption_phase[].users_in_phase_28d` values. + +Counts for individual features overlap because a user can engage with more than one feature. Do not add the `engaged_user_count` values together. The initial feature set reports active and passive {% data variables.copilot.copilot_code-review_short %} as separate features. It does not include {% data variables.copilot.copilot_chat_short %} or {% data variables.product.prodname_vscode_shortname %} Agent. + +{% data variables.copilot.copilot_chat_short %} is planned for a later release after 28 consecutive days of data have been collected and report consumers support the additional entry. + +| Field | Type | Nullable | Description | +|:--|:--|:--|:--| +| `copilot_feature_engagement.active_user_count` | `integer` | No | Nonnegative number of distinct active users in the inclusive 28-day report window. A valid zero-user report sets this field to `0`. | +| `copilot_feature_engagement.totals_by_feature` | `array` | No | Feature engagement counts. The initial array contains exactly one entry for each of these values: `code_completion`, `agent_edit`, `code_review_passive`, `code_review_active`, `cloud_agent`, `copilot_cli`, and `github_app`. A valid zero-user report includes all seven entries with `engaged_user_count` set to `0`. | +| `copilot_feature_engagement.totals_by_feature[].feature` | `string` | No | Feature identifier. In this object, `github_app` represents the {% data variables.copilot.github_copilot_app_short %}. This differs from the `copilot_app` value used in activity breakdown arrays such as `totals_by_feature`. | +| `copilot_feature_engagement.totals_by_feature[].engaged_user_count` | `integer` | No | Nonnegative number of distinct active users who engaged with the feature on at least two distinct days during the inclusive 28-day report window. | + ### User-teams fields These fields appear in the daily user-teams report (available via REST API at the organization and enterprise scopes) and are used to construct team-level metrics by joining with the per-user usage metrics report. For the full join recipe and the endpoint URLs, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/team-level-metrics). @@ -266,6 +303,43 @@ The `totals_by_cli` object contains the following nested fields when {% data var | `totals_by_cli.last_known_cli_version.cli_version` | `string` | No | {% data variables.copilot.copilot_cli_short %} version string. Defaults to `unknown` if no version was detected. | | `totals_by_cli.last_known_cli_version.sampled_at` | `string` | Yes | Timestamp (ISO 8601) when the version was sampled. | +### {% data variables.copilot.copilot_cli_short %} customization fields (API only) + +These metrics give enterprise and organization administrators visibility into which {% data variables.copilot.copilot_cli_short %} automations developers use. Use them to understand adoption, identify enablement gaps, and prioritize the skills, Model Context Protocol (MCP) servers, custom agents, slash commands, and plugins that developers find valuable. + +To access the reports, the {% data variables.product.prodname_copilot_short %} usage metrics policy must be enabled. For policy configuration instructions, see: + +* [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-enterprise-policies#defining-policies-for-your-enterprise) +* [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-organization/manage-policies#enabling-copilot-features-and-models-in-your-organization) + +These fields appear in the following enterprise and organization reports: + +* Per-user 1-day and 28-day reports +* Aggregated 1-day reports +* Each `day_totals` record in aggregated 28-day reports + +Each `totals_by_*` array contains up to five entries with the most recorded activity for its record, ordered from highest to lowest `interaction_count`. The values are event counts, not user counts. An entry's absence from an array does not mean that it had zero usage. Do not use these arrays to calculate exact adoption. + +Recognized first-party names can appear when available. Customer-defined identifiers are not exposed. Skills, custom agents, MCP servers, and plugins identified only by customer-specific hashes are grouped under `other` in the arrays. {% data variables.copilot.copilot_cli_short %} telemetry reports customer-defined slash commands as `custom`, so slash command arrays preserve that value. + +Each array entry contains the name field listed in the table and an integer `interaction_count` field. + +| Array | Name field | What `interaction_count` measures | Distinct-count field | +|:--|:--|:--|:--| +| `totals_by_skill[]` | `skill` | Skill invocations. | `distinct_skill_use_count` | +| `totals_by_custom_agent[]` | `custom_agent` | Custom agent starts. | `distinct_custom_agent_use_count` | +| `totals_by_mcp[]` | `mcp` | Successful or failed MCP server connection and reconnection attempts. Tool calls through an already connected server do not increase this count. | `distinct_mcp_use_count` | +| `totals_by_slash_cmd[]` | `slash_cmd` | Slash command invocations. | `distinct_slash_cmd_use_count` | +| `totals_by_plugin[]` | `plugin` | Skill invocations associated with a plugin. Plugin interactions are a subset of skill interactions. | `distinct_plugin_use_count` | + +Every plugin interaction is already included in `totals_by_skill`, while skill interactions that are not associated with a plugin appear only in skill totals. Do not add plugin and skill interaction counts together. + +The distinct-count fields count different item identifiers with activity, not users or uses. In a per-user record, each different identifier that the user used counts once. In an aggregated enterprise or organization record, each different identifier used by anyone in the scope counts once, regardless of how many users used it. Aggregated distinct counts are not sums of per-user distinct counts. + +Distinct counts retain the full identifier cardinality, including items outside the top-five array. When customer-defined artifacts are grouped under `other`, each hidden identifier still contributes separately to the corresponding distinct count. + +When these fields are present, empty arrays and distinct counts of `0` mean that no matching activity was recorded. The fields can be null or absent when {% data variables.copilot.copilot_cli_short %} customization data isn't available during rollout. + ### {% data variables.copilot.github_copilot_app_short %} metrics fields The `totals_by_copilot_app` object contains the following nested fields when {% data variables.copilot.github_copilot_app_short %} usage is present. It appears in per-user reports and in aggregated enterprise reports; it is omitted or null when the user or enterprise had no {% data variables.copilot.github_copilot_app_short %} activity that day. Unlike `totals_by_cli`, {% data variables.copilot.github_copilot_app_short %} coding activity is also reflected in `totals_by_feature`, `totals_by_model_feature`, `totals_by_language_feature`, and `totals_by_language_model` under the `copilot_app` feature value, and in the top-level code activity and lines-of-code metrics. There is no `last_known_app_version` field. @@ -354,13 +428,29 @@ The per-user `ai_adoption_phase` object contains: | `ai_adoption_phase.phase` | `string` | No | Human-readable phase name. | | `ai_adoption_phase.version` | `string` | No | Version of the adoption-phase model used (for example, `v1`). | -Each entry in the aggregated `totals_by_ai_adoption_phase` array contains: +Each entry in the aggregated `totals_by_ai_adoption_phase` array contains two separate user counts: + +* `total_engaged_users` is the number of users classified into the phase who were active on that individual day. +* `users_in_phase_28d` is the full population classified into the phase using the rolling 28-day window, as of that day. + +Use `users_in_phase_28d` as the population denominator for rolling phase-level calculations. For example, to calculate pull requests merged per user over a 28-day period: + +1. Add the daily `total_pull_requests_merged` values. +1. Add the corresponding daily `users_in_phase_28d` values. +1. Divide the first total by the second, then multiply the result by 28. + +Do not use `total_engaged_users` as the denominator because it includes only users active on an individual day. + +The field does not change the existing `avg_*` fields or their calculations, the phase classification rules, or a user's assigned phase. Neither user-count field identifies individuals. + +When a phase is present in the rolling snapshot but has no activity that day, the report can include a synthesized entry with `total_engaged_users` set to `0`, a positive `users_in_phase_28d`, and all activity metrics set to zero. | Field | Type | Nullable | Description | |:--|:--|:--|:--| | `phase` | `string` | No | Human-readable phase name. | | `phase_number` | `integer` | No | Numeric phase identifier. | -| `total_engaged_users` | `integer` | No | Number of users grouped into this phase for the period. | +| `total_engaged_users` | `integer` | No | Number of users classified into this phase who were active on the day. | +| `users_in_phase_28d` | `integer` | Yes | Complete rolling 28-day population classified into this phase as of the day. A positive value is the measured phase population, and `0` means the phase was measured and had no users. The field is omitted when the day predates this field or the enterprise or organization was absent from the phase snapshot. | | `avg_user_initiated_interactions` | `number` | No | Average user-initiated interactions per user in this phase. | | `avg_code_generation_activities` | `number` | No | Average code generation activities per user in this phase. | | `avg_code_acceptance_activities` | `number` | No | Average code acceptance activities per user in this phase. | diff --git a/content/copilot/reference/copilot-usage-metrics/example-schema.md b/content/copilot/reference/copilot-usage-metrics/example-schema.md index b7778e3aee68..1977434a5cfd 100644 --- a/content/copilot/reference/copilot-usage-metrics/example-schema.md +++ b/content/copilot/reference/copilot-usage-metrics/example-schema.md @@ -13,7 +13,7 @@ category: allowTitleToDifferFromFilename: true --- -The following are example schemas for the user-level, enterprise-level, and repository-level data returned by the {% data variables.product.prodname_copilot_short %} usage metrics endpoints. The actual data returned may vary based on the specific metrics being tracked and the level of aggregation. You can use these examples as a reference for understanding the structure of the data and how to interpret the various fields and metrics included in the API response. +The following examples show schemas for user-, enterprise-, and repository-level data returned by the {% data variables.product.prodname_copilot_short %} usage metrics endpoints. Returned fields vary by metric and aggregation level. Use these examples to understand the response structure and interpret its fields and metrics. ## User-level schema example @@ -28,6 +28,11 @@ The following are example schemas for the user-level, enterprise-level, and repo "code_acceptance_activity_count": 3, "code_generation_activity_count": 3, "day": "2025-10-01", + "distinct_custom_agent_use_count": 2, + "distinct_mcp_use_count": 2, + "distinct_plugin_use_count": 1, + "distinct_skill_use_count": 3, + "distinct_slash_cmd_use_count": 2, "enterprise_id": "1", "loc_added_sum": 32, "loc_deleted_sum": 6, @@ -57,6 +62,13 @@ The following are example schemas for the user-level, enterprise-level, and repo "prompt_tokens_sum": 5400 } }, + "totals_by_custom_agent": [{ + "custom_agent": "general-purpose", + "interaction_count": 4 + }, { + "custom_agent": "other", + "interaction_count": 2 + }], "totals_by_3rd_party_agent": [{ "agent_id": "2246796", "agent_name": "Claude (Anthropic)", @@ -124,7 +136,29 @@ The following are example schemas for the user-level, enterprise-level, and repo "loc_suggested_to_delete_sum": 6 }], "totals_by_language_model": [], + "totals_by_mcp": [{ + "interaction_count": 8, + "mcp": "github-mcp-server" + }, { + "interaction_count": 3, + "mcp": "other" + }], "totals_by_model_feature": [], + "totals_by_plugin": [{ + "interaction_count": 2, + "plugin": "other" + }], + "totals_by_skill": [{ + "interaction_count": 5, + "skill": "other" + }], + "totals_by_slash_cmd": [{ + "interaction_count": 3, + "slash_cmd": "/plan" + }, { + "interaction_count": 1, + "slash_cmd": "custom" + }], "used_agent": false, "used_chat": false, "used_cli": true, @@ -142,7 +176,9 @@ The following are example schemas for the user-level, enterprise-level, and repo }] ``` -Organization per-user reports use the same `totals_by_3rd_party_agent` entry fields and also include `organization_id`. Per-user entries do not include `session_count`. +Organization per-user reports use the same `totals_by_3rd_party_agent` entry fields and also include `organization_id`. In per-user reports, entries in `totals_by_3rd_party_agent` do not include `session_count`. + +The {% data variables.copilot.copilot_cli_short %} customization fields shown in this example appear in both 1-day and 28-day per-user reports. In this example, `used_copilot_code_review_active` and `used_copilot_code_review_passive` are `null` because there was no {% data variables.copilot.copilot_code-review_short %} signal for the user that day. `used_copilot_cloud_agent` and `used_copilot_coding_agent` always carry the same value. @@ -160,6 +196,11 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "daily_active_users" : 2, "daily_passive_copilot_code_review_users" : 0, "day" : "2025-10-01", + "distinct_custom_agent_use_count" : 2, + "distinct_mcp_use_count" : 2, + "distinct_plugin_use_count" : 1, + "distinct_skill_use_count" : 3, + "distinct_slash_cmd_use_count" : 2, "enterprise_id" : "1", "loc_added_sum" : 54, "loc_deleted_sum" : 6, @@ -213,6 +254,7 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "phase" : "Phase 1", "phase_number" : 1, "total_engaged_users" : 1, + "users_in_phase_28d" : 1, "total_pull_requests_merged" : 1 }, { "avg_code_acceptance_activities" : 3.0, @@ -226,9 +268,10 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "avg_pull_requests_review_cycles" : 2.0, "avg_pull_requests_reviewed" : 1.0, "avg_user_initiated_interactions" : 1.0, - "phase" : "Phase 2", - "phase_number" : 2, + "phase" : "Phase 3", + "phase_number" : 3, "total_engaged_users" : 1, + "users_in_phase_28d" : 1, "total_pull_requests_merged" : 1 } ], "totals_by_cli" : { @@ -251,6 +294,13 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "prompt_tokens_sum" : 8600 } }, + "totals_by_custom_agent" : [ { + "custom_agent" : "general-purpose", + "interaction_count" : 7 + }, { + "custom_agent" : "other", + "interaction_count" : 3 + } ], "totals_by_feature" : [ { "code_acceptance_activity_count" : 2, "code_generation_activity_count" : 2, @@ -300,7 +350,29 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "loc_suggested_to_delete_sum" : 6 } ], "totals_by_language_model" : [ ], + "totals_by_mcp" : [ { + "interaction_count" : 12, + "mcp" : "github-mcp-server" + }, { + "interaction_count" : 5, + "mcp" : "other" + } ], "totals_by_model_feature" : [ ], + "totals_by_plugin" : [ { + "interaction_count" : 4, + "plugin" : "other" + } ], + "totals_by_skill" : [ { + "interaction_count" : 9, + "skill" : "other" + } ], + "totals_by_slash_cmd" : [ { + "interaction_count" : 6, + "slash_cmd" : "/plan" + }, { + "interaction_count" : 2, + "slash_cmd" : "custom" + } ], "user_initiated_interaction_count" : 1, "weekly_active_copilot_cloud_agent_users" : 1, "weekly_active_copilot_code_review_users" : 1, @@ -308,6 +380,31 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "weekly_passive_copilot_code_review_users" : 0 } ], "enterprise_id" : "1", + "copilot_feature_engagement" : { + "active_user_count" : 2, + "totals_by_feature" : [ { + "feature" : "code_completion", + "engaged_user_count" : 2 + }, { + "feature" : "agent_edit", + "engaged_user_count" : 1 + }, { + "feature" : "code_review_passive", + "engaged_user_count" : 1 + }, { + "feature" : "code_review_active", + "engaged_user_count" : 1 + }, { + "feature" : "cloud_agent", + "engaged_user_count" : 1 + }, { + "feature" : "copilot_cli", + "engaged_user_count" : 1 + }, { + "feature" : "github_app", + "engaged_user_count" : 1 + } ] + }, "report_end_day" : "2025-10-01", "report_start_day" : "2025-09-04", "etl_id" : "green", @@ -322,6 +419,11 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "daily_active_users" : 2, "daily_passive_copilot_code_review_users" : 0, "day" : "2025-10-01", + "distinct_custom_agent_use_count" : 0, + "distinct_mcp_use_count" : 0, + "distinct_plugin_use_count" : 0, + "distinct_skill_use_count" : 0, + "distinct_slash_cmd_use_count" : 0, "enterprise_id" : "2", "loc_added_sum" : 50, "loc_deleted_sum" : 3, @@ -358,9 +460,10 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "avg_pull_requests_review_cycles" : 0.0, "avg_pull_requests_reviewed" : 0.0, "avg_user_initiated_interactions" : 0.0, - "phase" : "No Cohort", - "phase_number" : 0, + "phase" : "Phase 3", + "phase_number" : 3, "total_engaged_users" : 1, + "users_in_phase_28d" : 1, "total_pull_requests_merged" : 0 }, { "avg_code_acceptance_activities" : 2.0, @@ -377,8 +480,10 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "phase" : "Phase 1", "phase_number" : 1, "total_engaged_users" : 1, + "users_in_phase_28d" : 1, "total_pull_requests_merged" : 0 } ], + "totals_by_custom_agent" : [ ], "totals_by_feature" : [ { "code_acceptance_activity_count" : 1, "code_generation_activity_count" : 2, @@ -428,7 +533,11 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "loc_suggested_to_delete_sum" : 3 } ], "totals_by_language_model" : [ ], + "totals_by_mcp" : [ ], "totals_by_model_feature" : [ ], + "totals_by_plugin" : [ ], + "totals_by_skill" : [ ], + "totals_by_slash_cmd" : [ ], "user_initiated_interaction_count" : 1, "weekly_active_copilot_cloud_agent_users" : 0, "weekly_active_copilot_code_review_users" : 0, @@ -436,6 +545,31 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review "weekly_passive_copilot_code_review_users" : 0 } ], "enterprise_id" : "2", + "copilot_feature_engagement" : { + "active_user_count" : 2, + "totals_by_feature" : [ { + "feature" : "code_completion", + "engaged_user_count" : 2 + }, { + "feature" : "agent_edit", + "engaged_user_count" : 1 + }, { + "feature" : "code_review_passive", + "engaged_user_count" : 1 + }, { + "feature" : "code_review_active", + "engaged_user_count" : 1 + }, { + "feature" : "cloud_agent", + "engaged_user_count" : 1 + }, { + "feature" : "copilot_cli", + "engaged_user_count" : 1 + }, { + "feature" : "github_app", + "engaged_user_count" : 1 + } ] + }, "report_end_day" : "2025-10-01", "report_start_day" : "2025-09-04", "etl_id" : "green", @@ -444,7 +578,11 @@ In this example, `used_copilot_code_review_active` and `used_copilot_code_review } ] ``` -Organization aggregated reports use the same `totals_by_3rd_party_agent` entry fields, including `session_count`, and also include `organization_id`. +In each `totals_by_ai_adoption_phase` entry, `total_engaged_users` is the subset of users active on that day, while `users_in_phase_28d` is the full population classified into the phase using the rolling 28-day window as of that day. + +Organization aggregated reports use the same top-level `copilot_feature_engagement` object, `totals_by_ai_adoption_phase` entry fields, and `totals_by_3rd_party_agent` entry fields, including `session_count`. They also include `organization_id`. + +The {% data variables.copilot.copilot_cli_short %} customization fields shown in `day_totals` apply to enterprise and organization aggregated 28-day reports. They also appear directly in enterprise and organization aggregated 1-day reports. The following user-teams report examples are returned by the `user-teams-1-day` endpoints and are intended to be joined with the per-user usage report on `user_id`, `day`, and the relevant entity id (`organization_id` for the organization scope, `enterprise_id` for the enterprise scope) to derive team-level metrics. For more guidance, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/team-level-metrics). @@ -515,7 +653,11 @@ The following user-teams report examples are returned by the `user-teams-1-day` ## Repository-level schema example -The following repository-level report example is returned in the NDJSON files downloaded from the `repos-1-day` endpoints. Each row represents one repository with pull request activity on the requested day. Both enterprise- and organization-scoped rows populate `organization_id` (the organization that owns each repository). Enterprise-scoped rows also populate `enterprise_id`, and organization-scoped rows populate `enterprise_id` only for organizations owned by an enterprise. For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/copilot-usage-metrics#repository-level-fields-api-only). +The following example shows a repository-level report from an NDJSON file downloaded through a `repos-1-day` endpoint. Each row represents one repository with pull request activity on the requested day. + +Both enterprise- and organization-scoped rows include `organization_id`, which identifies the organization that owns the repository. Enterprise-scoped rows also include `enterprise_id`. Organization-scoped rows include `enterprise_id` only when an enterprise owns the organization. + +For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/copilot-usage-metrics#repository-level-fields-api-only). ```json copy [ diff --git a/content/copilot/reference/copilot-usage-metrics/interpret-copilot-metrics.md b/content/copilot/reference/copilot-usage-metrics/interpret-copilot-metrics.md index 5df91fd6d691..18123e5c7eed 100644 --- a/content/copilot/reference/copilot-usage-metrics/interpret-copilot-metrics.md +++ b/content/copilot/reference/copilot-usage-metrics/interpret-copilot-metrics.md @@ -37,6 +37,25 @@ The "Requests per chat mode" and "Agent adoption" charts show how developers are | Requests per chat mode | Breakdown of chat interactions by mode—Ask, Edit, Plan, or Agent. | A balanced distribution suggests users are exploring multiple capabilities. Heavy use of one mode can highlight where enablement should focus. | | Agent adoption | Percentage of active users who used {% data variables.copilot.copilot_agent_short %}. | Growth over time shows that developers are progressing from basic completions to more advanced {% data variables.product.prodname_copilot_short %} features. | +## Reviewing {% data variables.copilot.copilot_cli_short %} customization adoption with the API + +To assess how developers adopt {% data variables.copilot.copilot_cli_short %} customizations, use the usage metrics API. It reports skills, custom agents, Model Context Protocol (MCP) server connection activity, slash commands, and plugins for enterprises and organizations. The fields appear in per-user and aggregated 1-day reports, per-user 28-day reports, and aggregated 28-day `day_totals`. They are not available in the dashboard. For field definitions, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/copilot-usage-metrics#copilot-cli-customization-fields-api-only). + +`interaction_count` represents a different event for each category: skill invocations, custom agent starts, MCP connection or reconnection attempts, slash command invocations, or plugin-associated skill invocations. These values count activity events, not users. MCP counts include both successful and failed connection attempts, but not tool calls through an already connected server or ongoing server use. Every plugin interaction is already included in skill interaction counts, while skill interactions that are not associated with a plugin appear only in skill totals. Do not add plugin and skill interaction counts together. + +To identify strong adoption signals, look for named customizations that appear in many users' arrays. Each array contains only the five entries with the highest interaction counts for that record. Therefore, do not interpret an absent entry as zero usage or use the arrays to calculate an exact adoption rate. + +Distinct counts show how many different item identifiers had activity. At enterprise and organization scope, an identifier counts once even if many users interacted with it, so do not add per-user distinct counts to reproduce an aggregate value. Compare distinct counts across records or `day_totals` to see whether the variety of customizations with activity is changing. + +| Signal | What it suggests | Suggested action | +|:--|:--|:--| +| A named skill, custom agent, slash command, or plugin has high interaction counts across many users | The customization is broadly useful and may be a good candidate for standardization. | Promote it through internal examples, onboarding materials, or a shared customization library. | +| A named customization appears in the top five for only a few users but has high interaction counts for those users | Observed activity is concentrated among a small group. Other users may have activity outside their top-five entries. | Ask those users to share example workflows. Then use developer feedback or other internal data to assess broader adoption before expanding enablement. | +| Distinct counts are high, but most interactions are grouped under `other` | Developers are using many customer-defined customizations whose names are not exposed in the report. | Review your internal customization sources and catalogs to identify opportunities to consolidate, document, or govern overlapping options. | +| Interaction counts remain low for a skill, custom agent, slash command, or plugin you expect developers to use | Developers may not know that the customization exists or when it is useful. | Improve discoverability with task-focused examples and include the customization in relevant onboarding or enablement sessions. | +| MCP connection activity is higher or lower than expected | Developers may be reconnecting repeatedly, encountering failed connection attempts, or the planned rollout may not have reached the intended audience. Connection counts alone do not show whether developers are actively using MCP tools. | Check your MCP configuration and rollout process, then use other internal data or developer feedback to assess ongoing server use. | +| Adoption grows after an enablement activity | The activity may have helped developers discover useful customizations. | Compare multiple reporting periods and gather developer feedback before deciding whether to expand the activity. | + ## Reviewing model adoption The "Model usage per day" and "Model usage per chat mode" charts help you understand which AI models are most frequently used. diff --git a/content/copilot/reference/enterprise-administrators/enterprise-managed-settings.md b/content/copilot/reference/enterprise-administrators/enterprise-managed-settings.md index 96a55c360283..efdf3aca7709 100644 --- a/content/copilot/reference/enterprise-administrators/enterprise-managed-settings.md +++ b/content/copilot/reference/enterprise-administrators/enterprise-managed-settings.md @@ -275,9 +275,9 @@ Enforces minimum local sandbox restrictions for {% data variables.copilot.copilo The following sub-properties are supported: -* `enabled`: `true` requires sandboxing by default. Users cannot disable it through their configuration, the `--no-sandbox` command line option, or the `/sandbox disable` command. If the effective policy permits bypass, a user can still explicitly disable sandboxing for the rest of the current session from an active sandbox-bypass permission prompt. +* `enabled`: `true` requires sandboxing by default. Users cannot disable it through their configuration or the `--no-sandbox` command line option. If the effective policy permits bypass, a user can still explicitly disable sandboxing for the rest of the current session, either from an active sandbox-bypass permission prompt or by running the `/sandbox disable` command. This session opt-out does not loosen the saved policy. * `failIfUnavailable`: `true`, combined with `enabled: true`, makes the managed sandbox mandatory. If {% data variables.product.prodname_copilot_short %} cannot validate, compile, or enforce the sandbox policy with an available sandbox backend, it blocks model and tool execution instead of allowing commands to fail or run unsandboxed. This property does not enable sandboxing by itself. -* `allowBypass`: `false` prevents both individual commands from running outside the sandbox and users from disabling sandboxing for the rest of the current session from an active sandbox-bypass permission prompt. +* `allowBypass`: `false` prevents individual commands from running outside the sandbox and prevents users from disabling sandboxing for the rest of the current session, whether from an active sandbox-bypass permission prompt or by running `/sandbox disable`. * `addCurrentWorkingDirectory`: `false` prevents {% data variables.copilot.copilot_cli_short %} from automatically adding the current working directory to the sandbox's read/write paths. * `sandboxMcpServers`: `true` requires local MCP servers started by {% data variables.copilot.copilot_cli_short %} to run in the sandbox. Remote MCP servers do not run in the local sandbox. * `sandboxLspServers`: `true` requires language servers started by {% data variables.copilot.copilot_cli_short %} to run in the sandbox. diff --git a/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md b/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md index ddac521d474d..069ab5416257 100644 --- a/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md +++ b/content/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization.md @@ -19,6 +19,20 @@ This article relates to **repository custom properties.** The **visibility** of custom properties matches the visibility of the repository. Custom properties on public repositories can be viewed by anyone, while custom properties on internal or private repositories can be viewed by accounts with `read` permissions to the repository. +{% ifversion fpt or ghec %} + +## About custom property suggestions + +> [!NOTE] +> {% data reusables.organizations.custom-property-suggestions-public-preview %} + +When you create a single select or multi select property, {% data variables.product.prodname_copilot_short %} can suggest allowed values for the property definition. Select a suggestion to add it to the list of allowed values. + +This feature is available with {% data variables.copilot.copilot_business_short %} or {% data variables.copilot.copilot_enterprise_short %}. Organization owners can configure availability with the **Repository custom property suggestions** policy. See [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-organization/manage-policies). + +{% ifversion ghec %}If your organization is part of an enterprise, the enterprise policy determines whether the organization can manage this setting. Enterprise owners can enable or disable suggestions for every organization. See [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-enterprise-policies).{% endif %} +{% endif %} + ## Allowed characters {% data reusables.repositories.custom-property-allowed-characters %} @@ -35,7 +49,10 @@ You can add custom properties to your organization and set values for those prop 1. To add a new custom property, click **New property** in the upper right corner. 1. In the "Name" field, type the name you'd like to use for your custom property. The name can't contain spaces, and cannot exceed 75 characters in length. 1. Optionally, in the "Description" field, fill in a description of your custom property. -1. Under "Type", select the type of property you'd like to add. This can either be a text string, a single select field, a multi select field, {% ifversion ghes > 3.20 %}a URL, {% endif %}or a true/false boolean. +1. Under "Type", select the type of property you'd like to add. This can either be a text string, a single select field, a multi select field, {% ifversion ghes > 3.20 %}a URL, {% endif %}or a true/false boolean.{% ifversion fpt or ghec %} + + If you selected a single select or multi select type, {% data variables.product.prodname_copilot_short %} can suggest allowed values for the property definition. Select **{% octicon "check" aria-label="Accept suggestion" %} Accept suggestion** to add it to the list of allowed values.{% endif %} + 1. Optionally, you can select **Allow repository actors to set this property**. When enabled, repository users and apps with the repository-level "custom properties" fine-grained permission will be able to set and update the property value for their repository. 1. Optionally, you can select **Require this property for all repositories** and add a default value. This means that you require that all repositories in your organization have a value for this property. Repositories that don’t have an explicit value for this property will inherit the default value. {% data reusables.organizations.custom-properties-required-values %} @@ -74,4 +91,3 @@ You can search for repositories in your organization by custom properties values {% data reusables.user-settings.access_org %} 1. Under your organization name, click **{% octicon "repo" aria-hidden="true" aria-label="repo" %} Repositories**. 1. In the search bar, type `prop` to see a list of all custom properties in your organization, and select the property you'd like to search by. - diff --git a/data/reusables/copilot/usage-metrics-permissions.md b/data/reusables/copilot/usage-metrics-permissions.md index d1eeecef5a89..5c2c0aefa866 100644 --- a/data/reusables/copilot/usage-metrics-permissions.md +++ b/data/reusables/copilot/usage-metrics-permissions.md @@ -1 +1 @@ -Enterprise owners, organization administrators, billing managers, and people with an enterprise custom role with the "View Enterprise {% data variables.product.prodname_copilot_short %} Metrics" permission. +Enterprise owners, enterprise billing managers, organization owners, and people with a custom organization or enterprise role with the "View Organization {% data variables.product.prodname_copilot_short %} Metrics" or "View Enterprise {% data variables.product.prodname_copilot_short %} Metrics" permission. diff --git a/data/reusables/organizations/custom-property-suggestions-public-preview.md b/data/reusables/organizations/custom-property-suggestions-public-preview.md new file mode 100644 index 000000000000..1092f72853cc --- /dev/null +++ b/data/reusables/organizations/custom-property-suggestions-public-preview.md @@ -0,0 +1 @@ +{% data variables.product.prodname_copilot_short %} suggestions for repository custom property definitions are in {% data variables.release-phases.public_preview %}.