Skip to content

ci(nightly): admit Linux controls on fleet before paid overflow - #30085

Merged
teamleaderleo merged 9 commits into
feat-cmux-nextfrom
lane/nightly-linux-control-admission
Nov 1, 2026
Merged

teamleaderleo merged 9 commits into
feat-cmux-nextfrom
lane/nightly-linux-control-admission

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Early NEXT nightly controls can queue on Blacksmith before the GCP fleet has had a chance to start. Request an identity-bound controller lease, reserve one unconsumed JIT runner per job, and permit paid overflow only with a matching recorded 180-second no-start. Stale, missing or invalid receipts retain the existing owned fleet routes. No job or workflow is cancelled.

Leo: “FOR OUR NIGHTLIES ARE THEY END TO END ON OUR FLEET? WE CAN'T BE RELYING ON BLACKSMITH THAT CUTS OUT”.

This routes four controls: the TUI resolver, helper resolver, input bundler and recovery finder. The credentialed Mac-build picker remains on its existing owned-mini placement; its routing App key never enters the secret-free GCP pool. Promotion is a separate owned-Mac change. Signer routing and compilation are unchanged by this PR; #30081 owns that route. Input-bundle notices bootstrap Rust with the already-used pinned setup action.

Only the NEXT track uses the new selectors; other nightly tracks retain their prior routes. The controller binds receipts to repository, run, attempt, source and job keys. The client accepts HTTPS with normal certificate validation or the existing encrypted Tailscale connection to a numeric online peer, with redirects and environment proxies disabled. Future-dated receipts and inconsistent no-start durations are refused. A fleet decision committed before expiry remains valid through delayed response delivery; readiness first observed after expiry cannot win. Each unique runner label belongs to one lease/job, so an unrelated queued job cannot consume it. The controller retains downstream listeners while their parent dependency runs and reclaims them after the exact job/run finishes. The client long-polls within a 200-second deadline with 35-second HTTP bounds; optional mini-capacity reads have a 30-second alarm, cleared and restored in finally. Durable receipts are uploaded as an Actions artifact.

Prior art: #29864 supplies portable placement; #29981 exposes GCP demand but does not provide a nightly-safe no-start handoff. Existing signer artifact caches and warm-source declarations remain; no Swift build or shared compile-cache change. The service prerequisite is HQ#5785, merged at c5353e24bf092f769eafbf49a9bb621515e159d9 after exact-head review at 4503b288 and fleet controller compilation/tests.

Observed / Not run

At 9e3ed62, all 156 focused Python tests pass: admission and transport (25), portable placement (28), nightly trusted routes (29), nightly pooled routes (16), routing table (26), step coverage (5), fork routing (23), Linux runner-size policy (4). The test registry validates the new test's automatic PR execution. New workflow-selector regressions failed 48 assertions before wiring the caller. Review regressions reproduced future-dated/public-HTTP receipt acceptance and non-NEXT routing (six failed assertions), then passed after repair.

Two existing tests still fail on the base: nightly.yml exceeds the 490,000-byte margin (493,159 bytes on base), and the variable report omits CI_CONTROL_RUNNER. These exact named failures were reproduced on base. The self-hosted shell guard also reports eight unchanged offending selectors: each is present byte-for-byte on the base. The new output-name false positive from review is removed. HQ #5798 supplies the receipt-authority correction, and #5804 adds the GitHub CLI prerequisite. Both are deployed in controller version 80ada0f87e20. The final reviewed head 8ed7063 passes 134 relevant policy tests after merging the current base. End-to-end nightly admission evidence is pending; no runtime speedup is claimed yet.

Performance

Metric Before After Delta Harness or source
Resolver/signer/recovery waiting on Blacksmith Still queued after 6m21s Not measured Pending deployment Run 41265156038, controller job snapshot at 02:36:57Z
Blacksmith minutes/day Not measured Not measured Not claimed Same job timing telemetry after deployment

Changelog

none

Agent session: agent session
🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Routes early NEXT nightly controls onto reserved fleet Linux runners before paid overflow, so builds no longer queue on Blacksmith waiting for the GCP fleet to start. Controls request an identity-bound lease from the fleet controller, which reserves an unconsumed JIT runner per job; paid overflow requires a matching recorded 180-second no-start receipt. Missing, stale, or invalid receipts keep the existing owned-fleet routes, and no job or workflow is cancelled.

