Skip to content

ci(nightly-next): decide takes the owned nightly slot first, Blacksmith Linux only on the rescue's re-run - #29650

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
ci/nightly-decide-owned-first
Oct 31, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
ci/nightly-decide-owned-first

Conversation

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Leo, 2026-10-31: "FOR OUR NIGHTLIES ARE THEY END TO END ON OUR FLEET? WE CAN'T BE RELYING ON BLACKSMITH THAT CUTS OUT" and "i mean the linux things cant our minis just run them".

What was wrong

Nightly run 41234993713 (tip 3017ef1) queued decide on blacksmith-32vcpu-ubuntu-2404. Its runs-on had only that label and vars.LINUX_RUNNER as a size switch, so there was no fleet route. Every other nightly job waits on decide. #29130 and #29436 moved the other light nightly jobs onto portable placement, but decide can't use that: it is the run's first job, so no picker or placement job can run before it.

test_light_nightly_jobs_stay_on_linux_while_the_overflow_switch_is_on only checked that these jobs stay on Linux, so the literal pin passed.

Change

  • decide runs-on: attempt 1 of a nightly-next push (CI_PR_POOL_OWNED == '1') now takes vars.CI_NIGHTLY_NEXT_BUILD_RUNNER. That is glaeda's nightly slot (glaeda-nightly-std-xcode-26.6), a runner on each mini that takes only nightly jobs, ahead of PR jobs.

    • Every other case still gets the Blacksmith Linux set as before: attempt 2+, a dispatch, main, forks, or the variable unset.
    • decide is a checkout, github-script and two stdlib Python helpers (nightly-publication-marker.py, nightly_build_inputs.py, both 3.9-clean). It holds no secret and does nothing Linux-specific.
  • Fallback: the main-branch owned-pool rescue already watches attempt 1 of every nightly-next push (nightly_target()), and its job_pool() matches the nightly slot through LANE_LABEL. When no slot takes decide within CI_OWNED_POOL_RESCUE_SECONDS (30 s here) and nothing in the run has started, it cancels and re-runs. Attempt 2 then takes Blacksmith Linux. That is the stall-aware failover. A started nightly is never cancelled (assess(reserved=True)).

  • .github/runners.json: adds nightly.yml#decide as portable-checks, with a picker_followup saying why it reads the slot variable rather than a picker output. runner_routing_table.portable_order() accepts the nightly slot as the mini term for nightly jobs.

  • Ratchet (the test that should have caught this): test_no_new_nightly_job_rides_blacksmith_linux_alone fails any nightly.yml job whose runs-on reaches Blacksmith Linux with no fleet term (slot, side lane, or a picker/placement owned output), unless the job is in BLACKSMITH_LINUX_ONLY_DEBT. That list must shrink: it also fails on an entry that has gained a fleet route. On base it fails with ['decide'].

  • test_decide_takes_the_owned_nightly_slot_then_blacksmith_linux (in test_nightly_trusted_routing.py) evaluates the expression for each case.

  • Rescue (owned_pool_rescue.py): nightly_watched() now also judges decide when it waits on a glaeda-nightly-* slot. The copy that runs is main's (ci-owned-pool-rescue.yml checks out ref: main), which already judges every job_pool() job. This keeps feat-cmux-next's copy in line, with a test.

Review: router-review gpt-6.1-sol xhigh BLOCK at 5ef6c4a (the rescue predicate), fixed in 9aa189a, then SHIP at 9aa189a. Follow-up: watch side/dev labels too if CI_NIGHTLY_NEXT_BUILD_RUNNER ever names one; today it names the nightly slot.

Not in this PR

The other 33 Blacksmith-Linux-only nightly jobs are in the debt list. Moving them needs a placement step ahead of each; the ones after build-nightly-app can reuse #29436's light placement. They are a follow-up, and the ratchet keeps the list from growing.

Checks run

These test files pass directly: test_nightly_trusted_routing, test_ci_nightly_off_blacksmith, test_runner_routing_table, test_ci_macos_xcode_selection, test_ci_owned_pool_sources, test_ci_nightly_no_hosted_mac, test_ci_linux_single_size. runner_routing_table.py exits 0. test_ci_blacksmith_linux_failover fails the same way on base.

Performance

metric before after delta harness
decide Blacksmith minutes per nightly-next push ~1 (32 vCPU, about 10 s busy plus setup) 0 when a nightly slot is idle about -1 per push run 41234993713 timings

Agent session: agent session

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits October 31, 2026 13:16
…th Linux on the rescue's re-run

Run 41234993713 (3017ef1) queued decide on blacksmith-32vcpu-ubuntu-2404,
a literal with no fleet route. decide is the run's first job, so no picker
can precede it: attempt 1 of a nightly-next push now asks for glaeda's
nightly slot (vars.CI_NIGHTLY_NEXT_BUILD_RUNNER), and the owned-pool rescue
already watching that attempt moves it to the Blacksmith Linux set.

test_ci_nightly_off_blacksmith gains a ratchet: a nightly job whose only
route is Blacksmith Linux fails unless it is in the listed debt, which may
only shrink. On base it fails naming decide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
The rescue that runs is main's copy (ci-owned-pool-rescue.yml checks out
ref: main), which already judges every job_pool() job, glaeda-nightly-*
included. This brings feat-cmux-next's copy in line so decide on the slot
is judged here too (review finding at 5ef6c4a).

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

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): SHIP at 9aa189a

Follow-ups:

  • [P2] Cover allowed side/dev labels in decide routing and rescue tests (only matters if CI_NIGHTLY_NEXT_BUILD_RUNNER is pointed at a side/dev label; it names the nightly slot today).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@teamleaderleo
teamleaderleo merged commit c80c3dc into feat-cmux-next Oct 31, 2026
77 checks passed
@teamleaderleo
teamleaderleo deleted the ci/nightly-decide-owned-first branch October 31, 2026 20:28
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 9aa189a: 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=pr29650 -f ref=ci/nightly-decide-owned-first -f platform=macos -f backend_mode=local

Shipped in:

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 9aa189ad Deployed Oct 31, 2026 by teamleaderleo via cmux-tui tree preflight #91319
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