diff --git a/Dockerfile b/Dockerfile
index 32fd39deaa54..426426a4407f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,7 +8,7 @@
# ---------------------------------------------------------------
# To update the sha:
# https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble
-FROM ghcr.io/github/gh-base-image/gh-base-noble:20251009-110343-g5a525d4e1 AS base
+FROM ghcr.io/github/gh-base-image/gh-base-noble:20251010-155737-g547a87a71 AS base
# Install curl for Node install and determining the early access branch
# Install git for cloning docs-early-access & translations repos
diff --git a/content/billing/how-tos/products/view-productlicense-use.md b/content/billing/how-tos/products/view-productlicense-use.md
index f8af40b952ac..9e1ad6c67ff2 100644
--- a/content/billing/how-tos/products/view-productlicense-use.md
+++ b/content/billing/how-tos/products/view-productlicense-use.md
@@ -112,14 +112,11 @@ To show more detailed information for the top 100 users or organizations consumi
## Downloading usage reports
-Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking.
-
-### General usage reports
+Visit the "Metered Usage" page to access a metered billing report for all products, or navigate to the "Premium request analytics" page for a specialized report tailored for Premium request activity tracking.
1. At the top of the page, click **Get usage report**.
-1. If prompted, specify the report details:
- * Metered usage page: in the dialog displayed, define details of the report that you want to download and click **Email me the report**.
- * Premium request analytics page: the report will contain usage for the last 45 days.
+1. Specify the report details.
+1. Click **Email me the report**.
When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours.
diff --git a/content/billing/reference/billing-reports.md b/content/billing/reference/billing-reports.md
index 779345fd9d62..8c2ae3e5de20 100644
--- a/content/billing/reference/billing-reports.md
+++ b/content/billing/reference/billing-reports.md
@@ -17,25 +17,26 @@ redirect_from:
contentType: reference
---
-The usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount.
+Usage reports show detailed information about your account’s {% data variables.product.github %} usage, including how much of each SKU was used and the resulting billable amount.
-To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use).
+To generate a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
## Report types
-There are three different types of reports.
+The following report types are available.
* Metered usage page:
- * **Summarized metered usage reports**: A summary of usage for all paid products for a maximum period of one year.
- * **Detailed metered usage reports**: A detailed usage report for all paid products for a maximum period of 31 days.
+ * **Summarized usage report**: A summary of usage for all paid products for a maximum period of one year.
+ * **Detailed usage report**: A detailed usage report for all paid products for a maximum period of 31 days.
* Premium request analytics page:
- * **Premium request analytics usage reports**: A detailed, user-based report on usage of premium requests for the last 45 days.
+ * **Premium requests usage report**: A detailed per-user breakdown of premium requests consumed for a maximum period of 31 days.
+ * **Legacy premium request usage report**: A detailed, user-based report of premium request usage for the last 45 days.
-### Summarized metered usage reports
+### Summarized usage report
This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `sku`, `repository`, `cost_center_name`. If the usage report is for an enterprise with organizations, the amounts will be summarized by the organization value as well.
-### Detailed metered usage reports
+### Detailed usage report
The detailed usage report includes the same fields as the summarized report and adds `username` and `workflow_path`.
@@ -43,13 +44,21 @@ This report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amo
{% data reusables.billing.usage-reports-api-limitation %}
-### Premium request analytics usage reports
+### Premium requests usage report
-This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`.
+This report includes additional detail about premium request usage. The report sums the `quantity`, `gross_amount`, `discount_amount`, and `net_amount` fields based on the combination of the following values: `date`, `model`, `username`.
-## Metered usage report fields
+This report contains usage beginning October 01, 2025 00:00 UTC.
-The usage report contains the following fields.
+### Legacy premium request usage report
+
+This report includes each recorded use of a premium request and includes the following fields: `Timestamp`,`User`,`Model`,`Requests Used`,`Exceeds Monthly Quota`, and `Total Monthly Quota`. The time period of the report is the most recent 45 days.
+
+This report will be closing down on December 1, 2025, at which point all premium request usage activity will be available via the Premium requests usage report.
+
+## Usage report fields
+
+The usage reports contain the following fields.
| Field | Description |
|---------------------------|-------------|
@@ -61,37 +70,27 @@ The usage report contains the following fields.
| `applied_cost_per_quantity` | The unit cost of the product SKU. |
| `gross_amount` | The amount of the product SKU that was used. |
| `discount_amount` | The amount of usage that was discounted. Usage that is discounted as part of your account’s included usage is reflected in this field. Also includes discounts for {% data variables.product.prodname_actions %} usage for standard {% data variables.product.github %}-hosted runners in public repositories and for self-hosted runners. |
-| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount`. |
-| `username` | The user associated with the usage, if applicable. Only available in the detailed report. |
+| `net_amount` | The billable amount of usage after applying the `discount_amount`. This is the amount that your account will be billed. `gross_amount - discount_amount = net_amount` |
+| `username` | The user associated with the usage, if applicable.
Not included in the `Summarized usage report`. |
| `organization` | The organization associated with the usage, if applicable. |
| `repository` | The repository associated with the usage, if applicable. |
-| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable. Only available in the detailed report. |
+| `workflow_path` | The path of the {% data variables.product.prodname_actions %} workflow that generated the usage, if applicable.
Only available in the `Detailed usage report` |
| `cost_center_name` | The cost center associated with the usage, if applicable. |
+| `model` | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`.
Only available in the `Premium request usage report` |
+| `exceeds_quota` | Indicates whether the premium request exceeds the user's monthly quota:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed
Only available in the `Premium request usage report` |
+| `total_monthly_quota` | The number of requests included in the user's current plan. {% ifversion fpt or ghec %}See [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises).{% endif %}
Only available in the `Premium request usage report` |
+
+## Receiving the report
+
+Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time.
-### Metered usage report fields that are closing down
+## Metered usage report fields that have closed down
{% data variables.product.github %} aims to minimize changes to the usage report structure, however at times the report structure or fields may change.
-| Closing down | Replacement |
+The following fields have been removed from the usage reports.
+
+| Field | Replacement |
|--------------------|---------------------|
| `usage_at` | Refer to `date` instead. |
| `workflow_name` | Refer to `workflow_path` instead. |
-
-## Premium request analytics usage report fields
-
-{% data reusables.billing.premium-request-analytics-start %}
-
-The premium request analytics report contains the following fields.
-
-| Field | Description |
-|---------------------------|-------------|
-| Timestamp | The full UTC date and time in ISO 18601 format. |
-| User | The {% data variables.product.github %} handle of the user associated with the usage. |
-| Model | The model used. This might be an LLM like `claude-sonnet-4`, or a product-specific model like `Code Review model`.
-| Requests Used | The total number of requests used. |
-| Exceeds Monthly Quota | This field indicates whether the premium request will be billed separately:
- `FALSE`: The request is covered by the monthly quota included in the user's plan.
- `TRUE`: The request exceeds the monthly quota and will be billed |
-| Total Monthly Quota | This field records the total number of requests included in the user's current plan{% ifversion fpt or ghec %}, see [AUTOTITLE](/copilot/concepts/billing/individual-plans) and [AUTOTITLE](/copilot/concepts/billing/organizations-and-enterprises){% endif %}. |
-
-## Receiving the report
-
-Usage reports are sent via email to the default email address associated with your {% data variables.product.github %} account. You can only request one usage report per account at a time.
diff --git a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
index 64e109acb36a..c7714ed7989f 100644
--- a/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
+++ b/content/copilot/concepts/agents/coding-agent/about-coding-agent.md
@@ -144,9 +144,7 @@ Users can include hidden messages in issues assigned to {% data variables.produc
* **{% data variables.copilot.copilot_coding_agent %} only works with repositories hosted on {% data variables.product.github %}**. If your repository is stored using a different code hosting platform, {% data variables.product.prodname_copilot_short %} won't be able to work on it.
* **You cannot select the AI model used by {% data variables.copilot.copilot_coding_agent %}**. A model picker is not available to switch between models, and {% data variables.product.company_short %} reserves the right to change models at any time.
- If you are a {% data variables.copilot.copilot_pro %} or {% data variables.copilot.copilot_pro_plus %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}.
-
- If you are a {% data variables.copilot.copilot_for_business %} or {% data variables.copilot.copilot_enterprise %} subscriber, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.cca_current_model %} by default, or {% data variables.copilot.copilot_claude_sonnet_45 %} if the model has been enabled by an administrator. See [AUTOTITLE](/copilot/concepts/policies).
+ Currently, {% data variables.copilot.copilot_coding_agent %} uses {% data variables.copilot.copilot_claude_sonnet_45 %}.
## Hands-on practice
diff --git a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
index eb5858ce0cb5..3db71dbfd0d6 100644
--- a/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
+++ b/content/copilot/how-tos/manage-and-track-spending/monitor-premium-requests.md
@@ -30,9 +30,8 @@ There are multiple ways to view your premium request usage:
* [View current usage directly within your IDE](#viewing-usage-in-your-ide)
* [Viewing an overview in your Billing and licensing settings](#viewing-an-overview-in-your-billing-and-licensing-settings)
* [View detailed analytics of your usage](#viewing-detailed-analytics-of-your-usage)
-* [Download a usage report for your personal account](#downloading-a-usage-report-for-your-personal-account)
-If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use.
+If you reach your limit for premium requests, you will be notified with a message in each of the {% data variables.product.prodname_copilot_short %} interfaces you use. To download a usage report, see [Downloading usage reports](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
For information about viewing premium request usage for an organization or enterprise, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use).
@@ -67,15 +66,9 @@ You can view an overview of your premium request usage at any time in your "Bill

-### Downloading a usage report for your personal account
+### Downloading a usage report
-Reports include all premium request usage, both within and beyond your allowance.
-
-{% data reusables.user-settings.access_billing_settings_url %}
-1. In the side bar, click **Premium request analytics** to show detailed analytics.
-1. At the top of the page, click **Get usage report** to generate a CSV report of your premium request use for the past 45 days.
-
-When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours. For details of the fields included in the reports, see [AUTOTITLE](/billing/reference/billing-reports#premium-request-analytics-usage-report-fields).
+For details on how to request a usage report, see [AUTOTITLE](/billing/how-tos/products/view-productlicense-use#downloading-usage-reports).
## Optimizing usage of premium requests
diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md
index 3b129cf6e33b..e2f0ca607387 100644
--- a/content/copilot/reference/ai-models/supported-models.md
+++ b/content/copilot/reference/ai-models/supported-models.md
@@ -47,10 +47,10 @@ This table lists the AI models available in {% data variables.product.prodname_c
| {% data variables.copilot.copilot_gpt_5 %} | OpenAI | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_o3 %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_o4_mini %} | OpenAI | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | {% data variables.release-phases.public_preview_caps %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
+| {% data variables.copilot.copilot_claude_sonnet_45 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_opus_41 %} | Anthropic | GA | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_opus %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
+| {% data variables.copilot.copilot_claude_sonnet_35 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-11-06 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_37 %} | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_37 %} Thinking | Anthropic | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_claude_sonnet_40 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
@@ -87,7 +87,7 @@ The following table shows which models are available in each client.
| {% data variables.copilot.copilot_claude_sonnet_40 %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_25_pro %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_flash %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_grok_code %} | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} | {% octicon "x" aria-label="Not included" %} |
+| {% data variables.copilot.copilot_grok_code %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
{% endrowheaders %}
diff --git a/src/content-linter/scripts/lint-content.ts b/src/content-linter/scripts/lint-content.ts
index 2d0f18ca8612..a60ef3c83e77 100755
--- a/src/content-linter/scripts/lint-content.ts
+++ b/src/content-linter/scripts/lint-content.ts
@@ -575,18 +575,22 @@ function getMarkdownLintConfig(errorsOnly, runRules) {
for (const searchRule of ruleConfig.rules) {
const searchRuleSeverity = getRuleSeverity(searchRule, isPrecommit)
if (errorsOnly && searchRuleSeverity !== 'error') continue
- searchReplaceRules.push(searchRule)
+ // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter
+ // This ensures rules like TODOCS detection work in frontmatter
+ // Rules with applyToFrontmatter should ONLY run in the frontmatter pass (which lints the entire file)
+ // to avoid duplicate detections
+ if (searchRule.applyToFrontmatter) {
+ frontmatterSearchReplaceRules.push(searchRule)
+ } else {
+ // Only add to content rules if not a frontmatter-specific rule
+ searchReplaceRules.push(searchRule)
+ }
if (searchRule['partial-markdown-files']) {
dataSearchReplaceRules.push(searchRule)
}
if (searchRule['yml-files']) {
ymlSearchReplaceRules.push(searchRule)
}
- // Add search-replace rules to frontmatter configuration for rules that make sense in frontmatter
- // This ensures rules like TODOCS detection work in frontmatter
- if (searchRule.applyToFrontmatter) {
- frontmatterSearchReplaceRules.push(searchRule)
- }
}
if (searchReplaceRules.length > 0) {
diff --git a/src/events/components/events.ts b/src/events/components/events.ts
index b3a4ea19d4bb..bcb56b34be0d 100644
--- a/src/events/components/events.ts
+++ b/src/events/components/events.ts
@@ -98,6 +98,7 @@ export function sendEvent({
// Content information
referrer: getReferrer(document.referrer),
+ title: document.title,
href: location.href, // full URL
hostname: location.hostname, // origin without protocol or port
path: location.pathname, // path without search or host
@@ -118,6 +119,9 @@ export function sendEvent({
is_headless: isHeadless(),
viewport_width: document.documentElement.clientWidth,
viewport_height: document.documentElement.clientHeight,
+ screen_width: window.screen.width,
+ screen_height: window.screen.height,
+ pixel_ratio: window.devicePixelRatio || 1,
// Location information
timezone: new Date().getTimezoneOffset() / -60,
diff --git a/src/events/lib/schema.ts b/src/events/lib/schema.ts
index 8db06bd96f0c..e16260bb5b8d 100644
--- a/src/events/lib/schema.ts
+++ b/src/events/lib/schema.ts
@@ -44,6 +44,10 @@ const context = {
description: 'The browser value of `document.referrer`.',
format: 'uri-reference',
},
+ title: {
+ type: 'string',
+ description: 'The browser value of `document.title`.',
+ },
href: {
type: 'string',
description: 'The browser value of `location.href`.',
@@ -142,12 +146,27 @@ const context = {
viewport_width: {
type: 'number',
description: 'The viewport width, not the overall device size.',
- minimum: 1,
+ minimum: 0,
},
viewport_height: {
type: 'number',
description: 'The viewport height, not the overall device height.',
- minimum: 1,
+ minimum: 0,
+ },
+ screen_width: {
+ type: 'number',
+ description: 'The screen width of the device.',
+ minimum: 0,
+ },
+ screen_height: {
+ type: 'number',
+ description: 'The screen height of the device.',
+ minimum: 0,
+ },
+ pixel_ratio: {
+ type: 'number',
+ description: 'The device pixel ratio.',
+ minimum: 0,
},
// Location information
diff --git a/src/events/tests/middleware.ts b/src/events/tests/middleware.ts
index 40e0ce8af7bb..084401720e76 100644
--- a/src/events/tests/middleware.ts
+++ b/src/events/tests/middleware.ts
@@ -32,6 +32,7 @@ describe('POST /events', () => {
path: '/github/docs/issues',
hostname: 'github.com',
referrer: 'https://github.com/github/docs',
+ title: 'Issues · github/docs',
search: '?q=is%3Aissue+is%3Aopen+example+',
href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+',
path_language: 'en',
@@ -44,6 +45,9 @@ describe('POST /events', () => {
is_headless: false,
viewport_width: 1418,
viewport_height: 501,
+ screen_width: 1920,
+ screen_height: 1080,
+ pixel_ratio: 2,
// Location information
timezone: -7,
@@ -64,6 +68,7 @@ describe('POST /events', () => {
path: '/github/docs/issues',
hostname: 'github.com',
referrer: 'https://github.com/github/docs',
+ title: 'Issues · github/docs',
search: '?q=is%3Aissue+is%3Aopen+example+',
href: 'https://github.com/github/docs/issues?q=is%3Aissue+is%3Aopen+example+',
path_language: 'en',
@@ -76,6 +81,9 @@ describe('POST /events', () => {
is_headless: false,
viewport_width: 1418,
viewport_height: 501,
+ screen_width: 1920,
+ screen_height: 1080,
+ pixel_ratio: 2,
// Location information
timezone: -7,
diff --git a/src/events/types.ts b/src/events/types.ts
index b66f5e30613b..cbe3c5302338 100644
--- a/src/events/types.ts
+++ b/src/events/types.ts
@@ -24,6 +24,7 @@ export type EventProps = {
created: string
page_event_id: string
referrer: string
+ title?: string
href: string
hostname: string
path: string
@@ -31,9 +32,10 @@ export type EventProps = {
hash: string
path_language: string
path_version: string
+ path_product?: string
path_article: string
- path_document_type: string
- path_type: string
+ page_document_type: string
+ page_type: string
status: number
is_logged_in: boolean
dotcom_user: string
@@ -42,15 +44,21 @@ export type EventProps = {
os_version: string
browser: string
browser_version: string
+ is_headless: boolean
+ viewport_width?: number
+ viewport_height?: number
+ screen_width?: number
+ screen_height?: number
+ pixel_ratio?: number
timezone: number
user_language: string
+ os_preference: string
application_preference: string
color_mode_preference: string
- os_preference: string
code_display_preference: string
+ experiment_variation?: string
event_group_key?: string
event_group_id?: string
- is_headless: boolean
}
}