diff --git a/content/actions/how-tos/monitor-workflows/index.md b/content/actions/how-tos/monitor-workflows/index.md
index 449963c2b164..557de7868aab 100644
--- a/content/actions/how-tos/monitor-workflows/index.md
+++ b/content/actions/how-tos/monitor-workflows/index.md
@@ -11,6 +11,7 @@ children:
- /view-job-execution-time
- /add-a-status-badge
- /use-workflow-run-logs
+ - /view-job-condition-logs
- /enable-debug-logging
redirect_from:
- /actions/monitoring-and-troubleshooting-workflows/monitoring-workflows
diff --git a/content/actions/how-tos/monitor-workflows/view-job-condition-logs.md b/content/actions/how-tos/monitor-workflows/view-job-condition-logs.md
new file mode 100644
index 000000000000..10ffe79d9bfa
--- /dev/null
+++ b/content/actions/how-tos/monitor-workflows/view-job-condition-logs.md
@@ -0,0 +1,40 @@
+---
+title: Viewing job condition expression logs
+shortTitle: View job condition logs
+intro: 'Learn how to access and interpret expression evaluation logs for job-level `if` conditions in {% data variables.product.prodname_actions %}.'
+versions:
+ fpt: '*'
+ ghec: '*'
+contentType: how-tos
+---
+
+When a job's `if` condition is evaluated, {% data variables.product.prodname_actions %} logs the expression evaluation to help you understand the result. This is useful for debugging both why a job was skipped and why a job ran when you expected it to be skipped.
+
+## Accessing expression logs
+
+1. Navigate to the workflow run summary.
+1. Click on the job.
+1. Click **{% octicon "gear" aria-label="The Gear icon" %}**.
+1. Select **Download log archive**.
+1. Extract the ZIP file and open the `JOB-NAME/system.txt` file.
+
+## Understanding the log output
+
+The system log shows the expression evaluation:
+
+```text
+Evaluating: (success() && ((github.repository == 'octo-org/octo-repo-prod')))
+Expanded: (true && (('my-username/octo-repo-prod' == 'octo-org/octo-repo-prod')))
+Result: false
+```
+
+| Line | Description |
+|------|-------------|
+| **Evaluating** | The original `if` expression from your workflow file. |
+| **Expanded** | The expression with context values substituted. This shows you exactly what values were used at runtime. |
+| **Result** | The final evaluation result (`true` or `false`). |
+
+In this example, the expanded line reveals that `github.repository` was `'my-username/octo-repo-prod'` (not `'octo-org/octo-repo-prod'`), which caused the condition to evaluate to `false`.
+
+> [!NOTE]
+> Expression logs are only available for job-level `if` conditions. For step-level conditions, you can enable debug logging to see expression evaluation in the job logs. For more information, see [AUTOTITLE](/actions/how-tos/monitor-workflows/enable-debug-logging).
diff --git a/content/actions/how-tos/troubleshoot-workflows.md b/content/actions/how-tos/troubleshoot-workflows.md
index 4e55fdcb9186..8f13dd0cd575 100644
--- a/content/actions/how-tos/troubleshoot-workflows.md
+++ b/content/actions/how-tos/troubleshoot-workflows.md
@@ -98,6 +98,23 @@ For path filtering, evaluating diffs is limited to the first 300 files. If there
Workflow execution involves any issues seen after the workflow was triggered and a workflow run has been created.
+{% ifversion fpt or ghec %}
+
+### Debugging job conditions
+
+If a job was skipped unexpectedly, or ran when you expected it to be skipped, you can view the expression evaluation to understand why:
+
+1. Click on the job in the workflow run.
+1. Download the log archive from the job's menu.
+1. Open the `JOB-NAME/system.txt` file.
+1. Look for the `Evaluating`, `Expanded`, and `Result` lines.
+
+The `Expanded` line shows the actual runtime values that were substituted into your `if` condition, making it clear why the expression evaluated to `true` or `false`.
+
+For more information, see [AUTOTITLE](/actions/how-tos/monitor-workflows/view-job-condition-logs).
+
+{% endif %}
+
### Canceling Workflows
If standard cancellation through the [UI](/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/canceling-a-workflow) or [API](/rest/actions/workflow-runs?apiVersion=2022-11-28#cancel-a-workflow-run) does not process as expected, there may be a conditional statement configured for your running workflow job(s) that causes it to not cancel.
diff --git a/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md b/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
index 2d5cb82666a2..da8210168003 100644
--- a/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
+++ b/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
@@ -37,3 +37,9 @@ Skipped jobs display the message "This check was skipped."
> [!NOTE]
> A job that is skipped will report its status as "Success". It will not prevent a pull request from merging, even if it is a required check.
+
+{% ifversion fpt or ghec %}
+
+To debug why a job was skipped or ran unexpectedly, you can view job condition expression logs. For more information, see [AUTOTITLE](/actions/how-tos/monitor-workflows/view-job-condition-logs).
+
+{% endif %}
diff --git a/content/admin/data-residency/feature-overview-for-github-enterprise-cloud-with-data-residency.md b/content/admin/data-residency/feature-overview-for-github-enterprise-cloud-with-data-residency.md
index c06bc3fcebe1..532b29e8fc25 100644
--- a/content/admin/data-residency/feature-overview-for-github-enterprise-cloud-with-data-residency.md
+++ b/content/admin/data-residency/feature-overview-for-github-enterprise-cloud-with-data-residency.md
@@ -16,19 +16,27 @@ redirect_from:
## Currently unavailable features
-The following features are currently unavailable on {% data variables.enterprise.data_residency_site %}.
+The following features are currently unavailable on {% data variables.enterprise.data_residency_site %}, but may be planned for future development.
| Feature | Details | More information |
| :- | :- | :- |
-| {% data variables.product.prodname_copilot_short %} Metrics API | Currently unavailable | [AUTOTITLE](/rest/copilot/copilot-metrics) |
+| {% data variables.product.prodname_copilot_short %} Metrics API | Currently unavailable. | [AUTOTITLE](/rest/copilot/copilot-metrics) |
| {% data variables.product.prodname_github_codespaces %} | Currently unavailable. | [AUTOTITLE](/codespaces/quickstart) |
-| {% data variables.product.prodname_importer %} (the "Import repository" button on {% data variables.product.prodname_dotcom_the_website %}) | Instead, the **{% data variables.product.prodname_importer_proper_name %}** is available to migrate data. See [AUTOTITLE](/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/about-github-enterprise-importer). | [AUTOTITLE](/migrations/importing-source-code/using-github-importer/about-github-importer) |
-| {% data variables.product.prodname_marketplace %} | Currently, apps from {% data variables.product.prodname_marketplace %} are unavailable. {% data variables.product.prodname_actions %} workflows from {% data variables.product.prodname_marketplace %} may not function as expected. For more information, see [{% data variables.product.prodname_actions %} workflows from {% data variables.product.prodname_marketplace %}](#github-actions-workflows-from-github-marketplace). | [AUTOTITLE](/search-github/searching-on-github/searching-github-marketplace)
[AUTOTITLE](/enterprise-server@latest/admin/configuration/configuring-github-connect/about-github-connect#github-connect-features) in the {% data variables.product.prodname_ghe_server %} documentation |
-| {% data variables.product.prodname_github_models %} | Currently unavailable | [AUTOTITLE](/github-models/about-github-models) |
| macOS runners for {% data variables.product.prodname_actions %} | Currently unavailable. | [AUTOTITLE](/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners) |
| Maven and Gradle support for {% data variables.product.prodname_registry %} | Currently unavailable. | [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry) |
-| {% data variables.product.prodname_spark_short %} | Unavailable due to dependency on {% data variables.product.prodname_github_codespaces %} | [AUTOTITLE](/copilot/concepts/spark) |
-| Some features currently in {% data variables.release-phases.public_preview %} or {% data variables.release-phases.private_preview %} | Certain features that are in a preview phase on {% data variables.product.prodname_dotcom_the_website %} may not be available on {% data variables.enterprise.data_residency_site %} | |
+| {% data variables.product.prodname_spark_short %} | Currently unavailable. | [AUTOTITLE](/copilot/concepts/spark) |
+| {% data variables.product.prodname_marketplace %} | {% data variables.product.prodname_marketplace %}, as a means of searching for, purchasing, and directly installing apps and actions, is unavailable. Ecosystem apps and actions can still be discovered and installed from their source, but they may require modification to work on {% data variables.enterprise.data_residency_site %}. | [{% data variables.product.prodname_actions %} workflows from {% data variables.product.prodname_marketplace %}](#github-actions-workflows-from-github-marketplace) |
+| Certain features of {% data variables.product.prodname_github_connect %} | Although you can connect an enterprise on {% data variables.enterprise.data_residency_site %} to a {% data variables.product.prodname_ghe_server %} instance, certain features of {% data variables.product.prodname_github_connect %} are not available, including resolution of actions from {% data variables.product.prodname_dotcom_the_website %}. | [{% data variables.product.prodname_github_connect %}](#github-connect) |
+| Some features currently in {% data variables.release-phases.public_preview %} or {% data variables.release-phases.private_preview %} | Certain features that are in a preview phase on {% data variables.product.prodname_dotcom_the_website %} may not be available on {% data variables.enterprise.data_residency_site %} until GA. | |
+
+## Permanently unavailable features
+
+By design, the following features are permanently unavailable on {% data variables.enterprise.data_residency_site %}. This is generally because they are not intended for large enterprises with strict compliance requirements.
+
+| Feature | Details | More information |
+| :- | :- | :- |
+| Features unavailable with {% data variables.product.prodname_emus %} | Because {% data variables.product.prodname_emus %} is the only option for identity management on {% data variables.enterprise.data_residency_site %}, features that are unavailable with {% data variables.product.prodname_emus %} on {% data variables.product.prodname_dotcom_the_website %} are also unavailable on {% data variables.enterprise.data_residency_site %}. Notably, these include gists and public repositories. | [AUTOTITLE](/admin/managing-iam/understanding-iam-for-enterprises/abilities-and-restrictions-of-managed-user-accounts) |
+| {% data variables.product.prodname_importer %} (the "Import repository" button on {% data variables.product.prodname_dotcom_the_website %}) | Instead, the **{% data variables.product.prodname_importer_proper_name %}** is available to migrate data. See [AUTOTITLE](/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/about-github-enterprise-importer). | [AUTOTITLE](/migrations/importing-source-code/using-github-importer/about-github-importer) |
## Features that work differently
diff --git a/content/code-security/concepts/secret-security/about-delegated-bypass-for-push-protection.md b/content/code-security/concepts/secret-security/about-delegated-bypass-for-push-protection.md
index fe34526b3d12..36cac7188660 100644
--- a/content/code-security/concepts/secret-security/about-delegated-bypass-for-push-protection.md
+++ b/content/code-security/concepts/secret-security/about-delegated-bypass-for-push-protection.md
@@ -15,6 +15,7 @@ topics:
shortTitle: Delegated bypass
redirect_from:
- /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/about-delegated-bypass-for-push-protection
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection
contentType: concepts
---
diff --git a/content/code-security/concepts/secret-security/about-secret-scanning.md b/content/code-security/concepts/secret-security/about-secret-scanning.md
index a74dc758f882..1031e0036029 100644
--- a/content/code-security/concepts/secret-security/about-secret-scanning.md
+++ b/content/code-security/concepts/secret-security/about-secret-scanning.md
@@ -126,7 +126,6 @@ Define your own patterns for secrets used by your organization that {% data vari
* [AUTOTITLE](/code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository)
* [AUTOTITLE](/code-security/secret-scanning/introduction/about-push-protection)
-* [AUTOTITLE](/code-security/secret-scanning/working-with-secret-scanning-and-push-protection)
* [AUTOTITLE](/code-security/getting-started/best-practices-for-preventing-data-leaks-in-your-organization)
* [AUTOTITLE](/code-security/getting-started/securing-your-repository)
* [AUTOTITLE](/authentication/keeping-your-account-and-data-secure)
diff --git a/content/code-security/dependabot/ecosystems-supported-by-dependabot/index.md b/content/code-security/dependabot/ecosystems-supported-by-dependabot/index.md
deleted file mode 100644
index 1578a3b9aa74..000000000000
--- a/content/code-security/dependabot/ecosystems-supported-by-dependabot/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Ecosystems supported by Dependabot
-intro: '{% data variables.product.prodname_dependabot %} supports a wide range of ecosystems to help keep your code secure'
-allowTitleToDifferFromFilename: true
-versions:
- fpt: '*'
- ghec: '*'
- ghes: '*'
-topics:
- - Dependabot
- - Dependencies
- - Alerts
- - Vulnerabilities
- - Repositories
-shortTitle: Dependabot ecosystems
-children:
- - /supported-ecosystems-and-repositories
----
-
diff --git a/content/code-security/dependabot/index.md b/content/code-security/dependabot/index.md
index 140749caace0..b322474fc7a7 100644
--- a/content/code-security/dependabot/index.md
+++ b/content/code-security/dependabot/index.md
@@ -14,7 +14,6 @@ topics:
- Repositories
- Dependencies
children:
- - /ecosystems-supported-by-dependabot
- /dependabot-alerts
- /dependabot-auto-triage-rules
- /dependabot-version-updates
diff --git a/content/code-security/dependabot/working-with-dependabot/index.md b/content/code-security/dependabot/working-with-dependabot/index.md
index 403e8bfc96f1..8c5ea0eafcf4 100644
--- a/content/code-security/dependabot/working-with-dependabot/index.md
+++ b/content/code-security/dependabot/working-with-dependabot/index.md
@@ -16,7 +16,6 @@ topics:
children:
- /automating-dependabot-with-github-actions
- /configuring-multi-ecosystem-updates
- - /dependabot-options-reference
- /setting-dependabot-to-run-on-self-hosted-runners-using-arc
- /setting-dependabot-to-run-on-github-hosted-runners-using-vnet
---
diff --git a/content/code-security/how-tos/index.md b/content/code-security/how-tos/index.md
index c381c53e21b8..45ef956b3ef3 100644
--- a/content/code-security/how-tos/index.md
+++ b/content/code-security/how-tos/index.md
@@ -17,8 +17,9 @@ topics:
contentType: how-tos
children:
- /secure-at-scale
- - /secure-your-supply-chain
+ - /secure-your-secrets
- /scan-code-for-vulnerabilities
+ - /secure-your-supply-chain
- /maintain-quality-code
- /report-and-fix-vulnerabilities
---
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/defining-custom-patterns-for-secret-scanning.md
similarity index 97%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/defining-custom-patterns-for-secret-scanning.md
index a611622acb49..dec0b2f554c1 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/defining-custom-patterns-for-secret-scanning.md
@@ -1,17 +1,18 @@
---
title: Defining custom patterns for secret scanning
shortTitle: Define custom patterns
-intro: 'You can define your own custom patterns to extend the capabilities of {% data variables.product.prodname_secret_scanning %} by generating one or more regular expressions.'
+intro: You can define your own custom patterns to extend the capabilities of {% data variables.product.prodname_secret_scanning %} by generating one or more regular expressions.
product: '{% data reusables.gated-features.secret-scanning-custom-patterns %}'
permissions: '{% data reusables.permissions.security-enterprise-enable %}'
redirect_from:
- /code-security/secret-security/defining-custom-patterns-for-secret-scanning
- /code-security/secret-scanning/defining-custom-patterns-for-secret-scanning
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret Protection
- Secret scanning
diff --git a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-extended-metadata-checks-for-your-repository.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-extended-metadata-checks-for-your-repository.md
similarity index 85%
rename from content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-extended-metadata-checks-for-your-repository.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-extended-metadata-checks-for-your-repository.md
index 13b83fb69db6..f7d9cb49d040 100644
--- a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-extended-metadata-checks-for-your-repository.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-extended-metadata-checks-for-your-repository.md
@@ -1,17 +1,18 @@
---
title: Enabling extended metadata checks for your repository
shortTitle: Enable metadata checks
-intro: 'Learn how to enable extended metadata checks for detected secrets so alerts detected by {% data variables.product.prodname_secret_scanning %} include additional information that help you assess and remediate leaks faster.'
+intro: Learn how to enable extended metadata checks for detected secrets so alerts detected by {% data variables.product.prodname_secret_scanning %} include additional information that help you assess and remediate leaks faster.
product: '{% data reusables.gated-features.metadata-checks-ghas %}'
permissions: '{% data reusables.permissions.push-protection %}'
versions:
feature: secret-scanning-extended-metadata-checks
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
-contentType: how-tos
+redirect_from:
+ - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-extended-metadata-checks-for-your-repository
---
{% data reusables.secret-scanning.metadata-checks-public-preview %}
diff --git a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-validity-checks-for-your-repository.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-validity-checks-for-your-repository.md
similarity index 91%
rename from content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-validity-checks-for-your-repository.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-validity-checks-for-your-repository.md
index f1efd8e0ef27..06662990997f 100644
--- a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-validity-checks-for-your-repository.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-validity-checks-for-your-repository.md
@@ -1,15 +1,17 @@
---
title: Enabling validity checks for your repository
shortTitle: Enable validity checks
-intro: 'Enabling validity checks on your repository helps you prioritize the remediation of alerts as it tells you if a secret is active or inactive.'
+intro: Enabling validity checks on your repository helps you prioritize the remediation of alerts as it tells you if a secret is active or inactive.
product: '{% data reusables.gated-features.partner-pattern-validity-check-ghas %}'
versions:
feature: secret-scanning-validity-check-partner-patterns
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
+redirect_from:
+ - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-validity-checks-for-your-repository
---
## About validity checks
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/excluding-folders-and-files-from-secret-scanning.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/excluding-folders-and-files-from-secret-scanning.md
similarity index 91%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/excluding-folders-and-files-from-secret-scanning.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/excluding-folders-and-files-from-secret-scanning.md
index 93bba13213fb..f9873a3a51a9 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/excluding-folders-and-files-from-secret-scanning.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/excluding-folders-and-files-from-secret-scanning.md
@@ -1,17 +1,19 @@
---
title: Excluding folders and files from secret scanning
-intro: 'You can customize {% data variables.product.prodname_secret_scanning %} to automatically close alerts for secrets found in specific directories or files by configuring a `secret_scanning.yml` file in your repository.'
+intro: You can customize {% data variables.product.prodname_secret_scanning %} to automatically close alerts for secrets found in specific directories or files by configuring a `secret_scanning.yml` file in your repository.
permissions: '{% data reusables.permissions.secret-scanning-alerts %}'
shortTitle: Exclude folders and files
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Repositories
+redirect_from:
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/excluding-folders-and-files-from-secret-scanning
---
## About {% data variables.product.prodname_secret_scanning %}
diff --git a/content/code-security/secret-scanning/copilot-secret-scanning/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md
similarity index 85%
rename from content/code-security/secret-scanning/copilot-secret-scanning/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md
index 85851a8ad76d..da9eca753587 100644
--- a/content/code-security/secret-scanning/copilot-secret-scanning/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning.md
@@ -1,12 +1,12 @@
---
title: Generating regular expressions for custom patterns with Copilot secret scanning
shortTitle: Regular expression generator
-intro: 'You can use {% data variables.secret-scanning.copilot-secret-scanning %}''s {% data variables.secret-scanning.custom-pattern-regular-expression-generator %} to write regular expressions for custom patterns. The generator uses an AI model to generate expressions that match your input, and optionally example strings.'
+intro: You can use {% data variables.secret-scanning.copilot-secret-scanning %}'s {% data variables.secret-scanning.custom-pattern-regular-expression-generator %} to write regular expressions for custom patterns. The generator uses an AI model to generate expressions that match your input, and optionally example strings.
permissions: '{% data reusables.permissions.security-repo-enable %}'
allowTitleToDifferFromFilename: true
versions:
feature: secret-scanning-custom-pattern-ai-generated
-type: how_to
+contentType: how-tos
topics:
- Secret Protection
- Secret scanning
@@ -16,6 +16,7 @@ redirect_from:
- /code-security/secret-scanning/generating-regular-expressions-for-custom-patterns-with-ai
- /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/generating-regular-expressions-for-custom-patterns-with-ai
- /code-security/secret-scanning/copilot-secret-scanning/generating-regular-expressions-for-custom-patterns-with-ai
+ - /code-security/secret-scanning/copilot-secret-scanning/generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning
---
## Generating a regular expression for a repository with {% data variables.secret-scanning.copilot-secret-scanning %}
diff --git a/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/index.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/index.md
new file mode 100644
index 000000000000..c559b74f7dcb
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/index.md
@@ -0,0 +1,20 @@
+---
+title: How-tos for customizing secret leak detection
+shortTitle: Detection customization
+intro: Learn how to customize {% data variables.product.github %}'s secret leak detection tools.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+children:
+ - /defining-custom-patterns-for-secret-scanning
+ - /generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning
+ - /managing-custom-patterns
+ - /excluding-folders-and-files-from-secret-scanning
+ - /enabling-validity-checks-for-your-repository
+ - /enabling-extended-metadata-checks-for-your-repository
+---
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/managing-custom-patterns.md b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/managing-custom-patterns.md
similarity index 96%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/managing-custom-patterns.md
rename to content/code-security/how-tos/secure-your-secrets/customize-leak-detection/managing-custom-patterns.md
index 7a290a304aa2..1e8b495421ac 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/managing-custom-patterns.md
+++ b/content/code-security/how-tos/secure-your-secrets/customize-leak-detection/managing-custom-patterns.md
@@ -1,16 +1,18 @@
---
title: Managing custom patterns
shortTitle: Manage custom patterns
-intro: 'You can view, edit, and remove custom patterns, as well as enable push protection for custom patterns.'
+intro: You can view, edit, and remove custom patterns, as well as enable push protection for custom patterns.
permissions: '{% data reusables.permissions.security-enterprise-enable %}'
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret Protection
- Secret scanning
+redirect_from:
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/managing-custom-patterns
---
Custom patterns are user-defined patterns that you can use to identify secrets that are not detected by the default patterns supported by {% data variables.product.prodname_secret_scanning %}. For more information, see [AUTOTITLE](/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning).
diff --git a/content/code-security/secret-scanning/copilot-secret-scanning/enabling-ai-powered-generic-secret-detection.md b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-ai-powered-generic-secret-detection.md
similarity index 88%
rename from content/code-security/secret-scanning/copilot-secret-scanning/enabling-ai-powered-generic-secret-detection.md
rename to content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-ai-powered-generic-secret-detection.md
index dcd8c18cb2ba..c688b97739a7 100644
--- a/content/code-security/secret-scanning/copilot-secret-scanning/enabling-ai-powered-generic-secret-detection.md
+++ b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-ai-powered-generic-secret-detection.md
@@ -1,12 +1,12 @@
---
title: Enabling Copilot secret scanning's generic secret detection
shortTitle: Enable generic secret detection
-intro: 'You can enable {% data variables.secret-scanning.generic-secret-detection %} for your repository or organization. Alerts for generic secrets, such as passwords, are displayed in a separate list on the {% data variables.product.prodname_secret_scanning %} alerts page.'
+intro: You can enable {% data variables.secret-scanning.generic-secret-detection %} for your repository or organization. Alerts for generic secrets, such as passwords, are displayed in a separate list on the {% data variables.product.prodname_secret_scanning %} alerts page.
allowTitleToDifferFromFilename: true
permissions: '{% data reusables.permissions.security-repo-enable %}'
versions:
feature: secret-scanning-ai-generic-secret-detection
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
@@ -15,6 +15,7 @@ topics:
redirect_from:
- /code-security/secret-scanning/enabling-ai-powered-generic-secret-detection
- /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/generic-secret-detection/enabling-ai-powered-generic-secret-detection
+ - /code-security/secret-scanning/copilot-secret-scanning/enabling-ai-powered-generic-secret-detection
---
## Enabling {% data variables.secret-scanning.generic-secret-detection %}
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/enabling-secret-scanning-for-non-provider-patterns.md b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-non-provider-patterns.md
similarity index 80%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/enabling-secret-scanning-for-non-provider-patterns.md
rename to content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-non-provider-patterns.md
index 0fd1da8ea261..f766dd9a6fbf 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/enabling-secret-scanning-for-non-provider-patterns.md
+++ b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-non-provider-patterns.md
@@ -1,20 +1,23 @@
---
title: Enabling secret scanning for non-provider patterns
allowTitleToDifferFromFilename: true
-intro: 'You can enable {% data variables.product.prodname_secret_scanning %} to detect additional potential secrets at the {% ifversion security-configurations %}repository and organization levels{% else %}repository level{% endif %}.'
+intro: You can enable {% data variables.product.prodname_secret_scanning %} to detect additional potential secrets at the {% ifversion security-configurations %}repository and organization levels{% else %}repository level{% endif %}.
permissions: '{% data reusables.permissions.security-repo-enable %}'
product: '{% data reusables.gated-features.secret-scanning-non-provider-patterns %}'
versions:
fpt: '*'
ghec: '*'
ghes: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
- Repositories
shortTitle: Enable for non-provider patterns
+redirect_from:
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/enabling-secret-scanning-for-non-provider-patterns
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns
---
## Enabling scanning for non-provider patterns
diff --git a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository.md b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-your-repository.md
similarity index 93%
rename from content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository.md
rename to content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-your-repository.md
index 941742026291..df76460857f9 100644
--- a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository.md
+++ b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-your-repository.md
@@ -1,17 +1,19 @@
---
title: Enabling secret scanning for your repository
shortTitle: Enable secret scanning
-intro: 'You can configure how {% data variables.product.prodname_dotcom %} scans your repositories for leaked secrets and generates alerts.'
+intro: You can configure how {% data variables.product.prodname_dotcom %} scans your repositories for leaked secrets and generates alerts.
product: '{% data reusables.gated-features.secret-scanning %}'
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
+redirect_from:
+ - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository
---
## About enabling {% data variables.secret-scanning.user_alerts %}
diff --git a/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/index.md b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/index.md
new file mode 100644
index 000000000000..63ec3f163859
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/detect-secret-leaks/index.md
@@ -0,0 +1,19 @@
+---
+title: How-tos for detecting secret leaks
+shortTitle: Leak detection
+intro: Learn how to use {% data variables.product.github %}'s tools to detect secret leaks.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+redirect_from:
+ - /code-security/secret-scanning/enabling-secret-scanning-features
+children:
+ - /enabling-secret-scanning-for-your-repository
+ - /enabling-secret-scanning-for-non-provider-patterns
+ - /enabling-ai-powered-generic-secret-detection
+---
diff --git a/content/code-security/how-tos/secure-your-secrets/index.md b/content/code-security/how-tos/secure-your-secrets/index.md
new file mode 100644
index 000000000000..df8be2d7684b
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/index.md
@@ -0,0 +1,20 @@
+---
+title: How-tos for securing secrets
+shortTitle: Secure secrets
+intro: Learn how to use {% data variables.product.github %}'s security and code quality features.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+children:
+ - /detect-secret-leaks
+ - /customize-leak-detection
+ - /prevent-future-leaks
+ - /work-with-leak-prevention
+ - /manage-bypass-requests
+---
+
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/enabling-delegated-bypass-for-push-protection.md b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/enabling-delegated-bypass-for-push-protection.md
similarity index 94%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/enabling-delegated-bypass-for-push-protection.md
rename to content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/enabling-delegated-bypass-for-push-protection.md
index a95992c025dd..c58fb4900542 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/enabling-delegated-bypass-for-push-protection.md
+++ b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/enabling-delegated-bypass-for-push-protection.md
@@ -1,18 +1,20 @@
---
title: Enabling delegated bypass for push protection
-intro: 'You can use delegated bypass for your organization or repository to control who can push commits that contain secrets identified by {% data variables.product.prodname_secret_scanning %}.'
+intro: You can use delegated bypass for your organization or repository to control who can push commits that contain secrets identified by {% data variables.product.prodname_secret_scanning %}.
permissions: '{% data reusables.permissions.delegated-bypass %}'
versions:
fpt: '*'
ghec: '*'
ghes: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
- Repositories
shortTitle: Enable delegated bypass
+redirect_from:
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/enabling-delegated-bypass-for-push-protection
---
## About enabling delegated bypass for push protection
diff --git a/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/index.md b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/index.md
new file mode 100644
index 000000000000..261f68f37691
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/index.md
@@ -0,0 +1,18 @@
+---
+title: How-tos for bypass requests
+shortTitle: Bypass requests
+intro: Learn how to use the delegated bypass feature.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+children:
+ - /enabling-delegated-bypass-for-push-protection
+ - /managing-requests-to-bypass-push-protection
+ - /reviewing-requests-to-bypass-push-protection
+---
+
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/managing-requests-to-bypass-push-protection.md b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/managing-requests-to-bypass-push-protection.md
similarity index 93%
rename from content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/managing-requests-to-bypass-push-protection.md
rename to content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/managing-requests-to-bypass-push-protection.md
index 3a42dc9391b4..3b3cdb334df7 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/managing-requests-to-bypass-push-protection.md
+++ b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/managing-requests-to-bypass-push-protection.md
@@ -1,18 +1,20 @@
---
title: Managing requests to bypass push protection
-intro: 'As a member of the bypass list for an organization or repository, you can review bypass requests from other members of the organization or repository.'
+intro: As a member of the bypass list for an organization or repository, you can review bypass requests from other members of the organization or repository.
permissions: '{% data reusables.permissions.delegated-bypass-list %}'
versions:
fpt: '*'
ghec: '*'
ghes: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
- Repositories
shortTitle: Manage bypass requests
+redirect_from:
+ - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/managing-requests-to-bypass-push-protection
---
## Managing requests to bypass push protection
diff --git a/content/code-security/security-overview/reviewing-requests-to-bypass-push-protection.md b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/reviewing-requests-to-bypass-push-protection.md
similarity index 92%
rename from content/code-security/security-overview/reviewing-requests-to-bypass-push-protection.md
rename to content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/reviewing-requests-to-bypass-push-protection.md
index ffb553904dcd..616e6bc857f8 100644
--- a/content/code-security/security-overview/reviewing-requests-to-bypass-push-protection.md
+++ b/content/code-security/how-tos/secure-your-secrets/manage-bypass-requests/reviewing-requests-to-bypass-push-protection.md
@@ -1,10 +1,10 @@
---
title: Reviewing requests to bypass push protection
shortTitle: Review bypass requests
-intro: 'You can use security overview to review requests to bypass push protection from contributors pushing to repositories across your organization.'
+intro: You can use security overview to review requests to bypass push protection from contributors pushing to repositories across your organization.
permissions: '{% data reusables.permissions.security-overview %}'
product: '{% data reusables.gated-features.security-overview-fpt-sp-only %}'
-type: how_to
+contentType: how-tos
topics:
- Security overview
- Secret Protection
@@ -14,6 +14,8 @@ topics:
- Alerts
versions:
feature: security-overview-delegated-bypass-requests
+redirect_from:
+ - /code-security/security-overview/reviewing-requests-to-bypass-push-protection
---
## About bypass requests
diff --git a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-push-protection-for-your-repository.md b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/enabling-push-protection-for-your-repository.md
similarity index 91%
rename from content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-push-protection-for-your-repository.md
rename to content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/enabling-push-protection-for-your-repository.md
index b74848ca9bec..dd14758c9f29 100644
--- a/content/code-security/secret-scanning/enabling-secret-scanning-features/enabling-push-protection-for-your-repository.md
+++ b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/enabling-push-protection-for-your-repository.md
@@ -1,17 +1,19 @@
---
title: Enabling push protection for your repository
shortTitle: Enable push protection
-intro: 'With push protection, {% data variables.product.prodname_secret_scanning %} blocks contributors from pushing secrets to a repository and generates an alert whenever a contributor bypasses the block.'
+intro: With push protection, {% data variables.product.prodname_secret_scanning %} blocks contributors from pushing secrets to a repository and generates an alert whenever a contributor bypasses the block.
permissions: '{% data reusables.permissions.push-protection %}'
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
+redirect_from:
+ - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-push-protection-for-your-repository
---
## About enabling push protection
diff --git a/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/index.md b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/index.md
new file mode 100644
index 000000000000..d8e374f8d745
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/index.md
@@ -0,0 +1,17 @@
+---
+title: How-tos for leak prevention
+shortTitle: Leak prevention
+intro: Learn how to prevent future secret leaks with {% data variables.product.github %}'s tools.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+children:
+ - /enabling-push-protection-for-your-repository
+ - /push-protection-for-users
+---
+
diff --git a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/push-protection-for-users.md b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/push-protection-for-users.md
similarity index 90%
rename from content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/push-protection-for-users.md
rename to content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/push-protection-for-users.md
index 33a7a7bbc652..22319c1294cf 100644
--- a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/push-protection-for-users.md
+++ b/content/code-security/how-tos/secure-your-secrets/prevent-future-leaks/push-protection-for-users.md
@@ -1,10 +1,11 @@
---
title: Push protection for users
-intro: 'With push protection for users, you are automatically protected on all pushes to public repositories across {% data variables.product.github %}.'
+shortTitle: Push protection for users
+intro: With push protection for users, you are automatically protected on all pushes to public repositories across {% data variables.product.github %}.
versions:
feature: secret-scanning-push-protection-for-users
product: '{% data reusables.gated-features.push-protection-for-users %}'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
@@ -12,6 +13,7 @@ topics:
- User account
redirect_from:
- /code-security/secret-scanning/push-protection-for-users
+ - /code-security/secret-scanning/working-with-secret-scanning-and-push-protection/push-protection-for-users
---
## About push protection for users
diff --git a/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/index.md b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/index.md
new file mode 100644
index 000000000000..d69c827dacd5
--- /dev/null
+++ b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/index.md
@@ -0,0 +1,18 @@
+---
+title: How-tos for push protection
+shortTitle: Push protection
+intro: Learn how to use {% data variables.product.github %}'s push protection.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Secret Protection
+ - Secret scanning
+contentType: how-tos
+redirect_from:
+ - /code-security/secret-scanning/working-with-secret-scanning-and-push-protection
+children:
+ - /working-with-push-protection-from-the-command-line
+ - /working-with-push-protection-in-the-github-ui
+---
diff --git a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line.md b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-from-the-command-line.md
similarity index 95%
rename from content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line.md
rename to content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-from-the-command-line.md
index 324b4851c1a4..672174ddf74c 100644
--- a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line.md
+++ b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-from-the-command-line.md
@@ -1,18 +1,20 @@
---
title: Working with push protection from the command line
shortTitle: Push protection on the command line
-intro: 'Learn your options for unblocking your push from the command line to {% data variables.product.prodname_dotcom %} if {% data variables.product.prodname_secret_scanning %} detects a secret in your changes.'
+intro: Learn your options for unblocking your push from the command line to {% data variables.product.prodname_dotcom %} if {% data variables.product.prodname_secret_scanning %} detects a secret in your changes.
permissions: '{% data reusables.permissions.push-protection-resolve-block %}'
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
- Repositories
+redirect_from:
+ - /code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line
---
## About push protection from the command line
diff --git a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-in-the-github-ui.md b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-in-the-github-ui.md
similarity index 94%
rename from content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-in-the-github-ui.md
rename to content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-in-the-github-ui.md
index 57526b410c31..2ce7de42ee9d 100644
--- a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-in-the-github-ui.md
+++ b/content/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-in-the-github-ui.md
@@ -1,18 +1,20 @@
---
title: Working with push protection in the GitHub UI
shortTitle: Push protection in the GitHub UI
-intro: 'Learn your options for unblocking your commit when {% data variables.product.prodname_secret_scanning %} detects a secret in your changes.'
+intro: Learn your options for unblocking your commit when {% data variables.product.prodname_secret_scanning %} detects a secret in your changes.
permissions: '{% data reusables.permissions.push-protection-resolve-block %}'
versions:
fpt: '*'
ghes: '*'
ghec: '*'
-type: how_to
+contentType: how-tos
topics:
- Secret scanning
- Secret Protection
- Alerts
- Repositories
+redirect_from:
+ - /code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-in-the-github-ui
---
## About push protection in the {% data variables.product.prodname_dotcom %} UI
diff --git a/content/code-security/reference/index.md b/content/code-security/reference/index.md
index b150165e9190..f28af0d214f4 100644
--- a/content/code-security/reference/index.md
+++ b/content/code-security/reference/index.md
@@ -16,5 +16,6 @@ topics:
- Dependabot
contentType: reference
children:
- - code-scanning
+ - /code-scanning
+ - /supply-chain-security
---
diff --git a/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md b/content/code-security/reference/supply-chain-security/dependabot-options-reference.md
similarity index 99%
rename from content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md
rename to content/code-security/reference/supply-chain-security/dependabot-options-reference.md
index cd1f50e448a6..6210c27ce753 100644
--- a/content/code-security/dependabot/working-with-dependabot/dependabot-options-reference.md
+++ b/content/code-security/reference/supply-chain-security/dependabot-options-reference.md
@@ -1,6 +1,6 @@
---
title: Dependabot options reference
-intro: 'Detailed information for all the options you can use to customize how {% data variables.product.prodname_dependabot %} maintains your repositories.'
+intro: Detailed information for all the options you can use to customize how {% data variables.product.prodname_dependabot %} maintains your repositories.
permissions: '{% data reusables.permissions.dependabot-yml-configure %}'
allowTitleToDifferFromFilename: true
redirect_from:
@@ -8,18 +8,19 @@ redirect_from:
- /code-security/supply-chain-security/configuration-options-for-dependency-updates
- /code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates
- /code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
+ - /code-security/dependabot/working-with-dependabot/dependabot-options-reference
versions:
fpt: '*'
ghec: '*'
ghes: '*'
-type: reference
topics:
- Dependabot
- Version updates
- Repositories
- Dependencies
- Pull requests
-shortTitle: Dependabot options reference
+shortTitle: Dependabot options
+contentType: reference
---
## About the `dependabot.yml` file
diff --git a/content/code-security/supply-chain-security/understanding-your-software-supply-chain/dependency-graph-supported-package-ecosystems.md b/content/code-security/reference/supply-chain-security/dependency-graph-supported-package-ecosystems.md
similarity index 93%
rename from content/code-security/supply-chain-security/understanding-your-software-supply-chain/dependency-graph-supported-package-ecosystems.md
rename to content/code-security/reference/supply-chain-security/dependency-graph-supported-package-ecosystems.md
index 75ebf0467b91..13e6e74681c6 100644
--- a/content/code-security/supply-chain-security/understanding-your-software-supply-chain/dependency-graph-supported-package-ecosystems.md
+++ b/content/code-security/reference/supply-chain-security/dependency-graph-supported-package-ecosystems.md
@@ -1,9 +1,8 @@
---
title: Dependency graph supported package ecosystems
-shortTitle: Dependency graph ecosystem support # Max 31 characters
-intro: 'Dependency graph supports a variety of ecosystems.'
+shortTitle: Dependency graph ecosystems
+intro: Dependency graph supports a variety of ecosystems.
allowTitleToDifferFromFilename: true
-type: reference
topics:
- Dependency graph
- Dependencies
@@ -14,6 +13,9 @@ versions:
fpt: '*'
ghec: '*'
ghes: '*'
+redirect_from:
+ - /code-security/supply-chain-security/understanding-your-software-supply-chain/dependency-graph-supported-package-ecosystems
+contentType: reference
---
## About the dependency graph
diff --git a/content/code-security/reference/supply-chain-security/index.md b/content/code-security/reference/supply-chain-security/index.md
new file mode 100644
index 000000000000..148c135d4618
--- /dev/null
+++ b/content/code-security/reference/supply-chain-security/index.md
@@ -0,0 +1,25 @@
+---
+title: Reference for supply chain security
+shortTitle: Supply chain security
+intro: Find information to apply to your work with {% data variables.product.prodname_dependabot %} and the dependency graph.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+topics:
+ - Dependabot
+ - Version updates
+ - Repositories
+ - Dependencies
+ - Pull requests
+ - Dependency graph
+ - Alerts
+ - Vulnerabilities
+contentType: reference
+children:
+ - /dependabot-options-reference
+ - /supported-ecosystems-and-repositories
+ - /dependency-graph-supported-package-ecosystems
+redirect_from:
+ - /code-security/dependabot/ecosystems-supported-by-dependabot
+---
diff --git a/content/code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories.md b/content/code-security/reference/supply-chain-security/supported-ecosystems-and-repositories.md
similarity index 94%
rename from content/code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories.md
rename to content/code-security/reference/supply-chain-security/supported-ecosystems-and-repositories.md
index 60e66b2aabbb..20b10a6520e0 100644
--- a/content/code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories.md
+++ b/content/code-security/reference/supply-chain-security/supported-ecosystems-and-repositories.md
@@ -1,9 +1,8 @@
---
title: Dependabot supported ecosystems and repositories
-shortTitle: Dependabot ecosystem support # Max 31 characters
+shortTitle: Dependabot ecosystems
intro: '{% data variables.product.prodname_dependabot %} supports a variety of ecosystems and repositories'
allowTitleToDifferFromFilename: true
-type: reference
topics:
- Dependabot
- Dependencies
@@ -14,6 +13,9 @@ versions:
fpt: '*'
ghec: '*'
ghes: '*'
+redirect_from:
+ - /code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories
+contentType: reference
---
## About {% data variables.product.prodname_dependabot %}
diff --git a/content/code-security/responsible-use/responsible-ai-generic-secrets.md b/content/code-security/responsible-use/responsible-ai-generic-secrets.md
index 3802c471fd4c..cfbf6517d102 100644
--- a/content/code-security/responsible-use/responsible-ai-generic-secrets.md
+++ b/content/code-security/responsible-use/responsible-ai-generic-secrets.md
@@ -17,6 +17,7 @@ redirect_from:
- /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/generic-secret-detection/about-the-detection-of-generic-secrets-with-secret-scanning
- /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/generic-secret-detection/responsible-ai-generic-secrets
- /code-security/secret-scanning/copilot-secret-scanning/responsible-ai-generic-secrets
+ - /code-security/secret-scanning/copilot-secret-scanning
contentType: rai
---
diff --git a/content/code-security/secret-scanning/copilot-secret-scanning/index.md b/content/code-security/secret-scanning/copilot-secret-scanning/index.md
deleted file mode 100644
index aa1a7a689041..000000000000
--- a/content/code-security/secret-scanning/copilot-secret-scanning/index.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: Enhance your secret detection capabilities with Copilot secret scanning
-shortTitle: Copilot secret scanning
-allowTitleToDifferFromFilename: true
-intro: Learn how {% data variables.product.prodname_secret_scanning %} uses AI to detect generic secrets in your code, and generate regular expressions for your custom patterns.
-product: '{% data reusables.rai.secret-scanning.copilot-secret-scanning-gated-feature %}'
-versions:
- ghec: '*'
-topics:
- - Secret scanning
- - Secret Protection
- - Repositories
- - Copilot
-children:
- - /enabling-ai-powered-generic-secret-detection
- - /generating-regular-expressions-for-custom-patterns-with-copilot-secret-scanning
-redirect_from:
- - /code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/generic-secret-detection
----
-
diff --git a/content/code-security/secret-scanning/enabling-secret-scanning-features/index.md b/content/code-security/secret-scanning/enabling-secret-scanning-features/index.md
deleted file mode 100644
index 1f89d98525a8..000000000000
--- a/content/code-security/secret-scanning/enabling-secret-scanning-features/index.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Enabling secret scanning features
-shortTitle: Enable features
-allowTitleToDifferFromFilename: true
-intro: 'Learn how to enable {% data variables.product.prodname_secret_scanning %} to detect secrets that are already visible in a repository, as well as push protection to proactively secure you against leaking additional secrets by blocking pushes containing secrets.'
-product: '{% data reusables.gated-features.secret-scanning %}'
-versions:
- fpt: '*'
- ghes: '*'
- ghec: '*'
-topics:
- - Secret scanning
- - Secret Protection
- - Repositories
-children:
- - /enabling-secret-scanning-for-your-repository
- - /enabling-push-protection-for-your-repository
- - /enabling-validity-checks-for-your-repository
- - /enabling-extended-metadata-checks-for-your-repository
-redirect_from:
- - /github/administering-a-repository/configuring-secret-scanning-for-private-repositories
- - /github/administering-a-repository/configuring-secret-scanning-for-your-repositories
- - /code-security/secret-scanning/configuring-secret-scanning-for-your-repositories
----
diff --git a/content/code-security/secret-scanning/index.md b/content/code-security/secret-scanning/index.md
index 3af8406c0ed3..37fba852ed36 100644
--- a/content/code-security/secret-scanning/index.md
+++ b/content/code-security/secret-scanning/index.md
@@ -16,11 +16,8 @@ topics:
- Repositories
children:
- /introduction
- - /enabling-secret-scanning-features
- /managing-alerts-from-secret-scanning
- - /working-with-secret-scanning-and-push-protection
- /using-advanced-secret-scanning-and-push-protection-features
- - /copilot-secret-scanning
- /troubleshooting-secret-scanning-and-push-protection
- /secret-scanning-partnership-program
---
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/index.md b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/index.md
index 97aa6ed566ab..e9dd9888daff 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/index.md
+++ b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/index.md
@@ -2,7 +2,7 @@
title: Custom patterns
shortTitle: Custom patterns
allowTitleToDifferFromFilename: true
-intro: 'You can extend the capabilities of {% data variables.product.prodname_secret_scanning %} to search for your own patterns. These custom patterns can range from your service API keys to connection strings into cloud resources.'
+intro: You can extend the capabilities of {% data variables.product.prodname_secret_scanning %} to search for your own patterns. These custom patterns can range from your service API keys to connection strings into cloud resources.
product: '{% data reusables.gated-features.secret-scanning-custom-patterns %}'
versions:
fpt: '*'
@@ -13,7 +13,6 @@ topics:
- Secret Protection
- Repositories
children:
- - /defining-custom-patterns-for-secret-scanning
- - /managing-custom-patterns
- /metrics-for-custom-patterns
---
+
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/index.md b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/index.md
deleted file mode 100644
index cc91271ec157..000000000000
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/delegated-bypass-for-push-protection/index.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Delegated bypass for push protection
-shortTitle: Delegated bypass
-allowTitleToDifferFromFilename: true
-intro: You can control the ability to bypass push protection by setting up a reviewers group to assess requests. When a contributor proposes bypassing protections, any member of the bypass list can approve or block the request.
-product: '{% data reusables.gated-features.secret-scanning %}'
-versions:
- feature: push-protection-delegated-bypass
-topics:
- - Secret scanning
- - Secret Protection
- - Repositories
-children:
- - /enabling-delegated-bypass-for-push-protection
- - /managing-requests-to-bypass-push-protection
----
-
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/index.md b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/index.md
index 16cda4669c97..9d7c3f3d23f7 100644
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/index.md
+++ b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/index.md
@@ -2,7 +2,7 @@
title: Using advanced secret scanning and push protection features
shortTitle: Advanced features
allowTitleToDifferFromFilename: true
-intro: 'Learn how you can customize {% data variables.product.prodname_secret_scanning %} to meet the needs of your company.'
+intro: Learn how you can customize {% data variables.product.prodname_secret_scanning %} to meet the needs of your company.
product: '{% data reusables.gated-features.secret-scanning %}'
versions:
fpt: '*'
@@ -13,9 +13,6 @@ topics:
- Secret Protection
- Repositories
children:
- - /excluding-folders-and-files-from-secret-scanning
- - /non-provider-patterns
- /custom-patterns
- - /delegated-bypass-for-push-protection
- /enabling-delegated-alert-dismissal-for-secret-scanning
---
diff --git a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/index.md b/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/index.md
deleted file mode 100644
index f1ec83a2e10f..000000000000
--- a/content/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/non-provider-patterns/index.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: Non-provider patterns
-shortTitle: Non-provider patterns
-allowTitleToDifferFromFilename: true
-intro: '{% data variables.product.prodname_secret_scanning_caps %} can also alert you to the potential use of other types of secret in code, for example: HTTP authentication headers, connection strings, and private keys. These non-provider patterns are more difficult to detect reliably so this feature is not enabled by default.'
-product: '{% data reusables.gated-features.secret-scanning-non-provider-patterns %}'
-versions:
- feature: secret-scanning-non-provider-patterns
-topics:
- - Secret scanning
- - Secret Protection
- - Repositories
-children:
- - /enabling-secret-scanning-for-non-provider-patterns
----
diff --git a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/index.md b/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/index.md
deleted file mode 100644
index 721086db8d9b..000000000000
--- a/content/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/index.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title: Working with secret scanning and push protection
-shortTitle: Work with secret scanning
-allowTitleToDifferFromFilename: true
-intro: Avoid leaking sensitive data by blocking pushes containing tokens and other secrets.
-product: '{% data reusables.gated-features.secret-scanning %}'
-versions:
- fpt: '*'
- ghes: '*'
- ghec: '*'
-topics:
- - Secret scanning
- - Secret Protection
- - Repositories
-children:
- - /push-protection-for-users
- - /working-with-push-protection-from-the-command-line
- - /working-with-push-protection-in-the-github-ui
-redirect_from:
- - /code-security/secret-scanning/working-with-push-protection
- - /code-security/secret-scanning/pushing-a-branch-blocked-by-push-protection
----
-
diff --git a/content/code-security/security-overview/index.md b/content/code-security/security-overview/index.md
index 067e5bb367e2..d9713ca0cf13 100644
--- a/content/code-security/security-overview/index.md
+++ b/content/code-security/security-overview/index.md
@@ -22,7 +22,6 @@ children:
- /viewing-metrics-for-dependabot-alerts
- /viewing-metrics-for-secret-scanning-push-protection
- /viewing-metrics-for-pull-request-alerts
- - /reviewing-requests-to-bypass-push-protection
- /review-alert-dismissal-requests
---
diff --git a/content/code-security/supply-chain-security/understanding-your-software-supply-chain/index.md b/content/code-security/supply-chain-security/understanding-your-software-supply-chain/index.md
index 5c9d6913d184..dc542011b04c 100644
--- a/content/code-security/supply-chain-security/understanding-your-software-supply-chain/index.md
+++ b/content/code-security/supply-chain-security/understanding-your-software-supply-chain/index.md
@@ -10,7 +10,6 @@ topics:
- Repositories
shortTitle: Understand your supply chain
children:
- - /dependency-graph-supported-package-ecosystems
- /customizing-your-dependency-review-action-configuration
- /enforcing-dependency-review-across-an-organization
- /troubleshooting-the-dependency-graph
diff --git a/content/copilot/reference/ai-models/model-comparison.md b/content/copilot/reference/ai-models/model-comparison.md
index 03100c0a1677..9132e32fe273 100644
--- a/content/copilot/reference/ai-models/model-comparison.md
+++ b/content/copilot/reference/ai-models/model-comparison.md
@@ -29,23 +29,12 @@ contentType: reference
Use this table to find a suitable model quickly, see more detail in the sections below.
-| Model | Task area | Excels at (primary use case) | Additional capabilities | Further reading |
-|-------------------------------------------------------|--------------------------------------------------|-------------------------------------------------------------------------|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| {% data variables.copilot.copilot_gpt_41 %} | General-purpose coding and writing | Fast, accurate code completions and explanations | Agent mode, vision | [{% data variables.copilot.copilot_gpt_41 %} model card](https://openai.com/index/gpt-4-1/) |
-| {% data variables.copilot.copilot_gpt_52 %} | Deep reasoning and debugging | Multi-step problem solving and architecture-level code analysis | Agent mode | Not available |
-| {% data variables.copilot.copilot_gpt_51 %} | Deep reasoning and debugging | Multi-step problem solving and architecture-level code analysis | Agent mode | Not available |
-| {% data variables.copilot.copilot_gpt_5_codex %} | General-purpose coding and writing | Fast, accurate code completions and explanations | Agent mode | [{% data variables.copilot.copilot_gpt_5_codex %} model card](https://cdn.openai.com/pdf/97cc5669-7a25-4e63-b15f-5fd5bdc4d149/gpt-5-codex-system-card.pdf) |
-| {% data variables.copilot.copilot_gpt_5_mini %} | General-purpose coding and writing | Fast, accurate code completions and explanations | Agent mode, reasoning, vision | [{% data variables.copilot.copilot_gpt_5_mini %} model card](https://cdn.openai.com/gpt-5-system-card.pdf) |
-| {% data variables.copilot.copilot_gpt_5 %} | Deep reasoning and debugging | Multi-step problem solving and architecture-level code analysis | Reasoning | [{% data variables.copilot.copilot_gpt_5 %} model card](https://cdn.openai.com/gpt-5-system-card.pdf) |
-| {% data variables.copilot.copilot_claude_haiku_45 %} | Fast help with simple or repetitive tasks | Fast, reliable answers to lightweight coding questions | Agent mode | Not available |
-| {% data variables.copilot.copilot_claude_sonnet_45 %} | General-purpose coding and agent tasks | Complex problem-solving challenges, sophisticated reasoning | Agent mode | [{% data variables.copilot.copilot_claude_sonnet_45 %} model card](https://assets.anthropic.com/m/12f214efcc2f457a/original/Claude-Sonnet-4-5-System-Card.pdf) |
-| {% data variables.copilot.copilot_claude_opus_41 %} | Deep reasoning and debugging | Complex problem-solving challenges, sophisticated reasoning | Reasoning, vision | [{% data variables.copilot.copilot_claude_opus_41 %} model card](https://assets.anthropic.com/m/4c024b86c698d3d4/original/Claude-4-1-System-Card.pdf) |
-| {% data variables.copilot.copilot_claude_sonnet_40 %} | Deep reasoning and debugging | Performance and practicality, perfectly balanced for coding workflows | Agent mode, vision | [{% data variables.copilot.copilot_claude_sonnet_40 %} model card](https://www-cdn.anthropic.com/6be99a52cb68eb70eb9572b4cafad13df32ed995.pdf) |
-| {% data variables.copilot.copilot_gemini_25_pro %} | Deep reasoning and debugging | Complex code generation, debugging, and research workflows | Reasoning, vision | [{% data variables.copilot.copilot_gemini_25_pro %} model card](https://storage.googleapis.com/model-cards/documents/gemini-2.5-pro.pdf) |
-| {% data variables.copilot.copilot_gemini_3_flash %} | Fast help with simple or repetitive tasks | Fast, reliable answers to lightweight coding questions | Agent mode | Not available |
-| {% data variables.copilot.copilot_grok_code %} | General-purpose coding and writing | Fast, accurate code completions and explanations | Agent mode | [{% data variables.copilot.copilot_grok_code %} model card](https://data.x.ai/2025-08-20-grok-4-model-card.pdf) |
-| {% data variables.copilot.copilot_qwen_25 %} | General-purpose coding and writing | Code generation, reasoning, and code repair / debugging | Reasoning | [{% data variables.copilot.copilot_qwen_25 %} model card](https://arxiv.org/pdf/2409.12186) |
-| {% data variables.copilot.copilot_raptor_mini %} | General-purpose coding and writing | Fast, accurate code completions and explanations | Agent mode | Coming soon |
+
+| Model | Task area | Excels at (primary use case) | Further reading |
+|----------------------------------------------------|-----------------------|------------------------------|-----------------------------|
+| {% for model in tables.copilot.model-comparison %} |
+| {{ model.name }} | {{ model.task_area }} | {{ model.excels_at }} | {{ model.further_reading }} |
+| {% endfor %} |
## Task: General-purpose coding and writing
diff --git a/content/support/learning-about-github-support/about-github-special-events-support.md b/content/support/learning-about-github-support/about-github-special-events-support.md
index 8ca3fc9e8c58..80ab9c68ad90 100644
--- a/content/support/learning-about-github-support/about-github-special-events-support.md
+++ b/content/support/learning-about-github-support/about-github-special-events-support.md
@@ -17,7 +17,7 @@ At {% data variables.product.github %}, we work to understand customers and thei
## What's included with {% data variables.contact.special_events_support %}?
-{% data variables.contact.special_events_support %} provides tailored 24- or 48-hour support packages led by Support Engineers. These packages include:
+{% data variables.contact.special_events_support %} provides tailored, support packages in 24 hour increments, led by Support Engineers. These packages include:
* Strategic pre-event planning and system health checks to make sure you’re prepared.
* Rapid, real-time response via a designated channel throughout your event.
diff --git a/data/learning-tracks/code-security.yml b/data/learning-tracks/code-security.yml
index 73ff1faf3796..fe0acf7e91e9 100644
--- a/data/learning-tracks/code-security.yml
+++ b/data/learning-tracks/code-security.yml
@@ -88,7 +88,7 @@ dependency_version_updates:
- >-
/code-security/dependabot/dependabot-version-updates/customizing-dependabot-prs
- >-
- /code-security/dependabot/working-with-dependabot/dependabot-options-reference
+ /code-security/reference/supply-chain-security/dependabot-options-reference
- >-
/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/keeping-your-actions-up-to-date-with-dependabot
- >-
@@ -112,14 +112,14 @@ secret_scanning:
passwords, and other secrets to your repository.
guides:
- /code-security/concepts/secret-security/about-secret-scanning
- - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-secret-scanning-for-your-repository
- - /code-security/secret-scanning/enabling-secret-scanning-features/enabling-push-protection-for-your-repository
+ - /code-security/how-tos/secure-your-secrets/detect-secret-leaks/enabling-secret-scanning-for-your-repository
+ - /code-security/how-tos/secure-your-secrets/prevent-future-leaks/enabling-push-protection-for-your-repository
- >-
{% ifversion secret-scanning-validity-check-partner-patterns %}
- /code-security/secret-scanning/enabling-secret-scanning-features/enabling-validity-checks-for-your-repository{% endif %}
+ /code-security/how-tos/secure-your-secrets/customize-leak-detection/enabling-validity-checks-for-your-repository{% endif %}
- >-
{% ifversion not fpt
- %}/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/custom-patterns/defining-custom-patterns-for-secret-scanning{%
+ %}/code-security/how-tos/secure-your-secrets/customize-leak-detection/defining-custom-patterns-for-secret-scanning{%
endif %}
- /code-security/secret-scanning/managing-alerts-from-secret-scanning
- /code-security/secret-scanning/introduction/supported-secret-scanning-patterns
@@ -129,15 +129,15 @@ secret_scanning:
endif %}
- >-
{% ifversion secret-scanning-push-protection-for-users
- %}/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/push-protection-for-users{%
+ %}/code-security/how-tos/secure-your-secrets/prevent-future-leaks/push-protection-for-users{%
endif %}
- >-
{% ifversion secret-scanning-push-protection
- %}/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line{%
+ %}/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-from-the-command-line{%
endif %}
- >-
{% ifversion secret-scanning-push-protection
- %}/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-in-the-github-ui{%
+ %}/code-security/how-tos/secure-your-secrets/work-with-leak-prevention/working-with-push-protection-in-the-github-ui{%
endif %}
- >-
/code-security/secret-scanning/troubleshooting-secret-scanning-and-push-protection/troubleshooting-secret-scanning
diff --git a/data/tables/copilot/model-comparison.yml b/data/tables/copilot/model-comparison.yml
new file mode 100644
index 000000000000..98e8a8dbe2f7
--- /dev/null
+++ b/data/tables/copilot/model-comparison.yml
@@ -0,0 +1,112 @@
+# Please keep this list sorted in the following order:
+# 1. By provider, in this order:
+# - OpenAI
+# - Anthropic
+# - Google
+# - xAI
+# 2. Within each provider group, alphabetically by model name.
+
+# OpenAI
+- name: GPT-4.1
+ task_area: General-purpose coding and writing
+ excels_at: Fast, accurate code completions and explanations
+ further_reading: '[GPT-4.1 model card](https://openai.com/index/gpt-4-1/)'
+
+- name: GPT-5
+ task_area: Deep reasoning and debugging
+ excels_at: Multi-step problem solving and architecture-level code analysis
+ further_reading: '[GPT-5 model card](https://cdn.openai.com/gpt-5-system-card.pdf)'
+
+- name: GPT-5-Codex
+ task_area: General-purpose coding and writing
+ excels_at: Fast, accurate code completions and explanations
+ further_reading: '[GPT-5-Codex model card](https://cdn.openai.com/pdf/97cc5669-7a25-4e63-b15f-5fd5bdc4d149/gpt-5-codex-system-card.pdf)'
+
+- name: GPT-5 mini
+ task_area: General-purpose coding and writing
+ excels_at: Fast, accurate code completions and explanations
+ further_reading: '[GPT-5 mini model card](https://cdn.openai.com/gpt-5-system-card.pdf)'
+
+- name: GPT-5.1
+ task_area: Deep reasoning and debugging
+ excels_at: Multi-step problem solving and architecture-level code analysis
+ further_reading: '[GPT-5.1 model card](https://cdn.openai.com/pdf/4173ec8d-1229-47db-96de-06d87147e07e/5_1_system_card.pdf)'
+
+- name: GPT-5.1-Codex
+ task_area: Deep reasoning and debugging
+ excels_at: Multi-step problem solving and architecture-level code analysis
+ further_reading: 'Not available'
+
+- name: GPT-5.1 Codex Max
+ task_area: Agentic software development
+ excels_at: Agentic tasks
+ further_reading: '[GPT-5.1-Codex-Max model card](https://cdn.openai.com/pdf/2a7d98b1-57e5-4147-8d0e-683894d782ae/5p1_codex_max_card_03.pdf)'
+
+- name: GPT-5.1-Codex-Mini
+ task_area: Deep reasoning and debugging
+ excels_at: Multi-step problem solving and architecture-level code analysis
+ further_reading: 'Not available'
+
+- name: GPT-5.2
+ task_area: Deep reasoning and debugging
+ excels_at: Multi-step problem solving and architecture-level code analysis
+ further_reading: '[GPT-5.2 model card](https://cdn.openai.com/pdf/3a4153c8-c748-4b71-8e31-aecbde944f8d/oai_5_2_system-card.pdf)'
+
+# Anthropic
+- name: Claude Haiku 4.5
+ task_area: Fast help with simple or repetitive tasks
+ excels_at: Fast, reliable answers to lightweight coding questions
+ further_reading: '[Claude Haiku 4.5 model card](https://assets.anthropic.com/m/99128ddd009bdcb/Claude-Haiku-4-5-System-Card.pdf)'
+
+- name: Claude Opus 4.1
+ task_area: Deep reasoning and debugging
+ excels_at: Complex problem-solving challenges, sophisticated reasoning
+ further_reading: '[Claude Opus 4.1 model card](https://assets.anthropic.com/m/4c024b86c698d3d4/original/Claude-4-1-System-Card.pdf)'
+
+- name: Claude Opus 4.5
+ task_area: Deep reasoning and debugging
+ excels_at: Complex problem-solving challenges, sophisticated reasoning
+ further_reading: '[Claude Opus 4.5 model card](https://assets.anthropic.com/m/64823ba7485345a7/Claude-Opus-4-5-System-Card.pdf)'
+
+- name: Claude Sonnet 4.0
+ task_area: Deep reasoning and debugging
+ excels_at: Performance and practicality, perfectly balanced for coding workflows
+ further_reading: '[Claude Sonnet 4.0 model card](https://www-cdn.anthropic.com/6be99a52cb68eb70eb9572b4cafad13df32ed995.pdf)'
+
+- name: Claude Sonnet 4.5
+ task_area: General-purpose coding and agent tasks
+ excels_at: Complex problem-solving challenges, sophisticated reasoning
+ further_reading: '[Claude Sonnet 4.5 model card](https://assets.anthropic.com/m/12f214efcc2f457a/original/Claude-Sonnet-4-5-System-Card.pdf)'
+
+# Google
+- name: Gemini 2.5 Pro
+ task_area: Deep reasoning and debugging
+ excels_at: Complex code generation, debugging, and research workflows
+ further_reading: '[Gemini 2.5 Pro model card](https://storage.googleapis.com/model-cards/documents/gemini-2.5-pro.pdf)'
+
+- name: Gemini 3 Flash
+ task_area: Fast help with simple or repetitive tasks
+ excels_at: Fast, reliable answers to lightweight coding questions
+ further_reading: '[Gemini 3 Flash model card](https://storage.googleapis.com/deepmind-media/Model-Cards/Gemini-3-Flash-Model-Card.pdf)'
+
+- name: Gemini 3 Pro
+ task_area: Deep reasoning and debugging
+ excels_at: Complex code generation, debugging, and research workflows
+ further_reading: '[Gemini 3 Pro model card](https://storage.googleapis.com/deepmind-media/Model-Cards/Gemini-3-Pro-Model-Card.pdf)'
+
+# xAI
+- name: Grok Code Fast 1
+ task_area: General-purpose coding and writing
+ excels_at: Fast, accurate code completions and explanations
+ further_reading: '[Grok Code Fast 1 model card](https://data.x.ai/2025-08-20-grok-4-model-card.pdf)'
+
+# Other providers (alphabetized by model name)
+- name: Qwen2.5
+ task_area: General-purpose coding and writing
+ excels_at: Code generation, reasoning, and code repair / debugging
+ further_reading: '[Qwen2.5 model card](https://arxiv.org/pdf/2409.12186)'
+
+- name: Raptor mini
+ task_area: General-purpose coding and writing
+ excels_at: Fast, accurate code completions and explanations
+ further_reading: 'Coming soon'
diff --git a/src/article-api/lib/get-all-toc-items.ts b/src/article-api/lib/get-all-toc-items.ts
new file mode 100644
index 000000000000..51070a24ccd6
--- /dev/null
+++ b/src/article-api/lib/get-all-toc-items.ts
@@ -0,0 +1,127 @@
+import type { Context, Page } from '@/types'
+import type { LinkData } from '@/article-api/transformers/types'
+import { resolvePath } from './resolve-path'
+
+interface PageWithChildren extends Page {
+ children?: string[]
+ category?: string[]
+}
+
+interface TocItem extends LinkData {
+ category?: string[]
+ childTocItems?: TocItem[]
+}
+
+/**
+ * Recursively gathers all TOC items from a page and its descendants.
+ * This mirrors the behavior of getTocItems() in the generic-toc middleware
+ * but works with the page.children frontmatter property.
+ *
+ * @param page - The page to gather TOC items from
+ * @param context - The rendering context
+ * @param options - Configuration options
+ * @returns Array of TocItems with nested childTocItems
+ */
+export async function getAllTocItems(
+ page: Page,
+ context: Context,
+ options: {
+ recurse?: boolean
+ renderIntros?: boolean
+ } = {},
+): Promise {
+ const { recurse = true, renderIntros = true } = options
+ const pageWithChildren = page as PageWithChildren
+ const languageCode = page.languageCode || 'en'
+
+ if (!pageWithChildren.children || pageWithChildren.children.length === 0) {
+ return []
+ }
+
+ // Get the page's pathname for resolving children
+ const pagePermalink = page.permalinks.find(
+ (p) => p.languageCode === languageCode && p.pageVersion === context.currentVersion,
+ )
+ const pathname = pagePermalink ? pagePermalink.href : `/${languageCode}`
+
+ const items: TocItem[] = []
+
+ for (const childHref of pageWithChildren.children) {
+ const childPage = resolvePath(childHref, languageCode, pathname, context) as
+ | PageWithChildren
+ | undefined
+
+ if (!childPage) continue
+
+ const title = await childPage.renderTitle(context, { unwrap: true })
+ const intro =
+ renderIntros && childPage.intro
+ ? await childPage.renderProp('intro', context, { textOnly: true })
+ : ''
+
+ const childPermalink = childPage.permalinks.find(
+ (p) => p.languageCode === languageCode && p.pageVersion === context.currentVersion,
+ )
+ const href = childPermalink ? childPermalink.href : childHref
+
+ const category = childPage.category || []
+
+ const item: TocItem = {
+ href,
+ title,
+ intro,
+ category,
+ childTocItems: [],
+ }
+
+ // Recursively get children if enabled
+ if (recurse && childPage.children && childPage.children.length > 0) {
+ item.childTocItems = await getAllTocItems(childPage, context, options)
+ }
+
+ items.push(item)
+ }
+
+ return items
+}
+
+/**
+ * Flattens nested TOC items into a single array.
+ * Only includes leaf nodes (items without children) or all items based on options.
+ *
+ * @param tocItems - The nested TOC items to flatten
+ * @param options - Configuration options
+ * @returns Flat array of LinkData items
+ */
+export function flattenTocItems(
+ tocItems: TocItem[],
+ options: {
+ excludeParents?: boolean // If true, only include items without children
+ } = {},
+): LinkData[] {
+ const { excludeParents = true } = options
+ const result: LinkData[] = []
+
+ function recurse(items: TocItem[]) {
+ for (const item of items) {
+ const hasChildren = item.childTocItems && item.childTocItems.length > 0
+
+ // Include this item if it's a leaf or if we're including parents
+ if (!hasChildren || !excludeParents) {
+ result.push({
+ href: item.href,
+ title: item.title,
+ intro: item.intro,
+ })
+ }
+
+ // Recurse into children
+ if (hasChildren) {
+ recurse(item.childTocItems!)
+ }
+ }
+ }
+
+ recurse(tocItems)
+ return result
+}
diff --git a/src/article-api/tests/category-landing-transformer.ts b/src/article-api/tests/category-landing-transformer.ts
new file mode 100644
index 000000000000..f29c0c91110b
--- /dev/null
+++ b/src/article-api/tests/category-landing-transformer.ts
@@ -0,0 +1,18 @@
+import { describe, expect, test } from 'vitest'
+
+import { get } from '@/tests/helpers/e2etest'
+
+const makeURL = (pathname: string): string =>
+ `/api/article/body?${new URLSearchParams({ pathname })}`
+
+describe('category landing transformer', () => {
+ test('handles subcategory pages without category-landing layout', async () => {
+ // /en/get-started/start-your-journey is a subcategory index page without category-landing layout
+ // It should return 403 (not transformed) or be handled by default behavior
+ const res = await get(makeURL('/en/get-started/start-your-journey'))
+
+ // This page doesn't have category-landing layout, so it won't be transformed
+ // That's expected behavior - only pages with layout: category-landing are transformed
+ expect([200, 403]).toContain(res.statusCode)
+ })
+})
diff --git a/src/article-api/tests/discovery-landing-transformer.ts b/src/article-api/tests/discovery-landing-transformer.ts
new file mode 100644
index 000000000000..a48bd6e10667
--- /dev/null
+++ b/src/article-api/tests/discovery-landing-transformer.ts
@@ -0,0 +1,54 @@
+import { describe, expect, test } from 'vitest'
+
+import { get } from '@/tests/helpers/e2etest'
+
+const makeURL = (pathname: string): string =>
+ `/api/article/body?${new URLSearchParams({ pathname })}`
+
+describe('discovery landing transformer', () => {
+ test('renders a discovery landing page in markdown', async () => {
+ // /en/get-started/carousel is a discovery landing page with recommended carousel
+ const res = await get(makeURL('/en/get-started/carousel'))
+ expect(res.statusCode).toBe(200)
+ expect(res.headers['content-type']).toContain('text/markdown')
+
+ // Check for title and intro
+ expect(res.body).toContain('# Landing Page Carousel')
+ expect(res.body).toContain('A test category page for testing the LandingCarousel component')
+
+ // Should have Articles section with all descendant articles
+ expect(res.body).toContain('## Articles')
+ expect(res.body).toContain('[Carousel Article One]')
+ expect(res.body).toContain('[Carousel Article Two]')
+ expect(res.body).toContain('[Carousel Article Three]')
+ })
+
+ test('renders a discovery landing page with children', async () => {
+ // /en/get-started/article-grid-discovery has discovery landing with children
+ const res = await get(makeURL('/en/get-started/article-grid-discovery'))
+ expect(res.statusCode).toBe(200)
+ expect(res.headers['content-type']).toContain('text/markdown')
+
+ // Check for title
+ expect(res.body).toContain('# Article Grid Discovery')
+
+ // Should have Articles section with all descendant articles (recursive)
+ expect(res.body).toContain('## Articles')
+ expect(res.body).toContain('[Grid Article One]')
+ expect(res.body).toContain('[Grid Article Two]')
+ expect(res.body).toContain('[Grid Article Three]')
+ expect(res.body).toContain('[Grid Article Four]')
+ })
+
+ test('handles discovery landing structure consistently', async () => {
+ // Discovery pages should have a consistent structure
+ const res = await get(makeURL('/en/get-started/carousel'))
+ expect(res.statusCode).toBe(200)
+
+ // Should have intro
+ expect(res.body).toMatch(/^# .+\n\n.+\n\n/)
+
+ // Should have at least one section
+ expect(res.body).toContain('##')
+ })
+})
diff --git a/src/article-api/transformers/category-landing-transformer.ts b/src/article-api/transformers/category-landing-transformer.ts
new file mode 100644
index 000000000000..3678372fb36c
--- /dev/null
+++ b/src/article-api/transformers/category-landing-transformer.ts
@@ -0,0 +1,155 @@
+import type { Context, Page } from '@/types'
+import type { PageTransformer, TemplateData, Section, LinkData } from './types'
+import { renderContent } from '@/content-render/index'
+import { loadTemplate } from '@/article-api/lib/load-template'
+import { resolvePath } from '@/article-api/lib/resolve-path'
+import { getLinkData } from '@/article-api/lib/get-link-data'
+
+interface CategoryPage extends Page {
+ spotlight?: Array<{ article: string; image: string }>
+ children?: string[]
+}
+
+/**
+ * Transforms category-landing pages into markdown format.
+ * Handles spotlight sections and recursively collects all descendant articles.
+ */
+export class CategoryLandingTransformer implements PageTransformer {
+ templateName = 'landing-page.template.md'
+
+ canTransform(page: Page): boolean {
+ return page.layout === 'category-landing'
+ }
+
+ async transform(page: Page, pathname: string, context: Context): Promise {
+ const templateData = await this.prepareTemplateData(page, pathname, context)
+ const templateContent = loadTemplate(this.templateName)
+
+ return await renderContent(templateContent, {
+ ...context,
+ ...templateData,
+ markdownRequested: true,
+ })
+ }
+
+ /**
+ * Recursively collects all descendant articles from the given parent hrefs.
+ * Traverses the page tree, adding non-index pages and recursing into children.
+ * Uses a visited set to prevent infinite loops from circular references.
+ */
+ private async getAllDescendantArticles(
+ parentHrefs: string[],
+ languageCode: string,
+ pathname: string,
+ context: Context,
+ visited: Set = new Set(),
+ ): Promise {
+ const allArticles: LinkData[] = []
+
+ for (const href of parentHrefs) {
+ // Prevent infinite loops from circular references
+ if (visited.has(href)) continue
+ visited.add(href)
+
+ const parentPage = resolvePath(href, languageCode, pathname, context) as
+ | CategoryPage
+ | undefined
+ if (!parentPage) continue
+
+ // Add this page if it's an article (not an index)
+ if (!parentPage.relativePath.endsWith('index.md')) {
+ const linkData = await getLinkData(href, languageCode, pathname, context, resolvePath)
+ if (linkData.href) {
+ allArticles.push(linkData)
+ }
+ }
+
+ // Recursively get children
+ const children = parentPage.children
+ if (children && Array.isArray(children) && children.length > 0) {
+ // Get the parent's permalink to use as the base path for resolving children
+ const parentPermalink = parentPage.permalinks.find(
+ (p) => p.languageCode === languageCode && p.pageVersion === context.currentVersion,
+ )
+ const parentPathname = parentPermalink ? parentPermalink.href : pathname
+
+ const childArticles = await this.getAllDescendantArticles(
+ children,
+ languageCode,
+ parentPathname,
+ context,
+ visited,
+ )
+ allArticles.push(...childArticles)
+ }
+ }
+
+ return allArticles
+ }
+
+ private async prepareTemplateData(
+ page: Page,
+ pathname: string,
+ context: Context,
+ ): Promise {
+ const categoryPage = page as CategoryPage
+ const languageCode = page.languageCode || 'en'
+ const sections: Section[] = []
+
+ // Spotlight section
+ const spotlight = categoryPage.spotlight
+ if (spotlight && spotlight.length > 0) {
+ const links = await Promise.all(
+ spotlight.map(async (item) => {
+ const linkData = await getLinkData(
+ item.article,
+ languageCode,
+ pathname,
+ context,
+ resolvePath,
+ )
+ return {
+ ...linkData,
+ intro: linkData.intro
+ ? `${linkData.intro} (Image: ${item.image})`
+ : `Image: ${item.image}`,
+ }
+ }),
+ )
+
+ const validLinks = links.filter((l) => l.href)
+ if (validLinks.length > 0) {
+ sections.push({
+ title: 'Spotlight',
+ groups: [{ title: null, links: validLinks }],
+ })
+ }
+ }
+
+ // Children - get all descendant articles recursively
+ if (categoryPage.children) {
+ const allArticles = await this.getAllDescendantArticles(
+ categoryPage.children,
+ languageCode,
+ pathname,
+ context,
+ )
+
+ if (allArticles.length > 0) {
+ sections.push({
+ title: 'Links',
+ groups: [{ title: null, links: allArticles }],
+ })
+ }
+ }
+
+ const intro = page.intro ? await page.renderProp('intro', context, { textOnly: true }) : ''
+ const title = await page.renderTitle(context, { unwrap: true })
+
+ return {
+ title,
+ intro,
+ sections,
+ }
+ }
+}
diff --git a/src/article-api/transformers/discovery-landing-transformer.ts b/src/article-api/transformers/discovery-landing-transformer.ts
new file mode 100644
index 000000000000..5a013fbc0fc6
--- /dev/null
+++ b/src/article-api/transformers/discovery-landing-transformer.ts
@@ -0,0 +1,211 @@
+import type { Context, Page } from '@/types'
+import type { PageTransformer, TemplateData, Section, LinkData } from './types'
+import { renderContent } from '@/content-render/index'
+import { loadTemplate } from '@/article-api/lib/load-template'
+import { getAllTocItems, flattenTocItems } from '@/article-api/lib/get-all-toc-items'
+
+interface RecommendedItem {
+ href: string
+ title?: string
+ intro?: string
+}
+
+interface DiscoveryPage extends Page {
+ rawIntroLinks?: Record
+ introLinks?: Record
+ recommended?: RecommendedItem[]
+ rawRecommended?: string[]
+ includedCategories?: string[]
+ children?: string[]
+}
+
+/**
+ * Transforms discovery-landing pages into markdown format.
+ * Handles recommended carousel, intro links, article grids with
+ * category filtering, and children listings.
+ */
+export class DiscoveryLandingTransformer implements PageTransformer {
+ templateName = 'landing-page.template.md'
+
+ canTransform(page: Page): boolean {
+ return page.layout === 'discovery-landing'
+ }
+
+ async transform(page: Page, pathname: string, context: Context): Promise {
+ const templateData = await this.prepareTemplateData(page, pathname, context)
+
+ const templateContent = loadTemplate(this.templateName)
+
+ const rendered = await renderContent(templateContent, {
+ ...context,
+ ...templateData,
+ markdownRequested: true,
+ })
+
+ return rendered
+ }
+
+ private async prepareTemplateData(
+ page: Page,
+ _pathname: string,
+ context: Context,
+ ): Promise {
+ const discoveryPage = page as DiscoveryPage
+ const sections: Section[] = []
+
+ // Recommended carousel
+ const recommended = discoveryPage.recommended ?? discoveryPage.rawRecommended
+ if (recommended && recommended.length > 0) {
+ const { default: getLearningTrackLinkData } = await import(
+ '@/learning-track/lib/get-link-data'
+ )
+
+ let links: LinkData[]
+ if (typeof recommended[0] === 'object' && 'title' in recommended[0]) {
+ links = recommended.map((item) => ({
+ href: typeof item === 'string' ? item : item.href,
+ title: (typeof item === 'object' && item.title) || '',
+ intro: (typeof item === 'object' && item.intro) || '',
+ }))
+ } else {
+ const linkData = await getLearningTrackLinkData(recommended as string[], context, {
+ title: true,
+ intro: true,
+ })
+ links = (linkData || []).map((item: { href: string; title?: string; intro?: string }) => ({
+ href: item.href,
+ title: item.title || '',
+ intro: item.intro || '',
+ }))
+ }
+
+ const validLinks = links.filter((l) => l.href && l.title)
+ if (validLinks.length > 0) {
+ sections.push({
+ title: 'Recommended',
+ groups: [{ title: null, links: validLinks }],
+ })
+ }
+ }
+
+ // Intro links (getting started)
+ const rawIntroLinks = discoveryPage.introLinks ?? discoveryPage.rawIntroLinks
+ if (rawIntroLinks) {
+ const { default: getLearningTrackLinkData } = await import(
+ '@/learning-track/lib/get-link-data'
+ )
+ const links = await Promise.all(
+ Object.values(rawIntroLinks).map(async (href): Promise => {
+ if (typeof href === 'string') {
+ const linkData = await getLearningTrackLinkData(href, context)
+ if (Array.isArray(linkData) && linkData.length > 0) {
+ const item = linkData[0]
+ return { href: item.href || '', title: item.title || '', intro: item.intro || '' }
+ } else if (
+ linkData &&
+ typeof linkData === 'object' &&
+ !Array.isArray(linkData) &&
+ 'href' in linkData
+ ) {
+ const item = linkData as { href?: string; title?: string; intro?: string }
+ return {
+ href: item.href || '',
+ title: item.title || '',
+ intro: item.intro || '',
+ }
+ }
+ }
+ return { href: '', title: '' }
+ }),
+ )
+ const validLinks = links.filter((l) => l.href)
+ if (validLinks.length > 0) {
+ sections.push({
+ title: 'Links',
+ groups: [{ title: 'Getting started', links: validLinks }],
+ })
+ }
+ }
+
+ // Articles section: recursively gather ALL descendant articles
+ // This matches the behavior of the site which uses genericTocFlat/genericTocNested
+ if (discoveryPage.children && discoveryPage.children.length > 0) {
+ const tocItems = await getAllTocItems(page, context, {
+ recurse: true,
+ renderIntros: true,
+ })
+
+ // Flatten to get all leaf articles (excludeParents: true means only get articles, not category pages)
+ let allArticles = flattenTocItems(tocItems, { excludeParents: true })
+
+ // Apply includedCategories filter if specified
+ if (discoveryPage.includedCategories && discoveryPage.includedCategories.length > 0) {
+ const includedCategories = discoveryPage.includedCategories.map((c) => c.toLowerCase())
+ // Filter tocItems before flattening to preserve category info
+ const filterByCategory = (items: typeof tocItems): typeof tocItems => {
+ return items.filter((item) => {
+ const itemCategories = (item.category || []).map((c: string) => c.toLowerCase())
+ return itemCategories.some((cat) => includedCategories.includes(cat))
+ })
+ }
+
+ // Re-flatten with category filtering
+ const filteredTocItems = filterByCategory(flattenTocItemsWithCategory(tocItems))
+ allArticles = filteredTocItems.map((item) => ({
+ href: item.href,
+ title: item.title,
+ intro: item.intro,
+ }))
+ }
+
+ if (allArticles.length > 0) {
+ sections.push({
+ title: 'Articles',
+ groups: [{ title: null, links: allArticles }],
+ })
+ }
+ }
+
+ const intro = page.intro ? await page.renderProp('intro', context, { textOnly: true }) : ''
+ const title = await page.renderTitle(context, { unwrap: true })
+
+ return {
+ title,
+ intro,
+ sections,
+ }
+ }
+}
+
+/**
+ * Helper to flatten TOC items while preserving category info for filtering
+ */
+interface TocItemWithCategory {
+ href: string
+ title: string
+ intro?: string
+ category?: string[]
+ childTocItems?: TocItemWithCategory[]
+}
+
+function flattenTocItemsWithCategory(tocItems: TocItemWithCategory[]): TocItemWithCategory[] {
+ const result: TocItemWithCategory[] = []
+
+ function recurse(items: TocItemWithCategory[]) {
+ for (const item of items) {
+ const hasChildren = item.childTocItems && item.childTocItems.length > 0
+
+ // Only include leaf nodes (articles, not category pages)
+ if (!hasChildren) {
+ result.push(item)
+ }
+
+ if (hasChildren) {
+ recurse(item.childTocItems!)
+ }
+ }
+ }
+
+ recurse(tocItems)
+ return result
+}
diff --git a/src/article-api/transformers/index.ts b/src/article-api/transformers/index.ts
index 0d8e5f783506..08722471b6e8 100644
--- a/src/article-api/transformers/index.ts
+++ b/src/article-api/transformers/index.ts
@@ -7,6 +7,8 @@ import { GraphQLTransformer } from './graphql-transformer'
import { GithubAppsTransformer } from './github-apps-transformer'
import { WebhooksTransformer } from './webhooks-transformer'
import { TocTransformer } from './toc-transformer'
+import { CategoryLandingTransformer } from './category-landing-transformer'
+import { DiscoveryLandingTransformer } from './discovery-landing-transformer'
import { ProductGuidesTransformer } from './product-guides-transformer'
import { ProductLandingTransformer } from './product-landing-transformer'
@@ -24,6 +26,8 @@ transformerRegistry.register(new GraphQLTransformer())
transformerRegistry.register(new GithubAppsTransformer())
transformerRegistry.register(new WebhooksTransformer())
transformerRegistry.register(new TocTransformer())
+transformerRegistry.register(new CategoryLandingTransformer())
+transformerRegistry.register(new DiscoveryLandingTransformer())
transformerRegistry.register(new ProductGuidesTransformer())
transformerRegistry.register(new ProductLandingTransformer())
diff --git a/src/data-directory/lib/data-schemas/tables/copilot/model-comparison.ts b/src/data-directory/lib/data-schemas/tables/copilot/model-comparison.ts
new file mode 100644
index 000000000000..022eb8da25aa
--- /dev/null
+++ b/src/data-directory/lib/data-schemas/tables/copilot/model-comparison.ts
@@ -0,0 +1,37 @@
+// This schema enforces the structure in model-comparison.yml
+
+const modelComparisonSchema = {
+ type: 'object',
+ additionalProperties: false,
+ required: ['models'],
+ properties: {
+ models: {
+ type: 'array',
+ items: {
+ type: 'object',
+ additionalProperties: false,
+ required: ['name', 'task_area', 'excels_at', 'further_reading'],
+ properties: {
+ name: {
+ type: 'string',
+ lintable: true,
+ },
+ task_area: {
+ type: 'string',
+ lintable: true,
+ },
+ excels_at: {
+ type: 'string',
+ lintable: true,
+ },
+ further_reading: {
+ type: 'string',
+ lintable: true,
+ },
+ },
+ },
+ },
+ },
+}
+
+export default modelComparisonSchema