Fleet admission

  • Receipts bind to repository, run, attempt, source, and job keys; future-dated receipts and inconsistent no-start durations are refused.
  • Transport requires HTTPS with normal certificate validation or an existing encrypted Tailscale peer; redirects and environment proxies are disabled.
  • A committed fleet decision survives delayed response delivery; a runner first observed after expiry cannot win.
  • Each unique runner label belongs to one lease/job, and the controller reclaims listeners once the exact job finishes.

Scope

  • Only the NEXT track uses the new selectors; the credentialed Mac-build picker keeps its owned-mini placement, and the signer stays on its dedicated lane.
  • The signer bootstraps Rust with the pinned setup action before generating third-party notices.
  • The client long-polls within a 200-second deadline; all 156 focused Python tests pass on the base.
  • Held until the receipt-authority correction HQ#5798 is reviewed, merged, and deployed before activation.

Written for commit 8ed7063. Summary will update on new commits.

View guided diff Turn on auto-fix

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 8ed7063: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr30085 -f ref=lane/nightly-linux-control-admission -f platform=macos -f backend_mode=local

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 73dd28e; does not block

Shipped in:

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

8 issues found across 12 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="tests/test_nightly_linux_admission.py">

<violation number="1" location="tests/test_nightly_linux_admission.py:58">
P3: The `urllib.request.urlopen` mock does nothing here because `exchange` goes through `build_opener(...).open`. Patch `transport.urllib.request.build_opener`, or assert that the opener is never built, so the test checks the no-network guarantee it names.</violation>
</file>

<file name="tests/test_ci_nightly_off_blacksmith.py">

<violation number="1" location="tests/test_ci_nightly_off_blacksmith.py:223">
P2: The new `endswith("|| 'cmux-fleet-linux-x64' }}")` clause can never be true: in nightly.yml the fleet literal is mid-expression and every job ends in `'blacksmith-32vcpu-ubuntu-2404' }}`. The older Blacksmith disjunct still passes these jobs, so the test no longer checks the fleet route. Match the fleet literal inside the parenthesized early-runner expression instead.</violation>
</file>

<file name="scripts/ci/nightly_linux_admission.py">

<violation number="1" location="scripts/ci/nightly_linux_admission.py:130">
P1: This branch routes unplaced nightly jobs to Blacksmith after a receipt, violating the repository’s explicit no-Blacksmith nightly rule. Keep the fallback on the owned fleet unless that policy changes.</violation>
</file>

<file name=".github/workflows/ci-guards.yml">

<violation number="1" location=".github/workflows/ci-guards.yml:920">
P2: The admission test shares a `run` step with the placement test, so a placement-test failure exits the shell before the admission test runs. Give it a separate `!cancelled()` step so both guard failures are reported.</violation>
</file>

<file name=".github/workflows/nightly.yml">

<violation number="1" location=".github/workflows/nightly.yml:827">
P2: This always requests a `signer-build` lease even when the downstream signer job is disabled (the `sign_pool` input defaults to false). Omit jobs whose `if` conditions are false so an unused lease cannot consume fleet capacity or hold up admission for the controls that will run.</violation>
</file>

<file name="tests/test_ci_portable_job_placement.py">

<violation number="1" location="tests/test_ci_portable_job_placement.py:267">
P2: This change drops the wiring guard that `signer-build` never routes to a Mac mini. The signer artifact must stay on Linux, so keep that assertion for this job.</violation>

<violation number="2" location="tests/test_ci_portable_job_placement.py:267">
P3: The test name still promises a check that Blacksmith comes after the fleet, but the Blacksmith assertion was removed. Either restore an ordering assertion against `'blacksmith-` or rename the test to match what it now checks.</violation>
</file>

<file name="tests/test-execution.toml">

