diff --git a/content/copilot/how-tos/administer-copilot/manage-for-enterprise/use-managed-settings/get-started.md b/content/copilot/how-tos/administer-copilot/manage-for-enterprise/use-managed-settings/get-started.md
index 252f8f0eaaa6..4f0c25fc288d 100644
--- a/content/copilot/how-tos/administer-copilot/manage-for-enterprise/use-managed-settings/get-started.md
+++ b/content/copilot/how-tos/administer-copilot/manage-for-enterprise/use-managed-settings/get-started.md
@@ -104,9 +104,31 @@ You can override supported properties of the `{% data variables.copilot.managed_
Later, you can add different overrides for other keys and other teams. **For a more complete example**, see [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-enterprise/use-managed-settings/override-settings-for-teams).
-## 4. Check the settings are active
+## 4. Validate and check the settings
-Check that the settings you defined are active for users and overridden for specific teams. In this example, most of your enterprise's {% data variables.product.prodname_copilot_short %} users should find that new conversations in their client start in auto mode. The `special-team` enterprise team should not have this experience.
+Validate your repository-based settings, then confirm that supported clients receive the expected configuration.
+
+### Validate server-managed settings
+
+For server-managed deployments, {% data variables.product.github %} automatically validates the settings in your selected `.github-private` repository. The validator checks the following files:
+
+* `copilot/{% data variables.copilot.managed_setting_file %}`
+* `copilot/{% data variables.copilot.team_mappings_file %}`
+* Any files in `copilot/{% data variables.copilot.team_settings_directory %}` that are referenced in `copilot/{% data variables.copilot.team_mappings_file %}`
+
+To review configuration issues:
+
+{% data reusables.enterprise-accounts.access-enterprise %}
+{% data reusables.enterprise-accounts.ai-controls-tab %}
+1. On the **Agents** tab, find the "Copilot settings validation" section.
+1. Review the errors and warnings. Each issue identifies the affected file and and JSON path.
+1. To fix an issue, update the affected file and commit the change to the default branch of the `.github-private` repository. Then reload the **Agents** page to check the updated configuration.
+
+If the validator finds no issues, the "Copilot settings validation" section isn't displayed. If validation is temporarily unavailable, your existing settings continue to apply. Reload the **Agents** page later to check again.
+
+### Check settings on clients
+
+After checking for validation issues, confirm that your settings are active for users and overridden for specific teams. In this example, new conversations should start in auto mode for most {% data variables.product.prodname_copilot_short %} users in your enterprise. New conversations should not start in auto mode for members of the `special-team` enterprise team.
For server-managed deployments, users on a supported client see the specified settings within about an hour. This includes `copilot/{% data variables.copilot.managed_setting_file %}`, `copilot/{% data variables.copilot.team_mappings_file %}`, and files in `copilot/{% data variables.copilot.team_settings_directory %}`. Restarting the client or signing in again triggers an immediate refresh.
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 809d2ccd008c..42123cb8233c 100644
--- a/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md
+++ b/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md
@@ -252,7 +252,7 @@ Teams with fewer than 5 seated {% data variables.product.prodname_copilot_short
### Repository-level fields (API only)
-Repository-level reports show daily pull request creation, review, merge, and suggestion activity for repositories in an organization or enterprise, including pull requests created by {% data variables.copilot.copilot_cloud_agent %} and reviewed by {% data variables.copilot.copilot_code-review_short %}. Each row represents one repository that had pull request activity on the requested day; repositories with no activity are omitted. These reports focus on pull request lifecycle activity and can contain data even when IDE usage metrics are absent.
+Repository-level reports show daily pull request creation, review, merge, and suggestion activity, plus pull request review stage durations, for repositories in an organization or enterprise, including pull requests created by {% data variables.copilot.copilot_cloud_agent %} and reviewed by {% data variables.copilot.copilot_code-review_short %}. Each row represents one repository that had pull request activity on the requested day; repositories with no activity are omitted. These reports focus on pull request lifecycle activity and can contain data even when IDE usage metrics are absent.
These fields are returned by the daily repository-level report (`repos-1-day`), available via the REST API at the organization and enterprise scopes. For the endpoint URLs, response envelope, permissions, and download workflow, see [AUTOTITLE](/rest/copilot/copilot-usage-metrics). For example rows, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/example-schema#repository-level-schema-example).
@@ -266,6 +266,7 @@ These fields are returned by the daily repository-level report (`repos-1-day`),
| `repo_name` | `string` | No | Repository name. |
| `repo_visibility` | `string` | No | Repository visibility. Possible values are `PRIVATE`, `INTERNAL`, and `PUBLIC`. |
| `pull_requests` | `object` | No | Daily pull request activity for the repository. See [Pull request activity fields](#pull-request-activity-fields). |
+| `pull_request_review_times` | `array` | No | Review stage durations for qualifying pull requests merged in the repository on this day, with one entry per author and reviewer type. Empty when no qualifying pull requests were merged. See [Pull request review time fields](#pull-request-review-time-fields). |
### Activity breakdown objects
@@ -416,6 +417,45 @@ The `pull_requests` object appears in aggregated enterprise and organization rep
| `pull_requests.total_copilot_applied_suggestions` | `integer` | No | Number of pull request review suggestions generated by {% data variables.copilot.copilot_code-review_short %} that were applied on this specific day. |
| `pull_requests.copilot_suggestions_by_comment_type` | `array` | No | Aggregated counts of {% data variables.copilot.copilot_code-review_short %} suggestions, broken down by the assigned comment type (for example, `security` or `bug_risk`). Each entry includes `comment_type`, `total_copilot_suggestions`, and `total_copilot_applied_suggestions`. Always present but can be empty. |
+### Pull request review time fields
+
+The `pull_request_review_times` array appears only in repository-level reports. It breaks down how long merged pull requests spent in three stages of review, so you can see whether pull requests are waiting for a first review, waiting on back-and-forth between reviewers, or waiting to be merged after the final review.
+
+Each entry covers pull requests merged in the repository on this specific day. All durations are attributed to the merge day, even when the reviews happened on earlier days.
+
+**Which pull requests are counted**
+
+A pull request is included when a person opened it, it reached ready for review, and at least one other person reviewed it. Only human reviews are timed. Reviews from {% data variables.copilot.copilot_code-review_short %}, from other bots, and from the pull request author are ignored, so a pull request reviewed by both a person and {% data variables.copilot.copilot_code-review_short %} is still included, with its stages timed from the human reviews. Time spent in draft before the first review is not counted.
+
+A merged pull request is excluded from `pull_request_review_times` when any of the following is true:
+
+* It was created by a bot, including {% data variables.copilot.copilot_cloud_agent %}.
+* It never received a qualifying human review, including pull requests merged without any review.
+* The time it became ready for review is unknown.
+* Its timestamps are out of order. For example, its final review is recorded after its merge.
+
+Exclusions are not reported for individual pull requests. Because `pull_requests.total_merged` counts every pull request merged that day, `pull_request_review_times[].total_merged` is usually lower. Compare the two values to see how many merged pull requests the durations cover.
+
+**Data availability**
+
+* Data builds forward from the release of these fields and is not backfilled.
+* Pull requests that became ready for review before September 21, 2026 are excluded from this array, but still count toward `pull_requests.total_merged`.
+* The array is empty (`[]`) on days when the repository merged no qualifying pull requests. An empty array means no data for that day, not zero minutes.
+
+| Field | Type | Nullable | Description |
+|:--|:--|:--|:--|
+| `pull_request_review_times[].authored_by` | `string` | No | Who opened the pull requests in this entry. Currently always `human`. |
+| `pull_request_review_times[].reviewed_by` | `string` | No | Who reviewed the pull requests in this entry. Currently always `human`. |
+| `pull_request_review_times[].total_merged` | `integer` | No | Number of qualifying pull requests merged in the repository on this specific day. This counts only the pull requests described above, not all merged pull requests. |
+| `pull_request_review_times[].median_minutes_ready_to_first_review` | `number` | No | Median time, in minutes, from the pull request becoming ready for review to its first qualifying review. |
+| `pull_request_review_times[].p90_minutes_ready_to_first_review` | `number` | No | 90th percentile time, in minutes, from the pull request becoming ready for review to its first qualifying review. |
+| `pull_request_review_times[].median_minutes_first_to_final_review` | `number` | No | Median time, in minutes, from the first qualifying review to the final qualifying review.
A pull request with a single qualifying review contributes a duration of `0`, because its first and final reviews are the same event. |
+| `pull_request_review_times[].p90_minutes_first_to_final_review` | `number` | No | 90th percentile time, in minutes, from the first qualifying review to the final qualifying review.
A pull request with a single qualifying review contributes a duration of `0`, because its first and final reviews are the same event. |
+| `pull_request_review_times[].median_minutes_final_review_to_merge` | `number` | No | Median time, in minutes, from the final qualifying review to merge. |
+| `pull_request_review_times[].p90_minutes_final_review_to_merge` | `number` | No | 90th percentile time, in minutes, from the final qualifying review to merge. |
+
+Medians and 90th percentiles are exact values calculated with linear interpolation and rounded to two decimal places.
+
### AI adoption phase fields
{% data variables.product.prodname_copilot_short %} groups users into AI adoption phases based on their activity. Phase information appears in two places: the per-user `ai_adoption_phase` object, and the aggregated `totals_by_ai_adoption_phase` array. For the phase values, see [Breakdown dimension values](#breakdown-dimension-values).
diff --git a/content/copilot/reference/copilot-usage-metrics/example-schema.md b/content/copilot/reference/copilot-usage-metrics/example-schema.md
index c33b7903074f..785dd6ec3906 100644
--- a/content/copilot/reference/copilot-usage-metrics/example-schema.md
+++ b/content/copilot/reference/copilot-usage-metrics/example-schema.md
@@ -662,6 +662,8 @@ The following example shows a repository-level report from an NDJSON file downlo
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.
+The `pull_request_review_times` array is empty when the repository merged no qualifying pull requests that day. For which pull requests are counted, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/copilot-usage-metrics#pull-request-review-time-fields).
+
For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metrics/copilot-usage-metrics#repository-level-fields-api-only).
```json copy
@@ -690,7 +692,8 @@ For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metric
"total_merged_reviewed_by_copilot": 1,
"median_minutes_to_merge_copilot_reviewed": 372.62,
"copilot_suggestions_by_comment_type": []
- }
+ },
+ "pull_request_review_times": []
},
{
"day": "2026-07-14",
@@ -721,7 +724,8 @@ For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metric
"total_copilot_applied_suggestions": 1
}
]
- }
+ },
+ "pull_request_review_times": []
},
{
"day": "2026-07-14",
@@ -758,7 +762,45 @@ For the field reference, see [AUTOTITLE](/copilot/reference/copilot-usage-metric
"total_copilot_applied_suggestions": 1
}
]
- }
+ },
+ "pull_request_review_times": []
+ },
+ {
+ "day": "2026-07-14",
+ "enterprise_id": "1001",
+ "organization_id": "2002",
+ "repo_id": 900000020,
+ "repo_owner_name": "octodemo-metrics",
+ "repo_name": "example-service-epsilon",
+ "repo_visibility": "INTERNAL",
+ "pull_requests": {
+ "total_reviewed": 1,
+ "total_created": 1,
+ "total_created_by_copilot": 0,
+ "total_reviewed_by_copilot": 0,
+ "total_merged": 2,
+ "median_minutes_to_merge": 1368.26,
+ "total_suggestions": 0,
+ "total_applied_suggestions": 0,
+ "total_merged_created_by_copilot": 0,
+ "total_copilot_suggestions": 0,
+ "total_copilot_applied_suggestions": 0,
+ "total_merged_reviewed_by_copilot": 0,
+ "copilot_suggestions_by_comment_type": []
+ },
+ "pull_request_review_times": [
+ {
+ "authored_by": "human",
+ "reviewed_by": "human",
+ "total_merged": 2,
+ "median_minutes_ready_to_first_review": 693.31,
+ "p90_minutes_ready_to_first_review": 1244.14,
+ "median_minutes_first_to_final_review": 0,
+ "p90_minutes_first_to_final_review": 0,
+ "median_minutes_final_review_to_merge": 674.95,
+ "p90_minutes_final_review_to_merge": 1213.66
+ }
+ ]
}
]
```