diff --git a/.github/skills/airflow-translations/locales/ar.md b/.github/skills/airflow-translations/locales/ar.md
new file mode 100644
index 0000000000000..ce006214506cc
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/ar.md
@@ -0,0 +1,9 @@
+
+
+# Arabic (`ar`) translation guidelines
+
+No locale-specific guidance has been authored yet for Arabic. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/airflow-translations/locales/it.md b/.github/skills/airflow-translations/locales/it.md
new file mode 100644
index 0000000000000..4fb8a351e6b84
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/it.md
@@ -0,0 +1,9 @@
+
+
+# Italian (`it`) translation guidelines
+
+No locale-specific guidance has been authored yet for Italian. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/airflow-translations/locales/tr.md b/.github/skills/airflow-translations/locales/tr.md
new file mode 100644
index 0000000000000..5a93679c67458
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/tr.md
@@ -0,0 +1,9 @@
+
+
+# Turkish (`tr`) translation guidelines
+
+No locale-specific guidance has been authored yet for Turkish. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/pr-triage/actions.md b/.github/skills/pr-triage/actions.md
index f03ed686a471e..b030365958fdb 100644
--- a/.github/skills/pr-triage/actions.md
+++ b/.github/skills/pr-triage/actions.md
@@ -112,6 +112,8 @@ recover from.
---
+
+
## `mark-ready` — add `ready for maintainer review` label
**Mandatory pre-mutation check.** Before adding the label, the
@@ -160,6 +162,8 @@ error; this is the only action of the skill whose sole purpose
---
+
+
## `mark-ready-with-ping` — promote a likely-addressed PR + ping reviewers
A composite of `mark-ready` plus a `ping` comment. Used when
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 295688d115f4c..6c0a97b801c9a 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -400,6 +400,35 @@ repos:
files: ^\.github/workflows/.*$|^\.github/actions/.*$
require_serial: true
entry: zizmor
+ - repo: https://github.com/lycheeverse/lychee
+ rev: e85aaf5524b2f808e63bae55e594c843220f10f2 # frozen: lychee-v0.24.2
+ hooks:
+ # Use the upstream `lychee-docker` variant rather than the script-based
+ # `lychee` hook because the prebuilt lychee binaries that the script
+ # downloads are linked against newer glibc than ubuntu-22.04 runners
+ # ship with (`GLIBC_2.38` / `GLIBC_2.39` not found at runtime). The
+ # docker variant runs the official `lycheeverse/lychee` image, which
+ # bundles its own libc and is portable across runners.
+ - id: lychee-docker
+ name: Check internal Markdown links with lychee (offline mode)
+ description: >-
+ Validate intra-repo links in Markdown files (relative paths, anchors,
+ and fragments) without making any HTTP requests. Auto-generated client
+ docs are excluded because they are regenerated from OpenAPI specs.
+ types: [markdown]
+ args:
+ - --offline
+ - --no-progress
+ - --root-dir
+ - .
+ - --include-fragments
+ exclude: |
+ (?x)
+ ^clients/python/|
+ ^.*/openapi-gen/|
+ ^.*/node_modules/|
+ ^\.build/|
+ ^generated/
- repo: local
# Note that this is the 2nd "local" repo group in the .pre-commit-config.yaml file. This is because
# we try to minimize the number of passes that must happen to apply some of the changes
diff --git a/airflow-core/src/airflow/_shared/AGENTS.md b/airflow-core/src/airflow/_shared/AGENTS.md
index 1947c43f88ffc..3b99217a56609 100644
--- a/airflow-core/src/airflow/_shared/AGENTS.md
+++ b/airflow-core/src/airflow/_shared/AGENTS.md
@@ -5,7 +5,7 @@
# The `_shared` package — Agent Instructions
Each shared library is a symbolic link to the library package sources from the shared library
-located in the [shared folder](../../shared). In the shared folder each library is a separate
+located in the [shared folder](../../../../shared). In the shared folder each library is a separate
distribution that has it's own tests and dependencies. Those dependencies and links to those
libraries are maintained by `prek` hook automatically.
diff --git a/airflow-core/src/airflow/_shared/README.md b/airflow-core/src/airflow/_shared/README.md
index 658af6b5d975a..e00b1dc62340c 100644
--- a/airflow-core/src/airflow/_shared/README.md
+++ b/airflow-core/src/airflow/_shared/README.md
@@ -32,4 +32,4 @@ library code is stored in "shared" folder) - and at the same time we can have di
same shared library in different packages when for example `airflow-core` and `task-sdk` package are
installed together in different version.
-You can read about it in [the shared README.md](../../shared/README.md) document.
+You can read about it in [the shared README.md](../../../../shared/README.md) document.
diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
index c72bd3aaafca4..aff91c070d9ef 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
@@ -62,7 +62,7 @@ Adding a new Execution API feature touches multiple packages. All of these must
- Dag processor handler: `airflow-core/src/airflow/dag_processing/processor.py`
- Triggerer handler: `airflow-core/src/airflow/jobs/triggerer_job_runner.py`
- Task SDK generated models: `task-sdk/src/airflow/sdk/api/datamodels/_generated.py`
-- Full versioning guide: [`contributing-docs/19_execution_api_versioning.rst`](../../../../contributing-docs/19_execution_api_versioning.rst)
+- Full versioning guide: [`contributing-docs/19_execution_api_versioning.rst`](../../../../../contributing-docs/19_execution_api_versioning.rst)
## Token Scope Infrastructure
diff --git a/airflow-core/src/airflow/ui/tests/e2e/README.md b/airflow-core/src/airflow/ui/tests/e2e/README.md
index 9e6eb1db94fc6..4c62116b1df5a 100644
--- a/airflow-core/src/airflow/ui/tests/e2e/README.md
+++ b/airflow-core/src/airflow/ui/tests/e2e/README.md
@@ -161,7 +161,7 @@ When submitting a PR that adds new E2E coverage, briefly explain in the PR descr
2. **Create a spec file** in `specs/`
- Import page objects and write test steps
- - See existing test: [dag-trigger.spec.ts](specs/dag-trigger.spec.ts)
+ - See existing test: [dag-runs.spec.ts](specs/dag-runs.spec.ts)
3. **Run tests locally**
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 02a8715f8dc51..2f4c3020fb2c2 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -202,7 +202,7 @@ EOF
When it is time to cut the RC, you should:
1. Generate an additional completeness output:
- a. If there are incomplete locales that were also incomplete in the previous major/minor release, please contact the code owner and ask them to act according to the [removing or replacing ownership procedure](../airflow-core/src/airflow/ui/public/i18n/README.md#removing-or-replacing-ownership) in the i18n policy.
+ a. If there are incomplete locales that were also incomplete in the previous major/minor release, please contact the code owner and ask them to act according to the [Relinquishing translation/code ownership procedure](../airflow-core/src/airflow/ui/public/i18n/README.md#relinquishing-translationcode-ownership) in the i18n policy.
b. If there are other incomplete locales, please write it as a reminder for the next major/minor release.
2. Post the final completeness output on the same thread.
diff --git a/dev/README_RELEASE_HELM_CHART.md b/dev/README_RELEASE_HELM_CHART.md
index 3ac3aea711276..2f733e91a7d7c 100644
--- a/dev/README_RELEASE_HELM_CHART.md
+++ b/dev/README_RELEASE_HELM_CHART.md
@@ -204,7 +204,7 @@ The minimum version of Kubernetes should be updated according to
https://github.com/apache/airflow/blob/main/README.md#requirements in two places:
* [../../helm-chart/README.md](../chart/README.md)
-* [../docs/helm-chart/index.rst](../docs/helm-chart/index.rst)
+* [../chart/docs/index.rst](../chart/docs/index.rst)
## Build RC artifacts
diff --git a/dev/breeze/doc/ci/02_images.md b/dev/breeze/doc/ci/02_images.md
index f5d85fba8b2aa..7182b205b20c9 100644
--- a/dev/breeze/doc/ci/02_images.md
+++ b/dev/breeze/doc/ci/02_images.md
@@ -108,7 +108,7 @@ it uses the latest installed version of airflow and providers. However,
you can choose different installation methods as described in [Building
PROD docker images from released PIP packages](#building-prod-docker-images-from-released-pip-packages). Detailed
reference for building production image from different sources can be
-found in: [Build Args reference](../../../../docs/docker-stack/build-arg-ref.rst#installing-airflow-using-different-methods)
+found in: [Build Args reference](../../../../docker-stack-docs/build-arg-ref.rst#installing-airflow-using-different-methods)
You can build the CI image using current sources this command:
diff --git a/dev/system_tests/README.md b/dev/system_tests/README.md
index 00cd02a7e9875..4dcd3d6af670b 100644
--- a/dev/system_tests/README.md
+++ b/dev/system_tests/README.md
@@ -25,14 +25,13 @@ Small tool to update status of all AIP-47 issues.
Simply:
-1) Activate dev environment based on [requirements](../../dev/requirements.txt)
+1) Set `GITHUB_TOKEN` to a repo-writeable token.
-2) Set GITHUB_TOKEN to repo-writeable token
-
-3) Run this:
+2) Run the script via `uv` (it pulls in the few third-party deps it
+ needs — `PyGithub`, `rich-click`, `rich`):
```bash
-python dev/system_tests/update_issue_status.py
+uv run --with PyGithub --with rich-click --with rich python dev/system_tests/update_issue_status.py
```