Repository navigation
ci(cmux-next): the macOS cascade and the other pickers skip a Blacksmith label that started nothing - #28515
Merged
Conversation
…ith label that started nothing The cascade read only the oldest-wait stall rule, so a dead label whose queue was cleared counted its slots free and took jobs, overflow and the retry runner (2026-10-30: blacksmith-12vcpu-macos-26 started nothing for about a day). It now reads simple_pool_picker.blacksmith_dead() (cmux#28484) through one wrapper, simple_pool_picker.dead_macos_26(), which nightly_sign_runner.dead() and the ci.yml picker share: - next_macos_cascade: a dead label is stalled (no slot, no retry_runner), a feed's compile counts it full (fresh_stalled), a dead 6 vCPU takes no overflow even beside a dead-end owned route, and a snapshot too old for counts still keeps a feed's compile off a dead 6 vCPU. - nightly_sign_runner.pick(): an unverified pick skips a dead variable label. dev_landing_place.py's overflow (OVERFLOW_LABEL, 12 vCPU) and nightly_build_runner.py read this pick. - nightly_build_runner.blacksmith_route(): a stale snapshot's dead label is no alternative to the excluded one. - simple_pool_picker.state_from(): a dead macOS 26 label has no free slot. With every label dead, a truncated listing, an older janitor or a snapshot past six hours, nothing changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-0b4091cd6a9b72e19edf
…dule copy nightly_build_runner's tests patch sys.modules' nightly_sign_runner; a fresh load() there broke them when the suites ran in one process. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-0b4091cd6a9b72e19edf
Contributor
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
|
Collaborator
Author
|
Owned by an agent session · session |
Contributor
|
Shipped in:
|
This branch was previously deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What was wrong
#28480 (main) and #28484 (feat-cmux-next) added the dead-label rule (
simple_pool_picker.blacksmith_dead(): nothing running on a label and no job started on it in the hour before the snapshot; a truncated snapshot proves nothing) to the DEV daily picker andnightly_sign_runner.py. The cmux-next macOS cascade (next_macos_cascade.py) still judged Blacksmith labels by the oldest-wait stall rule alone. So onceblacksmith-12vcpu-macos-26's queue was cleared, its five slots read as free, and the cascade sent jobs, overflow and the bot'sretry_runnerto a label that had started nothing for about a day (2026-10-30).What changed
One wrapper,
simple_pool_picker.dead_macos_26(), built on #28484'sblacksmith_dead(), is now read by every picker on this branch. When every label shows dead it returns nothing, because with no label showing life the snapshot gives nothing to choose between. Pickers changed:next_macos_cascade.py:Seen.deadcarries the dead labels from the fresh snapshot, from a stale reservation reading, or from a snapshot only old enough to show dead labels (stale_seen(), up to the six-hour evidence window). A dead label:retry_runner;fresh_stalled);dead_end()no longer waives it.With no fresh counts, a feed's compile no longer takes a 6 vCPU label that the older snapshot shows dead.
nightly_sign_runner.pick(): with no fresh snapshot it skipped nothing. It now skips a dead variable label.dev_landing_place.py's overflow (OVERFLOW_LABEL, 12 vCPU) andnightly_build_runner.pyuse this pick.dead()now delegates to the cascade instead of keeping its own copy.nightly_build_runner.blacksmith_route(): a label a stale snapshot shows dead is no alternative to the excluded one.simple_pool_picker.state_from()(ci.yml's picker on this branch): a dead macOS 26 label has no free slot.Nothing changes when there is no start evidence: no
label_startedmap (an older janitor), a truncated listing, a snapshot older than six hours, or every label dead.The main side (ci.yml's
simple_pool_picker.state_from()there) is #28516.Tests
New regression tests, each run against the old scripts first. All 12 fail there (6 failures and 6 errors) and pass here:
tests/test_ci_next_macos_cascade.pyDeadLabel(5)tests/test_nightly_sign_runner.pytest_an_unverified_pick_skips_a_dead_variable_labeltests/test_nightly_build_runner.pyDeadLabeltests/test_dev_landing_place.pytest_the_overflow_skips_a_dead_label_a_stale_snapshot_showstests/test_ci_simple_pool_picker.pytest_a_dead_macos_26_label_with_its_queue_cleared_has_no_free_slotEvery suite that imports these pickers passes locally (19 files, including
test_cmux_next_checks_workflow.py,test_ci_side_lane_placement.py,test_ci_pr_runner_pool.pyandtest_ci_runs_on_fallback.py).Risk: placement only. It acts only on positive start evidence from a complete, recent snapshot, and the worst wrong call keeps a job on the label that last showed life.
Overlap: #28249 and #28391 (open, same owner lane family) add a separate
label_full_or_deadadapter fed bybs_healthandgates. This PR does not touch that adapter. The two compose: each only adds labels tostall.🤖 Generated with Claude Code
Agent session: agent session