<violation number="1" location="tests/test-execution.toml:1427">
P2: This registers the new test in the `linux-guard` lane, which runs it in CI. AGENTS.md forbids adding CI tests, and recent additions use `lane = "manual"` with a `reason` instead. Mark it manual and run it on the fleet yourself.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread scripts/ci/nightly_linux_admission.py Resolved
Comment on lines +223 to +224
self.assertTrue("needs.decide.outputs.early_" in runs_on
and runs_on.endswith("|| 'cmux-fleet-linux-x64' }}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The new endswith("|| 'cmux-fleet-linux-x64' }}") clause can never be true: in nightly.yml the fleet literal is mid-expression and every job ends in 'blacksmith-32vcpu-ubuntu-2404' }}. The older Blacksmith disjunct still passes these jobs, so the test no longer checks the fleet route. Match the fleet literal inside the parenthesized early-runner expression instead.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/test_ci_nightly_off_blacksmith.py, line 223:

<comment>The new `endswith("|| 'cmux-fleet-linux-x64' }}")` clause can never be true: in nightly.yml the fleet literal is mid-expression and every job ends in `'blacksmith-32vcpu-ubuntu-2404' }}`. The older Blacksmith disjunct still passes these jobs, so the test no longer checks the fleet route. Match the fleet literal inside the parenthesized early-runner expression instead.</comment>

<file context>
@@ -220,7 +220,9 @@ def test_light_nightly_overflow_stays_on_linux_without_a_fleet_pick(self) -> Non
                 # The sign pick takes GitHub-hosted Ubuntu, then Blacksmith Linux 4 vCPU on a re-run
                 # (tests/test_nightly_trusted_routing.py, the signer route).
-                self.assertTrue("vars.LINUX_RUNNER == 'blacksmith-16vcpu-ubuntu-2404' && 'blacksmith-16vcpu-ubuntu-2404' || " in runs_on
+                self.assertTrue("needs.decide.outputs.early_" in runs_on
+                                and runs_on.endswith("|| 'cmux-fleet-linux-x64' }}")
+                                or "vars.LINUX_RUNNER == 'blacksmith-16vcpu-ubuntu-2404' && 'blacksmith-16vcpu-ubuntu-2404' || " in runs_on
</file context>
Suggested change
self.assertTrue("needs.decide.outputs.early_" in runs_on
and runs_on.endswith("|| 'cmux-fleet-linux-x64' }}")
self.assertTrue("needs.decide.outputs.early_" in runs_on
and "|| 'cmux-fleet-linux-x64')" in runs_on

self.assertLess(mini, overflow)
selected = f"needs.decide.outputs.early_{name.replace('cmux-', '').replace('-', '_')}_runner"
self.assertIn(selected, route)
self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This change drops the wiring guard that signer-build never routes to a Mac mini. The signer artifact must stay on Linux, so keep that assertion for this job.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/test_ci_portable_job_placement.py, line 267:

<comment>This change drops the wiring guard that `signer-build` never routes to a Mac mini. The signer artifact must stay on Linux, so keep that assertion for this job.</comment>

<file context>
@@ -262,15 +262,10 @@ def test_early_nightly_controls_try_fleet_before_blacksmith_without_signing_secr
-                    self.assertLess(mini, overflow)
+                selected = f"needs.decide.outputs.early_{name.replace('cmux-', '').replace('-', '_')}_runner"
+                self.assertIn(selected, route)
+                self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))
+                self.assertIn("needs.decide.outputs.track == 'nightly-next'", route)
                 self.assertNotIn("secrets.APPLE", yaml.safe_dump(job))
</file context>
Suggested change
self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))
self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))
if name == "signer-build":
self.assertNotIn("mini_runner", route)

Comment thread tests/test-execution.toml
Comment on lines +1427 to +1428
path = "tests/test_nightly_linux_admission.py"
lane = "linux-guard"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This registers the new test in the linux-guard lane, which runs it in CI. AGENTS.md forbids adding CI tests, and recent additions use lane = "manual" with a reason instead. Mark it manual and run it on the fleet yourself.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/test-execution.toml, line 1427:

<comment>This registers the new test in the `linux-guard` lane, which runs it in CI. AGENTS.md forbids adding CI tests, and recent additions use `lane = "manual"` with a `reason` instead. Mark it manual and run it on the fleet yourself.</comment>

