Skip to content

ci(nightly): prefer reserved mini for secret-free signing checks - #30283

Merged
teamleaderleo merged 7 commits into
feat-cmux-nextfrom
lane/credentialed-nightly-signer-prepare-next
Nov 2, 2026
Merged

teamleaderleo merged 7 commits into
feat-cmux-nextfrom
lane/credentialed-nightly-signer-prepare-next

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

The secret-free signed-app verification and DMG-image jobs now consume the exact all-nightly M4 Pro reservation on same-repository NEXT attempt 1. The picker output prefers CI_NIGHTLY_ONLY_RUNNER=glaeda-nightly-only-m4pro, while malformed, unset, fork, other-track and retry contexts retain the existing owned-fleet and Blacksmith fallback.

This keeps release credentials, signing claims and temporary-keychain cleanup unchanged. The Linux ELF signer compiler and credentialed signer/notary jobs remain on the existing Linux picker; no release secret is routed to the reservation. The change is gated by the existing activation variable, which remains off until fleet registration and the exclusive claim hook are proven.

Leo asked: “For our nightlies, are they end to end on our fleet? We can't be relying on Blacksmith that cuts out.”

Validation:

  • python3 tests/test_nightly_dedicated_mini.py </dev/null (8 passed)
  • python3 tests/test_nightly_sign_runner.py </dev/null (46 passed)
  • python3 tests/test_nightly_trusted_routing.py </dev/null (35 passed)
  • python3 tests/test_ci_nightly_off_blacksmith.py </dev/null (20 passed)
  • YAML parse and git diff --check pass.

Follow-up: preparation jobs are covered by #30113 and its dedicated-preference follow-up; credentialed signer Mac support still requires the per-job keychain/notary-profile design tracked in HQ research #5742.

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

Makes the secret-free nightly verify and DMG-image jobs prefer the reserved glaeda-nightly-only-m4pro runner on same-repo nightly-next attempt 1.

  • The picker uses the reservation only when CI_NIGHTLY_ONLY_RUNNER is exactly set; unset, stale, or foreign values fall through to the existing owned-fleet and Blacksmith selection.
  • Release-pool signing jobs keep their runner and sign_owned contract, and no release secret routes to the reservation.
  • Gated by CI_NIGHTLY_ONLY_RUNNER, which stays off until fleet registration and the exclusive claim hook are proven.
  • Tests cover the reservation preference and fallback for forks, retries, other tracks, and invalid variable values.

Written for commit b900ccc. Summary will update on new commits.

View guided diff Turn on auto-fix

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent credentialed-controls-review): BLOCK at 94f901b

Blocking finding: python3 tests/test_ci_signing_owned_mac.py fails at LegacySignReRunTakesAnOwnedMacFirst.test_the_picker_runs_when_only_the_legacy_sign_does (line 478). The existing assertion requires outputs.sign_owned (with sign-owned renamed) to equal outputs.owned; this was true at the base, but the new owned expression now prepends the CI_NIGHTLY_ONLY_RUNNER reservation while sign_owned correctly remains unchanged. The code may intentionally separate secret-free reserved routing from credentialed signing, but the registered guard is now red on this head and must be updated/fixed forward before landing.

Focused checks otherwise pass: test_nightly_dedicated_mini.py (8), test_nightly_sign_runner.py (46), test_nightly_trusted_routing.py (35), test_ci_nightly_off_blacksmith.py (20), and test_nightly_signer_jobs.py (27). The new reservation reaches verify-signed-nightly, verify-final-dmg-nightly, and signer-dmg-image; credentialed sign-nightly-identity-legacy, signer-build, signer-app, signer-app-notary, and signer-dmg do not consume outputs.owned and retain their existing routes.

@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.

2 issues found across 3 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=".github/workflows/nightly.yml">

<violation number="1" location=".github/workflows/nightly.yml:4065">
P2: Use the full branch ref here so a manually dispatched tag named `nightly-next` cannot receive the reserved NEXT-only runner. Otherwise this regular nightly run also selects the reserved label and PR Xcode configuration, contrary to the fallback behavior for other tracks.</violation>
</file>

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

<violation number="1" location="tests/test_nightly_sign_runner.py:584">
P2: This weakens the regression test enough to allow retries to route to the reserved or legacy owned runner. Restore an exact assertion, or assert each attempt/event gate and its grouping, so a future routing change cannot bypass the attempt-1 and marker safeguards unnoticed.</violation>
</file>

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

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

