diff --git a/CHANGELOG.md b/CHANGELOG.md index 52df890d20ee..d22965855dab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,21 @@ # Docs changelog +**18 March 2026** + +We added documentation for using session data in Copilot CLI—including the `/chronicle` slash command: + +* [About GitHub Copilot CLI session data](https://docs.github.com/en/copilot/concepts/agents/copilot-cli/chronicle) +* [Using GitHub Copilot CLI session data](https://docs.github.com/copilot/how-tos/copilot-cli/chronicle) + +
+ **17 March 2026** We published [Maintaining codebase standards in a GitHub Copilot rollout](https://docs.github.com/en/enterprise-cloud@latest/copilot/tutorials/roll-out-at-scale/maintain-codebase-standards). The guide shows how customers can create a strong governance framework for Copilot by leveraging GitHub's enterprise-grade platform alongside cultural best practices. -
- -We published [Resources for getting approval of GitHub Copilot](https://docs.github.com/enterprise-cloud@latest/copilot/get-started/resources-for-approval), a guide that collects resources for enterprise admins to send to legal, compliance, and cybersecurity teams in their company. +We also published [Resources for getting approval of GitHub Copilot](https://docs.github.com/enterprise-cloud@latest/copilot/get-started/resources-for-approval), a guide that collects resources for enterprise admins to send to legal, compliance, and cybersecurity teams in their company.
@@ -18,6 +25,8 @@ We've updated our documentation to include a series of articles about the GitHub See [GitHub integration in Teams](https://docs.github.com/integrations/how-tos/teams). +
+ **4 March 2026** We've published a new article to coincide with the public preview of the Copilot coding agent for Jira integration. diff --git a/Dockerfile b/Dockerfile index e04ae800a3cb..6a9179f4b081 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,9 @@ # This Dockerfile is used solely for production deployments to Moda # For building this file locally, see src/deployments/production/README.md -# Environment variables are set in the Moda configuration: +# Most environment variables are set in the Moda configuration: # config/moda/configuration/*/env.yaml +# V8 heap sizing is set here via NODE_OPTIONS and mirrored in +# the Moda config files for defense-in-depth. # --------------------------------------------------------------- # BASE STAGE: Install linux dependencies and set up the node user @@ -151,5 +153,11 @@ COPY --chown=node:node --from=precompute_stage $APP_HOME/.pageinfo-cache.json.br ARG BUILD_SHA ENV BUILD_SHA=$BUILD_SHA +# V8 heap limit as a percentage of the container cgroup memory limit. +# Uses --max-old-space-size-percentage (Node 24+) so the heap adapts +# automatically when K8s memory limits change. 75% leaves ~25% headroom +# for off-heap memory (Buffers, V8 code cache, libuv) and OS overhead. +ENV NODE_OPTIONS="--max-old-space-size-percentage=75" + # Entrypoint to start the server CMD ["node_modules/.bin/tsx", "src/frame/server.ts"] diff --git a/config/kubernetes/default/deployments/webapp.yaml b/config/kubernetes/default/deployments/webapp.yaml index f71de2831a19..5aff611caa1f 100644 --- a/config/kubernetes/default/deployments/webapp.yaml +++ b/config/kubernetes/default/deployments/webapp.yaml @@ -24,13 +24,16 @@ spec: resources: requests: cpu: 1000m - memory: 4500Mi - # Keep ~600 MB headroom above --max-old-space-size in - # config/moda/configuration/default/env.yaml for Node - # off-heap memory and OS overhead. + # Absolute minimum to start app is 1000m + # Node is single-threaded but we want more CPUs + # for OS and image resizing, and other binary executions + # Better to increase replicas or memory than CPU + memory: 8.0Gi + # Absolute minimum to start app is 4500Mi + # Would increase with more pages, versions, or languages supported limits: cpu: 8000m - memory: 16Gi + memory: 8.0Gi ports: - name: http containerPort: 4000 diff --git a/config/kubernetes/production/deployments/webapp.yaml b/config/kubernetes/production/deployments/webapp.yaml index 387e4524b4cd..f5bf99c2dccc 100644 --- a/config/kubernetes/production/deployments/webapp.yaml +++ b/config/kubernetes/production/deployments/webapp.yaml @@ -34,12 +34,9 @@ spec: # Absolute minimum to start app is 4500Mi # Would increase with more pages, versions, or languages supported # The additional memory helps during traffic surges - # Keep ~600 MB headroom above --max-old-space-size in - # config/moda/configuration/production/env.yaml for Node - # off-heap memory and OS overhead. limits: cpu: 16000m - memory: 16Gi + memory: 8.0Gi ports: - name: http containerPort: 4000 diff --git a/config/moda/configuration/default/env.yaml b/config/moda/configuration/default/env.yaml index 10360f1b261c..fd28256d4dd1 100644 --- a/config/moda/configuration/default/env.yaml +++ b/config/moda/configuration/default/env.yaml @@ -1,13 +1,9 @@ data: MODA_APP_NAME: docs-internal NODE_ENV: production - # V8 heap limit (--max-old-space-size) should leave at least ~600 MiB - # below the K8s memory request for Node off-heap memory (Buffers, - # V8 code cache, libuv) and OS overhead. If you change the memory - # request in config/kubernetes/default/deployments/webapp.yaml, - # update this value to match. - # Current: 4500 MiB request, 4096 MiB heap = 404 MiB headroom - NODE_OPTIONS: '--max-old-space-size=4096' + # Matches the Dockerfile ENV. Both set the same value so that + # the heap limit is correct regardless of config-layering order. + NODE_OPTIONS: '--max-old-space-size-percentage=75' PORT: '4000' ENABLED_LANGUAGES: 'en,es,ja,pt,zh,ru,fr,ko,de' RATE_LIMIT_MAX: '21' diff --git a/config/moda/configuration/production/env.yaml b/config/moda/configuration/production/env.yaml index feae34ade6c6..dae252096588 100644 --- a/config/moda/configuration/production/env.yaml +++ b/config/moda/configuration/production/env.yaml @@ -1,13 +1,9 @@ data: MODA_APP_NAME: docs-internal NODE_ENV: production - # V8 heap limit (--max-old-space-size) should leave at least ~600 MiB - # below the K8s memory request for Node off-heap memory (Buffers, - # V8 code cache, libuv) and OS overhead. If you change the memory - # request in config/kubernetes/production/deployments/webapp.yaml, - # update this value to match. - # Current: 8.0 Gi (8192 MiB) request, 7168 MiB heap = 1024 MiB headroom - NODE_OPTIONS: '--max-old-space-size=7168' + # Matches the Dockerfile ENV. Both set the same value so that + # the heap limit is correct regardless of config-layering order. + NODE_OPTIONS: '--max-old-space-size-percentage=75' PORT: '4000' ENABLED_LANGUAGES: 'en,es,ja,pt,zh,ru,fr,ko,de' RATE_LIMIT_MAX: '21' diff --git a/content/billing/concepts/product-billing/git-lfs.md b/content/billing/concepts/product-billing/git-lfs.md index e31c391ceb92..5fd79f215050 100644 --- a/content/billing/concepts/product-billing/git-lfs.md +++ b/content/billing/concepts/product-billing/git-lfs.md @@ -49,14 +49,16 @@ category: Previously, {% data variables.large_files.product_name_short %} billing used pre-paid data packs. These have been removed and replaced with metered billing and you only pay for what you actually use. -Each {% data variables.product.github %} account includes a quota of free bandwidth and storage for {% data variables.large_files.product_name_long %} ({% data variables.large_files.product_name_short %}). If you exceed this quota, what happens next depends on your {% data variables.large_files.product_name_short %} budget setting: +Each {% data variables.product.github %} account includes a quota of free bandwidth and storage for {% data variables.large_files.product_name_long %} ({% data variables.large_files.product_name_short %}). + +* **Bandwidth:** Your free quota resets at the start of each billing cycle. +* **Storage:** Charges accrue continuously throughout the month based on hourly usage. Your accrued storage total resets to zero at the beginning of each billing cycle. + +If you exceed this quota, what happens next depends on your {% data variables.large_files.product_name_short %} budget setting: * **Budget set to $0**: You are not charged for overages, but {% data variables.large_files.product_name_short %} usage is blocked for the rest of the calendar month. Usage resets on the first of the next month. * **Budget deleted**: There is no spending limit, and you are billed for all usage beyond the free quota. -* **Bandwidth:** Your free quota resets at the start of each billing cycle. -* **Storage:** Charges accrue continuously throughout the month based on hourly usage. Your accrued storage total resets to zero at the beginning of each billing cycle. - {% data variables.large_files.product_name_short %} storage is calculated based on all {% data variables.large_files.product_name_short %} objects associated with a repository, regardless of when they were uploaded. Storage usage is only zero when no {% data variables.large_files.product_name_short %} objects are associated with the repository. If you delete {% data variables.large_files.product_name_short %} objects partway through a calendar month, the storage usage for that month is not recalculated. Storage resets on the first of the following month. diff --git a/content/billing/reference/cost-center-allocation.md b/content/billing/reference/cost-center-allocation.md index cb4d7be26601..651b61428024 100644 --- a/content/billing/reference/cost-center-allocation.md +++ b/content/billing/reference/cost-center-allocation.md @@ -26,7 +26,7 @@ This article contains reference information for how spending is assigned to cost | {% data variables.product.prodname_enterprise %} | The user who receives the license (priority), or the organization that is billed for the license. | | Git Large File Storage | The repository or organization where Git LFS is used. | | {% data variables.product.prodname_registry %} | The repository or organization that owns the package. | -| {% data variables.product.prodname_prus_caps %} | The user who triggered the use of the {% data variables.product.prodname_pru %} (priority), or the organization they belong to. | +| {% data variables.product.prodname_prus_caps %} | The user who triggered {% data variables.product.prodname_pru %} usage (priority), or the organization that granted the user's {% data variables.product.prodname_copilot_short %} license. | | {% data variables.product.prodname_GHAS %} | A user who uses a license (priority), or the organization that is billed for the license. | ## Details for license-based products 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 513fc95bc9d1..bea49ce2cb57 100644 --- a/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md +++ b/content/copilot/reference/copilot-usage-metrics/copilot-usage-metrics.md @@ -91,16 +91,15 @@ For example schemas of the data returned by the APIs, see [AUTOTITLE](/copilot/r | `totals_by_language_feature` | Breakdown combining language and feature dimensions. | | `totals_by_model_feature` / `totals_by_language_model` | Model-specific breakdowns for chat activity (not completions). | | `last_known_ide_version` / `last_known_plugin_version` | The most recent IDE and {% data variables.copilot.copilot_chat_short %} extension version detected for each user. | -| `daily_active_cli_users` | Number of unique users in the enterprise who used {% data variables.product.prodname_copilot_short %} via the CLI on a given day. This field is **independent** of IDE active user counts and is **not** included in IDE-based active user definitions. Omitted for enterprises with no CLI usage on that day. | -| `totals_by_cli` | Breakdown of CLI-specific metrics for the enterprise on a given day. Independent of IDE metrics—CLI usage is **not** reflected in other fields such as `totals_by_ide` or `totals_by_feature`. Omitted for enterprises with no CLI usage on that day. See [{% data variables.copilot.copilot_cli_short %} metrics fields](#copilot-cli-metrics-fields-api-only) below. | +| `daily_active_cli_users` | Number of unique users in the enterprise or organization who used {% data variables.product.prodname_copilot_short %} via the CLI on a given day. This field is **independent** of IDE active user counts and is **not** included in IDE-based active user definitions. Omitted for enterprises or organizations with no CLI usage on that day. | +| `totals_by_cli` | Breakdown of CLI-specific metrics for the enterprise or organization on a given day. Independent of IDE metrics—CLI usage is **not** reflected in other fields such as `totals_by_ide` or `totals_by_feature`. Omitted for enterprises or organizations with no CLI usage on that day. See [{% data variables.copilot.copilot_cli_short %} metrics fields](#copilot-cli-metrics-fields-api-only) below. | | `used_cli` | Captures whether the user has used {% data variables.copilot.copilot_cli_short %} that day. | | `used_agent` | Captures whether the user has used IDE agent mode that day. | | `used_chat` | Captures whether the user has used IDE chat that day. | - ### {% data variables.copilot.copilot_cli_short %} metrics fields (API only) -The `totals_by_cli` object contains the following nested fields when CLI usage is present. These metrics are currently only available in the enterprise-level and user-level reports. +The `totals_by_cli` object contains the following nested fields when CLI usage is present. | Field | Description | |:--|:--| @@ -110,7 +109,7 @@ The `totals_by_cli` object contains the following nested fields when CLI usage i | `totals_by_cli.token_usage.prompt_tokens_sum` | Total number of prompt tokens sent across all CLI requests on this day. | | `totals_by_cli.token_usage.avg_tokens_per_request` | Average number of **output** and **prompt** tokens per CLI request, computed as `(output_tokens_sum + prompt_tokens_sum) ÷ request_count`.| | `totals_by_cli.prompt_count` | Total number of user prompts, commands, or queries executed within a session. | -| `totals_by_cli.last_known_cli_version` | Most recent Copilot CLI version detected for the user that day. | +| `totals_by_cli.last_known_cli_version` | Most recent {% data variables.copilot.copilot_cli_short %} version detected for the user that day. | ### Pull request activity fields (API only) diff --git a/data/reusables/billing/cost-center-allocation.md b/data/reusables/billing/cost-center-allocation.md index 09e2be726c30..1428f16c0b35 100644 --- a/data/reusables/billing/cost-center-allocation.md +++ b/data/reusables/billing/cost-center-allocation.md @@ -2,6 +2,6 @@ To allocate metered spending to a cost center, you add repositories, organizatio * For **usage-based** products, like {% data variables.product.prodname_actions %}, cost centers are charged based on the **repositories or organizations** in the cost center, as this is where the usage takes place. * For **license-based** products, like {% data variables.product.prodname_copilot %}, cost centers are charged based on the **users** in the cost center. -* For products billed by **{% data variables.product.prodname_pru %}** usage, like {% data variables.copilot.copilot_coding_agent %}, cost centers are also charged based on the **users** in the cost center. +* For products billed by **{% data variables.product.prodname_pru %}** usage, like {% data variables.copilot.copilot_coding_agent %}, cost centers are charged based on the **users** in the cost center, or the **organization that granted the user's {% data variables.product.prodname_copilot %} license** if the user isn't directly assigned to a cost center. Cost centers only apply to metered usage, and do not work with volume or subscription billing.