<file context>
@@ -1423,6 +1423,10 @@ lane = "linux-guard"
 lane = "linux-guard"
 
+[[test]]
+path = "tests/test_nightly_linux_admission.py"
+lane = "linux-guard"
+
</file context>
Suggested change
path = "tests/test_nightly_linux_admission.py"
lane = "linux-guard"
path = "tests/test_nightly_linux_admission.py"
lane = "manual"
reason = "Lawrence 2026-10-23: no new CI tests. Checks nightly Linux admission receipts and routing; run python3 tests/test_nightly_linux_admission.py yourself after changing scripts/ci/nightly_linux_admission.py or the nightly routing (no build)."

Comment on lines +920 to +922
run: |
python3 tests/test_ci_portable_job_placement.py
python3 tests/test_nightly_linux_admission.py

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The admission test shares a run step with the placement test, so a placement-test failure exits the shell before the admission test runs. Give it a separate !cancelled() step so both guard failures are reported.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/ci-guards.yml, line 920:

<comment>The admission test shares a `run` step with the placement test, so a placement-test failure exits the shell before the admission test runs. Give it a separate `!cancelled()` step so both guard failures are reported.</comment>

<file context>
@@ -917,7 +917,9 @@ jobs:
       - name: Validate portable placement (fleet Linux, then a free mini, then Blacksmith)
         if: ${{ !cancelled() && matrix.group == 'ci' }}
-        run: python3 tests/test_ci_portable_job_placement.py
+        run: |
+          python3 tests/test_ci_portable_job_placement.py
+          python3 tests/test_nightly_linux_admission.py
</file context>
Suggested change
run: |
python3 tests/test_ci_portable_job_placement.py
python3 tests/test_nightly_linux_admission.py
run: python3 tests/test_ci_portable_job_placement.py
- name: Validate nightly Linux admission
if: ${{ !cancelled() && matrix.group == 'ci' }}
run: python3 tests/test_nightly_linux_admission.py

Comment thread .github/workflows/nightly.yml Outdated
timeout-minutes: 5
env:
JOBS: resolve-nightly-cmux-tui-client pick-nightly-build-runner resolve-nightly-ghostty-cli-helper build-nightly-inputs find-nightly-next-recovery signer-build
JOBS: resolve-nightly-cmux-tui-client resolve-nightly-ghostty-cli-helper build-nightly-inputs find-nightly-next-recovery signer-build

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This always requests a signer-build lease even when the downstream signer job is disabled (the sign_pool input defaults to false). Omit jobs whose if conditions are false so an unused lease cannot consume fleet capacity or hold up admission for the controls that will run.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/nightly.yml, line 827:

<comment>This always requests a `signer-build` lease even when the downstream signer job is disabled (the `sign_pool` input defaults to false). Omit jobs whose `if` conditions are false so an unused lease cannot consume fleet capacity or hold up admission for the controls that will run.</comment>

<file context>
@@ -792,23 +799,52 @@ jobs:
         timeout-minutes: 5
         env:
-          JOBS: resolve-nightly-cmux-tui-client pick-nightly-build-runner resolve-nightly-ghostty-cli-helper build-nightly-inputs find-nightly-next-recovery signer-build
+          JOBS: resolve-nightly-cmux-tui-client resolve-nightly-ghostty-cli-helper build-nightly-inputs find-nightly-next-recovery signer-build
           # Keep the compiler artifact executable on the Linux signing jobs.
           LINUX_ONLY: signer-build
</file context>

self.assertLess(mini, overflow)
selected = f"needs.decide.outputs.early_{name.replace('cmux-', '').replace('-', '_')}_runner"
self.assertIn(selected, route)
self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The test name still promises a check that Blacksmith comes after the fleet, but the Blacksmith assertion was removed. Either restore an ordering assertion against 'blacksmith- or rename the test to match what it now checks.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/test_ci_portable_job_placement.py, line 267:

<comment>The test name still promises a check that Blacksmith comes after the fleet, but the Blacksmith assertion was removed. Either restore an ordering assertion against `'blacksmith-` or rename the test to match what it now checks.</comment>

