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.