# an unset, stale or foreign value falls through to the normal owned picker.
# Release-pool signing jobs consume sign_owned instead and keep their
# existing keychain and claim contract.
owned: ${{ github.repository == 'manaflow-ai/cmux' && github.ref_name == 'nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || (github.event_name == 'push' && github.run_attempt == 1 || steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}

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: Use the full branch ref here so a manually dispatched tag named nightly-next cannot receive the reserved NEXT-only runner. Otherwise this regular nightly run also selects the reserved label and PR Xcode configuration, contrary to the fallback behavior for other tracks.

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 4065:

<comment>Use the full branch ref here so a manually dispatched tag named `nightly-next` cannot receive the reserved NEXT-only runner. Otherwise this regular nightly run also selects the reserved label and PR Xcode configuration, contrary to the fallback behavior for other tracks.</comment>

<file context>
@@ -4057,7 +4057,12 @@ jobs:
+      # an unset, stale or foreign value falls through to the normal owned picker.
+      # Release-pool signing jobs consume sign_owned instead and keep their
+      # existing keychain and claim contract.
+      owned: ${{ github.repository == 'manaflow-ai/cmux' && github.ref_name == 'nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || (github.event_name == 'push' && github.run_attempt == 1 || steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}
       # A drained (or draining) owned Mac for the release signing jobs (sign-nightly-identity-legacy), as the JSON runs-on
       # array scripts/ci/signing_runner.py prints, or empty, under the same marker and `attempt` rules as `owned`.
</file context>
Suggested change
owned: ${{ github.repository == 'manaflow-ai/cmux' && github.ref_name == 'nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || (github.event_name == 'push' && github.run_attempt == 1 || steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}
owned: ${{ github.repository == 'manaflow-ai/cmux' && github.ref == 'refs/heads/nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || (github.event_name == 'push' && github.run_attempt == 1 || steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}

self.assertEqual(job["outputs"]["owned"],
"${{ (github.event_name == 'push' && github.run_attempt == 1 || "
"steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}")
owned_output = job["outputs"]["owned"]

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 weakens the regression test enough to allow retries to route to the reserved or legacy owned runner. Restore an exact assertion, or assert each attempt/event gate and its grouping, so a future routing change cannot bypass the attempt-1 and marker safeguards unnoticed.

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_sign_runner.py, line 584:

<comment>This weakens the regression test enough to allow retries to route to the reserved or legacy owned runner. Restore an exact assertion, or assert each attempt/event gate and its grouping, so a future routing change cannot bypass the attempt-1 and marker safeguards unnoticed.</comment>

<file context>
@@ -581,9 +581,11 @@ def test_no_job_that_holds_a_secret_reads_the_owned_pick(self) -> None:
-        self.assertEqual(job["outputs"]["owned"],
-                         "${{ (github.event_name == 'push' && github.run_attempt == 1 || "
-                         "steps.upload-marker.outcome == 'success') && steps.owned.outputs.owned || '' }}")
+        owned_output = job["outputs"]["owned"]
+        self.assertIn("vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro'", owned_output)
+        self.assertIn("github.repository == 'manaflow-ai/cmux'", owned_output)
</file context>

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

cursor Bot commented Nov 1, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent credentialed-controls-review): BLOCK at 8d9d896

The prior signing-owned-Mac invariant is fixed, but the exact head still has an own red: python3 tests/test_ci_nightly_off_blacksmith.py fails NightlyPooledRoutingTests.test_no_new_nightly_job_rides_blacksmith_linux_alone because BLACKSMITH_LINUX_ONLY_DEBT still lists pick-nightly-sign-runner. This commit changes that picker's runs-on to prefer the validated glaeda-nightly-only-m4pro, so the debt inventory must remove/update that entry before landing.

Other focused checks pass: test_ci_signing_owned_mac.py (21), test_nightly_dedicated_mini.py (8), test_nightly_sign_runner.py (46), test_nightly_trusted_routing.py (35), test_nightly_signer_jobs.py (27), and test_ci_nightly_no_hosted_mac.py (5). The dedicated preference remains limited to the secret-free verification/DMG-image consumers; sign_owned remains separate and credentialed signer jobs do not consume outputs.owned.

@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.

2 issues found across 3 files (changes from recent commits).

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_ci_signing_owned_mac.py">

<violation number="1" location="tests/test_ci_signing_owned_mac.py:482">
P2: These substring checks no longer enforce the marker predicates described by the test. Assert each output against its complete expected expression so retries cannot claim stale picks and the reservation remains restricted to its valid scope.</violation>
</file>

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

<violation number="1" location=".github/workflows/nightly.yml:4037">
P3: This reservation branch makes the picker run on `glaeda-nightly-only-m4pro`, but the preceding comment still says it always runs on Blacksmith Linux. Update the comment to document the reserved-Mac exception and its fallback.</violation>
</file>

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

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

# `sign_owned` output. Both outputs still stand on their marker rules.
self.assertIn("steps.sign-owned.outputs.owned", str(outputs["sign_owned"]))
self.assertNotIn("CI_NIGHTLY_ONLY_RUNNER", str(outputs["sign_owned"]))
self.assertIn("CI_NIGHTLY_ONLY_RUNNER", str(outputs["owned"]))

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: These substring checks no longer enforce the marker predicates described by the test. Assert each output against its complete expected expression so retries cannot claim stale picks and the reservation remains restricted to its valid scope.

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_signing_owned_mac.py, line 482:

<comment>These substring checks no longer enforce the marker predicates described by the test. Assert each output against its complete expected expression so retries cannot claim stale picks and the reservation remains restricted to its valid scope.</comment>

<file context>
@@ -474,8 +474,12 @@ def test_the_picker_runs_when_only_the_legacy_sign_does(self) -> None:
+        # `sign_owned` output. Both outputs still stand on their marker rules.
+        self.assertIn("steps.sign-owned.outputs.owned", str(outputs["sign_owned"]))
+        self.assertNotIn("CI_NIGHTLY_ONLY_RUNNER", str(outputs["sign_owned"]))
+        self.assertIn("CI_NIGHTLY_ONLY_RUNNER", str(outputs["owned"]))
 
 
</file context>

Comment thread .github/workflows/nightly.yml Outdated
# allowlisted Blacksmith Linux set even when RUNNER_POOLS is stale or
# points at a non-Blacksmith fleet member.
runs-on: ${{ github.repository_owner != 'manaflow-ai' && 'ubuntu-24.04' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository && 'blacksmith-4vcpu-ubuntu-2404' || contains(fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]'), fromJSON(vars.RUNNER_POOLS).linux) && fromJSON(vars.RUNNER_POOLS).linux || fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]')[0] }}
runs-on: ${{ github.repository_owner != 'manaflow-ai' && 'ubuntu-24.04' || github.repository == 'manaflow-ai/cmux' && github.ref_name == 'nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository && 'blacksmith-4vcpu-ubuntu-2404' || contains(fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]'), fromJSON(vars.RUNNER_POOLS).linux) && fromJSON(vars.RUNNER_POOLS).linux || fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]')[0] }}

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: This reservation branch makes the picker run on glaeda-nightly-only-m4pro, but the preceding comment still says it always runs on Blacksmith Linux. Update the comment to document the reserved-Mac exception and its fallback.

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 4037:

<comment>This reservation branch makes the picker run on `glaeda-nightly-only-m4pro`, but the preceding comment still says it always runs on Blacksmith Linux. Update the comment to document the reserved-Mac exception and its fallback.</comment>

<file context>
@@ -4034,7 +4034,7 @@ jobs:
     # allowlisted Blacksmith Linux set even when RUNNER_POOLS is stale or
     # points at a non-Blacksmith fleet member.
-    runs-on: ${{ github.repository_owner != 'manaflow-ai' && 'ubuntu-24.04' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository && 'blacksmith-4vcpu-ubuntu-2404' || contains(fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]'), fromJSON(vars.RUNNER_POOLS).linux) && fromJSON(vars.RUNNER_POOLS).linux || fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]')[0] }}
+    runs-on: ${{ github.repository_owner != 'manaflow-ai' && 'ubuntu-24.04' || github.repository == 'manaflow-ai/cmux' && github.ref_name == 'nightly-next' && github.run_attempt == 1 && vars.CI_NIGHTLY_ONLY_RUNNER == 'glaeda-nightly-only-m4pro' && vars.CI_NIGHTLY_ONLY_RUNNER || github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository && 'blacksmith-4vcpu-ubuntu-2404' || contains(fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]'), fromJSON(vars.RUNNER_POOLS).linux) && fromJSON(vars.RUNNER_POOLS).linux || fromJSON('["blacksmith-4vcpu-ubuntu-2404","blacksmith-16vcpu-ubuntu-2404","blacksmith-32vcpu-ubuntu-2404"]')[0] }}
     # The owned pick mints the routing token (GLAEDA_ROUTE_APP_KEY), so the key is read in the
     # routing environment, as pick-nightly-build-runner does (tests/test_supplychain_security.py).
</file context>

@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 fc06cd1: 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=pr30283 -f ref=lane/credentialed-nightly-signer-prepare-next -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 f22cb91; does not block

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 0771403 to this head): BLOCK at 2ec02f1.

[P1] [blocking] .github/workflows/nightly.yml:4037 - The new glaeda-nightly-only-m4pro branch makes pick-nightly-sign-runner a macOS-routed job, but .github/runners.json has no nightly.yml#pick-nightly-sign-runner entry and the github.ref_name form is not recognized as a valid nightly reservation. tests/test_runner_routing_table.py therefore fails in ci-guards. Keep this picker on its Linux route, or add compatible runner-map metadata and use the recognized reservation guard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 14 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in .github/workflows/nightly.yml, tests/test_ci_nightly_off_blacksmith.py, tests/test_ci_signing_owned_mac.py. Listed for a lane to resolve.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

…tialed-nightly-signer-prepare-next

# Conflicts:
#	.github/workflows/nightly.yml
#	tests/test_ci_nightly_off_blacksmith.py
#	tests/test_ci_signing_owned_mac.py
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at fc06cd1

Checked every consumer of pick-nightly-sign-runner.outputs.owned (verify-signed-nightly, verify-final-dmg-nightly, signer-dmg-image, verify-nightly-identity-legacy): none reads a secret or environment, and sign_owned (the credentialed path, parsed with fromJSON) is unchanged. owned is used as a bare label in runs-on and only compared to '' for CMUX_CI_XCODE_APP, so the plain label is safe; it matches what nightly_build_runner.py verify already emits for the reservation, and the picker job itself already runs on it. nightly.yml triggers only on push/schedule/workflow_dispatch, so ref_name gating cannot fire on scheduled runs. The three touched test files pass (10, 49, 23).
Follow-ups: [follow-up] the new short-circuit also takes workflow_dispatch attempt 1 without the owned-pool-watch marker; fine for a dedicated reservation, but it means a set-but-unserved CI_NIGHTLY_ONLY_RUNNER would strand the verify jobs with no stall failover (same exposure the picker job's own runs-on and the script already have). [follow-up] VERIFY_OWNED in test_nightly_dedicated_mini.py omits verify-nightly-identity-legacy, the fourth consumer.

@blacksmith-sh

blacksmith-sh Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Found 6 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp0yeaxiru/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmprvuw_y6x/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs

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

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 2, 2026 09:28 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 2, 2026 09:28 Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): SHIP at 8e52a62

SHIP at 8e52a62

Visual verdict: no images; Leo tries the build

Checked the routing expressions, fallback scenarios, YAML parsing, and focused nightly routing tests.

Follow-ups: none

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 2, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 2, 2026
cmux-bot[bot]
cmux-bot Bot previously approved these changes Nov 2, 2026

@cmux-bot cmux-bot 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.

cmux-bot approves 8e52a62: an independent review passed this exact head (next-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 2, 2026 10:05 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 2, 2026 10:07 Inactive
@cmux-bot
cmux-bot Bot dismissed their stale review November 2, 2026 10:13

A newer verdict blocks b900ccc (no independent SHIP at the head).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at b900ccc

Codex BLOCK from 2ec02f1 is resolved: pick-nightly-sign-runner's runs-on is now byte-identical to base's (#31642, github.ref == 'refs/heads/nightly-next' form) and .github/runners.json covers nightly.yml#pick-nightly-sign-runner. The remaining diff only changes the picker's owned output, which feeds verify-signed-nightly, verify-final-dmg-nightly, signer-dmg-image and verify-nightly-identity-legacy; none of those jobs reference secrets. or an environment, and credentialed legacy signing still reads sign_owned, which never names the reservation. Ran test_runner_routing_table (33), test_nightly_dedicated_mini (10), test_nightly_sign_runner (49), test_ci_signing_owned_mac (23), test_ci_nightly_off_blacksmith (21) at this head: all OK.

Follow-ups: [follow-up] the reservation path sets CMUX_CI_XCODE_APP to vars.CMUX_CI_XCODE_APP_PR, so the nightly-only reserved minis need that Xcode installed (worth one check once the label is advertised).

@teamleaderleo
teamleaderleo merged commit f0bca56 into feat-cmux-next Nov 2, 2026
154 of 161 checks passed
@teamleaderleo
teamleaderleo deleted the lane/credentialed-nightly-signer-prepare-next branch November 2, 2026 10:17

This branch was previously deployed

1 inactive deployment
ci-routing-agent — b900cccb Deployed Nov 2, 2026 by cmux-bot[bot] via wait for same-key tree publisher #100602
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