<file context>
@@ -262,15 +262,10 @@ def test_early_nightly_controls_try_fleet_before_blacksmith_without_signing_secr
-                    self.assertLess(mini, overflow)
+                selected = f"needs.decide.outputs.early_{name.replace('cmux-', '').replace('-', '_')}_runner"
+                self.assertIn(selected, route)
+                self.assertLess(route.index(selected), route.index("'cmux-fleet-linux-x64'"))
+                self.assertIn("needs.decide.outputs.track == 'nightly-next'", route)
                 self.assertNotIn("secrets.APPLE", yaml.safe_dump(job))
</file context>

admission.validate(value, REQUEST)

def test_plain_public_http_cannot_supply_an_admission_receipt(self):
with mock.patch("urllib.request.urlopen", return_value=io.BytesIO(b"{}")):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The urllib.request.urlopen mock does nothing here because exchange goes through build_opener(...).open. Patch transport.urllib.request.build_opener, or assert that the opener is never built, so the test checks the no-network guarantee it names.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/test_nightly_linux_admission.py, line 58:

<comment>The `urllib.request.urlopen` mock does nothing here because `exchange` goes through `build_opener(...).open`. Patch `transport.urllib.request.build_opener`, or assert that the opener is never built, so the test checks the no-network guarantee it names.</comment>

<file context>
@@ -0,0 +1,274 @@
+            admission.validate(value, REQUEST)
+
+    def test_plain_public_http_cannot_supply_an_admission_receipt(self):
+        with mock.patch("urllib.request.urlopen", return_value=io.BytesIO(b"{}")):
+            with self.assertRaises(ValueError):
+                admission.exchange("http://203.0.113.1/v1/nightly-linux-admission")
</file context>

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at ec0df76

Reviewer: codex gpt-6.1-sol xhigh, fast tier.

Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at ec0df76

Visual verdict: no images; Leo tries the build

  1. [P2] [follow-up] nightly_linux_admission.py:122 — A valid overflow receipt still sends every job to configured minis when their capacity telemetry is unavailable or stale. This can leave controls queued despite authorized overflow. Limit unknown-capacity placement to unknown admission; preserve valid receipts when optional capacity reads fail.

  2. [P2] [follow-up] nightly_linux_admission.py:107 — The 200-second deadline is checked only before polling. Seven simulated 30-second exchanges return an accepted terminal receipt at 210 seconds. Bound each exchange by the remaining budget and enforce the deadline during response reads.

155 focused tests passed.

Follow-ups:

  • Make optional mini telemetry failures preserve validated overflow routing and receipts.
  • Enforce the admission client’s absolute deadline.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high): SHIP at 8ed7063. Reviewed 73dd28e..HEAD with no blocking findings. Four secret-free controls use validated per-job admission; stale outputs retain fleet fallback and delayed terminal decisions remain valid. Credentialed picker remains separate and signer-build is unchanged. Five focused regressions and diff whitespace checks passed independently. The lane also passed all 134 relevant policy tests.

@teamleaderleo
teamleaderleo merged commit 4510f25 into feat-cmux-next Nov 1, 2026
72 of 85 checks passed
@teamleaderleo
teamleaderleo deleted the lane/nightly-linux-control-admission branch November 1, 2026 04:48
@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026

Copy link
Copy Markdown

Found 1 test failure on Blacksmith runners:

Failure

Test View Logs
test_runtime_added_app_capabilities_are_runtime_only (main.StaticCapabilityRuntimeO
nlyTests.test_runtime_added_app_capabilities_are_runtime_only)/
test_runtime_added_app_capabilities_are_runtime_only (main.StaticCapabilityRuntimeO
nlyTests.test_runtime_added_app_capabilities_are_runtime_only)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

teamleaderleo added a commit that referenced this pull request Nov 1, 2026
…tialed set

fleet_linux now comes from place-early-mac (the credentialed picker stays off the GCP label, MAC_FIRST) and
reaches only the secret-free nightly Linux jobs; credentialed jobs keep #30158's validated ephemeral set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9093a0f1b2d0cbb0b2c

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 8ed70633 Deployed Nov 1, 2026 by teamleaderleo via wait for same-key tree publisher #93728
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:high Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant