Skip to content

base red: tooling-tests registry, cmux-next checks and release-notary (highlights, capabilities, step coverage, arm64 recorder) - #30624

Merged
lawrencecchen merged 13 commits into
feat-cmux-nextfrom
fix/base-red-ci-checks
Nov 1, 2026
Merged

lawrencecchen merged 13 commits into
feat-cmux-nextfrom
fix/base-red-ci-checks

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Fixes the checks that are red on every feat-cmux-next pull request, whatever it changes (seen on #30407, #30496, #30501, #30503, #30509, #30518). Each commit fixes one check and names the change that broke it.

Check Failing part Cause Fix
tooling-tests validate_test_execution_registry.py: "tests/test_ci_blacksmith_linux_sizes.py: linux-guard lane is not run by any workflow" #30360 registered the test as linux-guard and added no ci-guards.yml step lane = "manual" with how to run it (no new CI tests, Lawrence 2026-10-23). The six unregistered tests in the same log get entries too: test_nightly_dedicated_mini.py is linux-guard (ci-guards.yml already runs it); the other five are manual
cmux-next checks / Checks job structure test_cmux_next_checks_workflow.py: 14 errors KeyError: 'run' #30221 added two steps after tree-preflight's inspect step, and the test read the job's last step The test reads the step by id (head, inspect). Assertions do not change
cmux-next checks / Tier routing test_cmux_next_route.py: AgentPageHibernationTests.swift flagged as running page JavaScript on a built bundle #30312 added waitUntilLoaded to that suite. Its pane loads AgentPaneSource.devURLVariable (a loopback port nobody serves), not the bundle The check counts AgentPaneSource.devURLVariable as the suite's own document, like loadHTMLString
cmux-next checks / Daemon capabilities export is fresh, and Script tests (daemon-capabilities-fresh.test.sh) Export does not list agent-session-start-no-cwd-v1 #30363 added the capability and did not update the export Regenerated with check-daemon-capabilities-fresh.py --write (the renderer base-autofix uses)
cmux-next checks / String tables store.updates.available: ja, km, ko, th, vi, zh-Hans, zh-Hant "expected a plain stringUnit or English's plural forms" #30288 gave those languages only the other form Adds their one form with the other text, as home.stopAll.couldNotStop does. Also adds the 12 languages #27883 left out of action.sidebar.compactList.toggle (needs_review)
nightly-guards / release-notary scripts/whats-new/test_digest.py: three highlights "need a tryIt action/deeplink or a docs link" #29920, #30334 and #27905 added highlights with none Each links its PR (pr:), as #29939 did
nightly-guards / release-notary tests/test_cmux_next_static_capability_runtime_only.py: agent-session-start-no-cwd-v1 missing from runtime_only #30363's capability is pushed by identify_capabilities at runtime, so the static manifest never lists it (every nightly's --static-only check would refuse it) It joins runtime_only in check-daemon-capabilities.sh, as #30447 did for agent-session-settings-v1
nightly-guards / release-notary tests/test_nightly_step_coverage.py: a stale and a missing entry #30200 removed "Read the visual gate's verdicts" and renamed "Fail with the gate when it holds the build" to "Record failed advisory verdict" .github/nightly-step-coverage.json follows: stale entry removed, renamed step keeps its plumbing entry
nightly-guards / release-notary tests/test_nightly_next_arm64_only.py: CalledProcessError in "Build nightly app (Release)" #30107 made that step source scripts/cmux-next/lib/compilation-cache.sh; the test's scratch tree did not have it The scratch tree gets the real file, as it does scripts/lib/rust-targets.sh. Assertions are the same
nightly-guards / release-notary tests/test_nightly_next_identity.py: test_each_app_reads_the_feed_its_publisher_writes #30278 made NIGHTLY_FEEDS a YAML anchor and aliases; the test read the raw text The test's job_env resolves an alias to its one anchor and drops the anchor name, as YAML does. Asserted values are the same

Companion workflows: its red on #30407 (test_car_guards.py) is already green at the tip. No check was made weaker, and no CI job, step or gate was added.

Red and green

Each command was run on this Linux VM. "Red" is at base 03423dead871; "green" is at this head (after merging origin/feat-cmux-next):

  • python3 scripts/ci/validate_test_execution_registry.py --pr-lanes feat-cmux-next --base-sha HEAD^1: red exit 1, green exit 0 (594 tests).
  • python3 tests/test_cmux_next_checks_workflow.py: red FAILED (errors=14), green 165 OK.
  • python3 tests/test_cmux_next_route.py: red FAILED (failures=1), green 112 OK.
  • python3 scripts/cmux-next/check-daemon-capabilities-fresh.py: red exit 1, green exit 0. bash scripts/cmux-next/tests/daemon-capabilities-fresh.test.sh: green ok.
  • scripts/cmux-next/check-l10n.sh .: red 7 errors (19 without L10N_STYLE_WARN_MAX), green 0 errors.
  • python3 scripts/whats-new/test_digest.py: red FAILED (failures=1), green OK.
  • python3 tests/test_cmux_next_static_capability_runtime_only.py: red FAILED (failures=1), green OK.
  • python3 tests/test_nightly_step_coverage.py: red FAILED (failures=1), green OK.
  • GITHUB_STEP_SUMMARY=/tmp/s python3 tests/test_nightly_next_arm64_only.py: red CalledProcessError, green PASS.
  • python3 tests/test_nightly_next_identity.py: red 7/8, green 8/8.
  • Every script in the Checks job structure, Tier routing and Companion workflows steps passes at this head, except tests/test_next_batch.py. That test fails here only because this VM has git 2.43 and it needs 2.46 for attr.tree; CI is green on it.

Observed / Not run

  • Observed: each command above, red at base and green at head. test_pr_lane_coverage.py, test_ci_test_execution_registry.py and prepush-gate.py pass.
  • Not run: no Swift build or test (none of the changes is Swift source).

Still red in release-notary (not fixed here; each needs its owner's decision, comments are on the culprit PRs)

Changelog

none

…s manual and the unregistered tests

tooling-tests failed on every feat-cmux-next pull request at
"validate_test_execution_registry.py --pr-lanes feat-cmux-next":
  tests/test_ci_blacksmith_linux_sizes.py: linux-guard lane is not run by any workflow
#30360 (d57f2fc) registered the test as linux-guard but added no
ci-guards.yml step that runs it. CLAUDE.md forbids new CI tests (Lawrence
2026-10-23), so it becomes a manual entry with how to run it.

The registry also warned about six tests with no entry. test_nightly_dedicated_mini.py
is already run by ci-guards.yml, so it takes linux-guard; the other five are run
by no workflow and enter as manual, each with its own run command.

Red at 03423de:
  python3 scripts/ci/validate_test_execution_registry.py --pr-lanes feat-cmux-next --base-sha HEAD^1   exit 1
Green here: same command, exit 0 (594 tests, manual=31).
…t step by id

tests/test_cmux_next_checks_workflow.py read the preflight script as the last
step of cmux-tui-artifacts.yml's tree-preflight job. #30221 (5bdd4c9) added
"Record tree owner observation" and an upload step after it, so 14 tests failed
with KeyError: 'run' on every pull request. They now take the step by its id
(push-head-preflight's `head`, tree-preflight's `inspect`); the assertions do
not change.

Red at 03423de: python3 tests/test_cmux_next_checks_workflow.py   FAILED (errors=14)
Green here: same command, 165 tests OK.
…wn document

test_no_suite_runs_page_javascript_on_a_built_bundle flagged
AgentPageHibernationTests.swift after #30312 (b16b20c) made it call
waitUntilLoaded. That suite's agent pane loads AgentPaneSource.devURLVariable,
a loopback port nobody serves (Debug test builds honor it), not the built
bundle, so it reads no bundle content. The check now counts
AgentPaneSource.devURLVariable as a suite's own document, beside
loadHTMLString and the fixture roots.

Red at 03423de: python3 tests/test_cmux_next_route.py   FAILED (failures=1)
Green here: same command, 112 tests OK.
#30363 (efd30f5) added the optional capability agent-session-start-no-cwd-v1
to DaemonEndpoint.swift without the export, which reddened "Daemon capabilities
export is fresh" and the daemon-capabilities-fresh.test.sh script test.
Regenerated with the check's own renderer (--write), as base-autofix does.

Red at 03423de: python3 scripts/cmux-next/check-daemon-capabilities-fresh.py   exit 1
Green here: same command, exit 0; bash scripts/cmux-next/tests/daemon-capabilities-fresh.test.sh ok.
… forms in every language

#30288 (e6bfd26) made store.updates.available a plural with `one` and
`other`, but ja, km, ko, th, vi, zh-Hans and zh-Hant got only `other`, and
check-l10n.sh requires English's forms in every language. Their `one` form is
their `other` text, as home.stopAll.couldNotStop does.

Also adds the 12 languages #27883 (16b7cc2) left out of
action.sidebar.compactList.toggle (style debt CI only warns about), marked
needs_review.

Red at 03423de: scripts/cmux-next/check-l10n.sh .   7 errors (19 without L10N_STYLE_WARN_MAX)
Green here: same command, 0 errors.
scripts/whats-new/test_digest.py needs a try-it action, docs or a pr link on
every highlight. chat-title-plain (#29920), cloud-live-previews (#30334) and
working-harness-tab-icons (#27905) had none; each now links its pull request,
as #29939 did for priority-view-drag.

Red at 03423de: python3 scripts/whats-new/test_digest.py   FAILED (failures=1)
Green here: same command, OK.
@lawrencecchen lawrencecchen added the risk:low Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@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 85f31a0: 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=pr30624 -f ref=fix/base-red-ci-checks -f platform=macos -f backend_mode=local

Not verified: macOS jobs did not run: compile and app tests were skipped on 85f31a02a2; ci-status is green without them.

CI passes on 85f31a02a2 (run 41293797339 attempt 1).
macOS jobs did not run: compile and app tests were skipped: changes skipped, Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

Shipped in:

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

No issues found across 9 files

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

…sion-start-no-cwd-v1

#30363 (efd30f5) added agent-session-start-no-cwd-v1, which cmux-tui's
identify_capabilities pushes at runtime (capabilities.rs), so the bundled static
manifest never lists it. tests/test_cmux_next_static_capability_runtime_only.py
(release-notary, "Validate nightly push throttle") failed, and every nightly's
check-daemon-capabilities.sh --static-only would refuse the build. It joins
runtime_only, as #30447 did for agent-session-settings-v1.

Red at 03423de: python3 tests/test_cmux_next_static_capability_runtime_only.py   FAILED (failures=1)
Green here: same command, OK.
…al verdict steps

#30200 (86fd376) removed find-nightly-next-recovery's "Read the visual
gate's verdicts" and renamed visual-gate-nightly-verdict's "Fail with the gate
when it holds the build" to "Record failed advisory verdict" (same script,
visual-gate-fail-when-held.sh). .github/nightly-step-coverage.json kept the old
names, so tests/test_nightly_step_coverage.py failed. The stale entry goes and
the renamed step keeps its plumbing entry.

Red at 03423de: python3 tests/test_nightly_step_coverage.py   FAILED (failures=1)
Green here: same command, OK.
…he classifier the Release step sources

#30107 (2379dd9) made nightly.yml's "Build nightly app (Release)" source
scripts/cmux-next/lib/compilation-cache.sh. tests/test_nightly_next_arm64_only.py
runs that step in a scratch tree with recorder executables, and the tree had no
such file, so the step exited 1 before xcodebuild's recorder and the test failed
with CalledProcessError. The scratch tree now gets the real file, as it does
scripts/lib/rust-targets.sh. Every assertion is the same.

Red at 03423de: GITHUB_STEP_SUMMARY=/tmp/s python3 tests/test_nightly_next_arm64_only.py   CalledProcessError
Green here: same command, PASS: nightly-next arm64 only.
@lawrencecchen lawrencecchen changed the title base red: tooling-tests registry, cmux-next checks (structure, tier routing, capabilities, strings) and release-notary highlights base red: tooling-tests registry, cmux-next checks and release-notary (highlights, capabilities, step coverage, arm64 recorder) Nov 1, 2026
… job env as its value

#30278 (fe4577e) turned the publish jobs' NIGHTLY_FEEDS into a YAML anchor
(`&pub-feeds ${{ needs.decide.outputs.feeds }}`) and aliases (`*pub-feeds`).
tests/test_nightly_next_identity.py reads job env as raw text, so
test_each_app_reads_the_feed_its_publisher_writes failed on the anchor prefix.
job_env now resolves an alias to its one anchor and drops an anchor name, as
YAML does; the asserted values are the same.

Red at 03423de: python3 tests/test_nightly_next_identity.py   7/8 passed
Green here: same command, 8/8 passed.
@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.

@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:low Risk tier (docs/ci/risk-tiers.md) labels Nov 1, 2026
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (subagent, correctness first): SHIP at 85f31a0

The reviewer ran the repaired checks at this head, and all pass: the registry validator against origin/feat-cmux-next, test_ci_test_execution_registry, test_cmux_next_checks_workflow, test_cmux_next_route, check-daemon-capabilities-fresh, check-l10n, test_digest, test_cmux_next_static_capability_runtime_only, test_nightly_step_coverage, test_nightly_next_arm64_only and test_nightly_next_identity. For test_nightly_next_identity, the reviewer compared its job_env with yaml.safe_load on all 208 job-level env keys. No workflow file changes, so no CI job, step or gate is added. Non-blocking nits:

  • The devURLVariable exemption works on the whole file, like the existing .html" patterns do.
  • The step lookup in the test uses a bare assert.

@lawrencecchen lawrencecchen added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Nov 1, 2026
@lawrencecchen
lawrencecchen merged commit f5c3bb9 into feat-cmux-next Nov 1, 2026
146 of 155 checks passed
@lawrencecchen
lawrencecchen deleted the fix/base-red-ci-checks branch November 1, 2026 09:55
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…ze, universal build pin, warm sources, promotion admission, highlight) (#30824)

* base red: release-notary, warm-sources entries for the nightly controls #30249 routed to the dedicated mini

#30249 (d8f537d) let ten nightly.yml control jobs take the dedicated nightly
mini (vars.CI_NIGHTLY_ONLY_RUNNER), so tests/test_ci_warm_sources.py counts them
as Mac jobs, and they had no entry. Each takes mac-sign, the class of the other
nightly.yml Mac jobs that compile nothing, with an exemption that says what the
job does. cmux-tui-spec.yml:clippy (also unlisted; it wires Swatinem/rust-cache)
takes linux-rust with actions-cache, as its cmux-tui-spec peers do.

Red at 9288e32: python3 tests/test_ci_warm_sources.py   FAILED (11 unlisted jobs)
Green here: same command, OK.

* base red: release-notary, test_nightly_universal_build follows the merged helper route and admission gate

The test pins the full runs-on and if: of the nightly helper jobs. Two
merged changes moved them:
- #30249 (d8f537d) put the dedicated nightly mini (vars.CI_NIGHTLY_ONLY_RUNNER)
  first in build-nightly-ghostty-cli-helper's runs-on. The pinned expression
  now has that route; the merged workflow is the source of truth.
- #30284 (4e81bfe) added the early admission conjunct to the resolver and
  the helper lookup. The test now names it (EARLY_ADMISSION) and checks that the
  resolver and the helper carry it as one conjunct after their gate, and that
  build-nightly-app keeps its own gate (it is skipped with the resolver it needs).
  The build_only exclusion is checked the same way as before.

Red at 9288e32: bash ./tests/test_nightly_universal_build.sh   FAIL: nightly must build and hand off the macOS 26 helper ...
Green with the nightly.yml commit after this one: same command, PASS.

* base red: release-notary, the Ghostty helper build takes its lookup's admission gate; nightly.yml back under its headroom

tests/test_nightly_ghostty_helper_cache.py requires build-nightly-ghostty-cli-helper
and resolve-nightly-ghostty-cli-helper to share one if:. #30284 (4e81bfe)
added the early admission conjunct to the lookup on purpose; the helper build
now has it too, so it never builds while its lookup waits for admission.

tests/test_nightly_workflow_size.py: nightly.yml was 508,735 bytes, over the
508,000 headroom. The cache save steps repeated the same three R2 env values
six times each (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, CI_CACHE_R2_ENDPOINT);
each is now an anchor on its first use and an alias on the others, as
&pub-feeds, &pub-dmg and &pub-tooling already are. yaml.safe_load gives the
same workflow as before except the helper's if:. nightly.yml is 507,061 bytes.
No step is removed and no limit changes. (Job-level anchors are refused by
test_nightly_signer_jobs.py and runner_routing_table.py, and step aliases hide
text that test_nightly_notices_submodule.py and
test_nightly_promotion_admission.py count, so the anchors are on step env.)

Red at 9288e32:
  python3 tests/test_nightly_ghostty_helper_cache.py   FAILED (failures=1)
  python3 tests/test_nightly_workflow_size.py          508735 not less than 508000
Green here: both OK. All 123 tests that read nightly.yml: the same results as
at 9288e32 except these and test_nightly_universal_build.sh, now green.

* base red: release-notary, the promotion admission test reads the shared promote-guard checkout per job

#30471 (e27f116) shares promote-nightly-next's "Checkout the promote guard
from main" with promote-nightly-next-acked through the YAML anchor
&legacy-route-shared-4, so `scripts/ci/nightly_next_train.py` appears once in
the text and test_both_promote_decisions_pass_the_train_verifier (it counted
the text) failed. It now finds the two jobs that call guard.trainVerifier in
the parsed workflow and requires each to check out the verifier; it fails when
either job's checkout drops it (checked by removing it from the anchor).

Red at origin/feat-cmux-next 265c68a: python3 tests/test_nightly_promotion_admission.py   AssertionError
Green here: PASS (75 cases).

* base red: release-notary, the Cloud environment editor highlight links its pull request

#30357 (7d5f3ae) added release-notes/next/highlights/cloud-environment-editor.md
with no try-it action, docs or pr link, so scripts/whats-new/test_digest.py failed.
It links #30357, as #30624 did for three others.

Red at 265c68a: python3 scripts/whats-new/test_digest.py   FAILED (failures=1)
Green here: OK.
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…linux-guard become manual (#30872)

validate_test_execution_registry.py --pr-lanes feat-cmux-next failed on every
pull request:
  tests/test_ci_fast_checks_runner.py: linux-guard lane is not run by any workflow (#30648, ecc5d60)
  tests/test_nightly_next_control_rescue.py: same (#30657, e5d30ae)
  tests/test_nightly_next_control_runner.py: same (#30657)
No ci-guards.yml step runs them, and CLAUDE.md forbids new CI tests (Lawrence
2026-10-23), so each becomes a manual entry with its run command, as #30624 did
for test_ci_blacksmith_linux_sizes.py. All three pass (about 1 s each).

Red at 710d274: python3 scripts/ci/validate_test_execution_registry.py --pr-lanes feat-cmux-next --base-sha HEAD   exit 1
Green here: same command, exit 0 (599 tests, manual=36).
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…ve to scripts/ci/nightly-steps/) (#30912)

* base red: release-notary, warm-sources entries for the nightly controls #30249 routed to the dedicated mini

#30249 (d8f537d) let ten nightly.yml control jobs take the dedicated nightly
mini (vars.CI_NIGHTLY_ONLY_RUNNER), so tests/test_ci_warm_sources.py counts them
as Mac jobs, and they had no entry. Each takes mac-sign, the class of the other
nightly.yml Mac jobs that compile nothing, with an exemption that says what the
job does. cmux-tui-spec.yml:clippy (also unlisted; it wires Swatinem/rust-cache)
takes linux-rust with actions-cache, as its cmux-tui-spec peers do.

Red at 9288e32: python3 tests/test_ci_warm_sources.py   FAILED (11 unlisted jobs)
Green here: same command, OK.

* base red: release-notary, test_nightly_universal_build follows the merged helper route and admission gate

The test pins the full runs-on and if: of the nightly helper jobs. Two
merged changes moved them:
- #30249 (d8f537d) put the dedicated nightly mini (vars.CI_NIGHTLY_ONLY_RUNNER)
  first in build-nightly-ghostty-cli-helper's runs-on. The pinned expression
  now has that route; the merged workflow is the source of truth.
- #30284 (4e81bfe) added the early admission conjunct to the resolver and
  the helper lookup. The test now names it (EARLY_ADMISSION) and checks that the
  resolver and the helper carry it as one conjunct after their gate, and that
  build-nightly-app keeps its own gate (it is skipped with the resolver it needs).
  The build_only exclusion is checked the same way as before.

Red at 9288e32: bash ./tests/test_nightly_universal_build.sh   FAIL: nightly must build and hand off the macOS 26 helper ...
Green with the nightly.yml commit after this one: same command, PASS.

* base red: release-notary, the Ghostty helper build takes its lookup's admission gate; nightly.yml back under its headroom

tests/test_nightly_ghostty_helper_cache.py requires build-nightly-ghostty-cli-helper
and resolve-nightly-ghostty-cli-helper to share one if:. #30284 (4e81bfe)
added the early admission conjunct to the lookup on purpose; the helper build
now has it too, so it never builds while its lookup waits for admission.

tests/test_nightly_workflow_size.py: nightly.yml was 508,735 bytes, over the
508,000 headroom. The cache save steps repeated the same three R2 env values
six times each (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, CI_CACHE_R2_ENDPOINT);
each is now an anchor on its first use and an alias on the others, as
&pub-feeds, &pub-dmg and &pub-tooling already are. yaml.safe_load gives the
same workflow as before except the helper's if:. nightly.yml is 507,061 bytes.
No step is removed and no limit changes. (Job-level anchors are refused by
test_nightly_signer_jobs.py and runner_routing_table.py, and step aliases hide
text that test_nightly_notices_submodule.py and
test_nightly_promotion_admission.py count, so the anchors are on step env.)

Red at 9288e32:
  python3 tests/test_nightly_ghostty_helper_cache.py   FAILED (failures=1)
  python3 tests/test_nightly_workflow_size.py          508735 not less than 508000
Green here: both OK. All 123 tests that read nightly.yml: the same results as
at 9288e32 except these and test_nightly_universal_build.sh, now green.

* base red: release-notary, the promotion admission test reads the shared promote-guard checkout per job

#30471 (e27f116) shares promote-nightly-next's "Checkout the promote guard
from main" with promote-nightly-next-acked through the YAML anchor
&legacy-route-shared-4, so `scripts/ci/nightly_next_train.py` appears once in
the text and test_both_promote_decisions_pass_the_train_verifier (it counted
the text) failed. It now finds the two jobs that call guard.trainVerifier in
the parsed workflow and requires each to check out the verifier; it fails when
either job's checkout drops it (checked by removing it from the anchor).

Red at origin/feat-cmux-next 265c68a: python3 tests/test_nightly_promotion_admission.py   AssertionError
Green here: PASS (75 cases).

* base red: release-notary, the Cloud environment editor highlight links its pull request

#30357 (7d5f3ae) added release-notes/next/highlights/cloud-environment-editor.md
with no try-it action, docs or pr link, so scripts/whats-new/test_digest.py failed.
It links #30357, as #30624 did for three others.

Red at 265c68a: python3 scripts/whats-new/test_digest.py   FAILED (failures=1)
Green here: OK.

* base red: preflight, nightly.yml back under its 490,000-byte budget: 30 run blocks move to scripts/ci/nightly-steps/

tests/test_workflow_file_size.py (ci-guards preflight) caps nightly.yml at 490,000 bytes;
it was 505,604 after #30824 (508,735 before it), red on every pull request. Lead
decision 17:37Z: move run blocks, as #25879 did.

30 `run: |` blocks move verbatim into scripts/ci/nightly-steps/<name>.sh; each step now
runs `bash scripts/ci/nightly-steps/<name>.sh` with the same env:, if:, id:, shell and
working directory. yaml.safe_load gives the same jobs and steps as before except those
30 run strings, and tests/nightly_workflow_text.py puts the scripts back inline
byte-identical to the old workflow. nightly.yml goes from 505,604 to 486,014 bytes.

Which blocks:
- Every block uses no ${{ }} expression and starts with `set -euo pipefail`, so the
  script sets the same shell options the inline block did (bash scripts/x.sh does not
  inherit GitHub's `bash -e`).
- No block has a working-directory, runs inside a checkout it performs, or is a
  security gate whose text a test pins ("Hold the whole Mac before any credential").
- Each step's script is in the tree the step runs on: steps in refresh-compilation-cache,
  refresh-test-compilation-cache and resolve-nightly-cmux-tui-client check out the
  workflow commit (decide's head_sha is context.sha); steps in build-nightly-app,
  build-nightly-ghostty-cli-helper and build-nightly-remote-daemon check out build_sha
  and are skipped by an unsigned resume, the run that builds an older saved tree.

Tests that read the raw nightly.yml text for a moved block now read it through
tests/nightly_workflow_text.py (expand), as #25879 set up; what they check is unchanged.
The new scripts pass shellcheck -S warning (the level actionlint gives shellcheck), and
actionlint reports the same 5 findings on nightly.yml as before (unused anchors).

Red at 6238504 (#30824 head): python3 tests/test_workflow_file_size.py   505604 not less than 490000
Green here: OK. All 124 tests that read nightly.yml: the same results as at 6238504
except test_workflow_file_size.py, now green.

---------

Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
… registered as linux-guard becomes manual (#31065)

validate_test_execution_registry.py --pr-lanes feat-cmux-next failed on every pull request
(seen on #31013):
  tests/test_ci_overflow_pick_reads_pool.py: linux-guard lane is not run by any workflow
#30878 (da249ca) registered it as linux-guard and added no ci-guards.yml step. CLAUDE.md
forbids new CI tests (Lawrence 2026-10-23), so it becomes a manual entry with its run
command, as #30624 and #30872 did. The test passes (about 2 s).

Red at 9dee26d: python3 scripts/ci/validate_test_execution_registry.py --pr-lanes feat-cmux-next --base-sha HEAD   exit 1
Green here: same command, exit 0.
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
… notes into scripts, expressions through env) (#31013)

* base red: release-notary, warm-sources entries for the nightly controls #30249 routed to the dedicated mini

#30249 (d8f537d) let ten nightly.yml control jobs take the dedicated nightly
mini (vars.CI_NIGHTLY_ONLY_RUNNER), so tests/test_ci_warm_sources.py counts them
as Mac jobs, and they had no entry. Each takes mac-sign, the class of the other
nightly.yml Mac jobs that compile nothing, with an exemption that says what the
job does. cmux-tui-spec.yml:clippy (also unlisted; it wires Swatinem/rust-cache)
takes linux-rust with actions-cache, as its cmux-tui-spec peers do.

Red at 9288e32: python3 tests/test_ci_warm_sources.py   FAILED (11 unlisted jobs)
Green here: same command, OK.

* base red: release-notary, test_nightly_universal_build follows the merged helper route and admission gate

The test pins the full runs-on and if: of the nightly helper jobs. Two
merged changes moved them:
- #30249 (d8f537d) put the dedicated nightly mini (vars.CI_NIGHTLY_ONLY_RUNNER)
  first in build-nightly-ghostty-cli-helper's runs-on. The pinned expression
  now has that route; the merged workflow is the source of truth.
- #30284 (4e81bfe) added the early admission conjunct to the resolver and
  the helper lookup. The test now names it (EARLY_ADMISSION) and checks that the
  resolver and the helper carry it as one conjunct after their gate, and that
  build-nightly-app keeps its own gate (it is skipped with the resolver it needs).
  The build_only exclusion is checked the same way as before.

Red at 9288e32: bash ./tests/test_nightly_universal_build.sh   FAIL: nightly must build and hand off the macOS 26 helper ...
Green with the nightly.yml commit after this one: same command, PASS.

* base red: release-notary, the Ghostty helper build takes its lookup's admission gate; nightly.yml back under its headroom

tests/test_nightly_ghostty_helper_cache.py requires build-nightly-ghostty-cli-helper
and resolve-nightly-ghostty-cli-helper to share one if:. #30284 (4e81bfe)
added the early admission conjunct to the lookup on purpose; the helper build
now has it too, so it never builds while its lookup waits for admission.

tests/test_nightly_workflow_size.py: nightly.yml was 508,735 bytes, over the
508,000 headroom. The cache save steps repeated the same three R2 env values
six times each (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, CI_CACHE_R2_ENDPOINT);
each is now an anchor on its first use and an alias on the others, as
&pub-feeds, &pub-dmg and &pub-tooling already are. yaml.safe_load gives the
same workflow as before except the helper's if:. nightly.yml is 507,061 bytes.
No step is removed and no limit changes. (Job-level anchors are refused by
test_nightly_signer_jobs.py and runner_routing_table.py, and step aliases hide
text that test_nightly_notices_submodule.py and
test_nightly_promotion_admission.py count, so the anchors are on step env.)

Red at 9288e32:
  python3 tests/test_nightly_ghostty_helper_cache.py   FAILED (failures=1)
  python3 tests/test_nightly_workflow_size.py          508735 not less than 508000
Green here: both OK. All 123 tests that read nightly.yml: the same results as
at 9288e32 except these and test_nightly_universal_build.sh, now green.

* base red: release-notary, the promotion admission test reads the shared promote-guard checkout per job

#30471 (e27f116) shares promote-nightly-next's "Checkout the promote guard
from main" with promote-nightly-next-acked through the YAML anchor
&legacy-route-shared-4, so `scripts/ci/nightly_next_train.py` appears once in
the text and test_both_promote_decisions_pass_the_train_verifier (it counted
the text) failed. It now finds the two jobs that call guard.trainVerifier in
the parsed workflow and requires each to check out the verifier; it fails when
either job's checkout drops it (checked by removing it from the anchor).

Red at origin/feat-cmux-next 265c68a: python3 tests/test_nightly_promotion_admission.py   AssertionError
Green here: PASS (75 cases).

* base red: release-notary, the Cloud environment editor highlight links its pull request

#30357 (7d5f3ae) added release-notes/next/highlights/cloud-environment-editor.md
with no try-it action, docs or pr link, so scripts/whats-new/test_digest.py failed.
It links #30357, as #30624 did for three others.

Red at 265c68a: python3 scripts/whats-new/test_digest.py   FAILED (failures=1)
Green here: OK.

* base red: preflight, nightly.yml back under its 490,000-byte budget: 30 run blocks move to scripts/ci/nightly-steps/

tests/test_workflow_file_size.py (ci-guards preflight) caps nightly.yml at 490,000 bytes;
it was 505,604 after #30824 (508,735 before it), red on every pull request. Lead
decision 17:37Z: move run blocks, as #25879 did.

30 `run: |` blocks move verbatim into scripts/ci/nightly-steps/<name>.sh; each step now
runs `bash scripts/ci/nightly-steps/<name>.sh` with the same env:, if:, id:, shell and
working directory. yaml.safe_load gives the same jobs and steps as before except those
30 run strings, and tests/nightly_workflow_text.py puts the scripts back inline
byte-identical to the old workflow. nightly.yml goes from 505,604 to 486,014 bytes.

Which blocks:
- Every block uses no ${{ }} expression and starts with `set -euo pipefail`, so the
  script sets the same shell options the inline block did (bash scripts/x.sh does not
  inherit GitHub's `bash -e`).
- No block has a working-directory, runs inside a checkout it performs, or is a
  security gate whose text a test pins ("Hold the whole Mac before any credential").
- Each step's script is in the tree the step runs on: steps in refresh-compilation-cache,
  refresh-test-compilation-cache and resolve-nightly-cmux-tui-client check out the
  workflow commit (decide's head_sha is context.sha); steps in build-nightly-app,
  build-nightly-ghostty-cli-helper and build-nightly-remote-daemon check out build_sha
  and are skipped by an unsigned resume, the run that builds an older saved tree.

Tests that read the raw nightly.yml text for a moved block now read it through
tests/nightly_workflow_text.py (expand), as #25879 set up; what they check is unchanged.
The new scripts pass shellcheck -S warning (the level actionlint gives shellcheck), and
actionlint reports the same 5 findings on nightly.yml as before (unused anchors).

Red at 6238504 (#30824 head): python3 tests/test_workflow_file_size.py   505604 not less than 490000
Green here: OK. All 124 tests that read nightly.yml: the same results as at 6238504
except test_workflow_file_size.py, now green.

* ci(nightly): 14 more run blocks and the step notes move to scripts/ci/nightly-steps/; expressions reach scripts through env (headroom under the size budget)

After #30912 nightly.yml had 3,986 bytes left under tests/test_workflow_file_size.py's
490,000-byte cap, so the next nightly.yml change would turn preflight red on every
pull request again. Lead decision 13:2xZ: (a) the remaining safe blocks, (b) step
notes into their script's header, (c) the `${{ }}` blocks with each expression
passed through env. nightly.yml goes from 486,014 to 457,877 bytes (32,123 bytes of room).

(a) 7 blocks with no ${{ }} move verbatim as in #30912. Four of them (Fetch the
Chromium engine, Upload dSYMs to Sentry, Finish the dSYM upload to Sentry, Report a
missing daemon attestation) do not start with `set -euo pipefail`; they ran under
GitHub's default `bash -e {0}`, so they are called with `bash -e`, and
tests/nightly_workflow_text.py accepts that call form.

(c) 7 blocks used ${{ }} expressions. Each expression now sits in a new `env:` entry of
the same step and the script reads that variable in the same place, GitHub's pattern
against script injection. Each name is new to the workflow, read only by its script,
and never assigned there. `--allow-non-descendant`, which was spliced in unquoted
when non-empty and vanished when empty, is `${ALLOW_NON_DESCENDANT_FLAG:+"$ALLOW_NON_DESCENDANT_FLAG"}`:
one word or none, as before. Republish deltas and revised appcasts stays inline:
tests/test_nightly_republish_delta_guard.py runs its exact text, and its job is a
resume job.

(b) The comment lines above and inside 46 script-backed steps (only those whose script
is called once) move into the header of their script, under "The step's notes,
moved from nightly.yml". Comments of steps that keep inline code stay. yaml.safe_load
of nightly.yml is unchanged by this part.

Not moved: the run blocks of the 7 jobs an unsigned resume runs over an older
build_sha (build-sign-notarize-nightly, prepare-nightly-variant, prepare-nightly-variant-primary,
verify-signed-nightly, sign-release-notes, published-in, publish-nightly-reel). A resume
of a source compiled before this change would not find a new script. They move 8 days
after #30912 merged, when no unsigned copy of a pre-merge commit is left.

Tests: 8 tests that read the inline text of a moved block read the expanded view
(tests/nightly_workflow_text.py) or copy the script into their scratch tree;
test_nightly_trusted_routing and test_ci_fleet_compilation_cache check the expression
in the step's env and the variable in its script. What they check is unchanged.

Red at the size budget: none at #30912's head (486,014 < 490,000); the gain is headroom.
All 124 tests that read nightly.yml: the same results as at 17bf155 (all green).
shellcheck -S warning: clean on scripts/ci/nightly-steps/*.sh. actionlint 1.7.12-manaflow.1:
the same 5 findings on nightly.yml as before (unused anchors).

* ci(nightly): Generate deltas and revised appcast stays inline (its .publish-tooling checkout lists single files)

Review of #31013 at 8a2494b: generate-nightly-deltas checks out .publish-tooling
with a non-cone sparse list of five named files (anchor &checkout-the-gh-token-wrapper),
so scripts/ci/nightly-steps/deltas-generate-appcast.sh would not be in it and the step
would fail on every run, hidden by the job's continue-on-error. My selection matched
the directory name as a substring of the list. The step goes back exactly as on the
feat tip (block and its notes), the script is removed, and test_nightly_sparkle_key.sh
is back to the feat tip's text.

An exact check of all 140 step-script calls (the last checkout before each call that
provides its path, root or .publish-tooling, must contain the file: no sparse set,
a cone-mode directory or a non-cone pattern) finds no gap at this head; it found
exactly this one before the fix, and none in the feat tip's 127 calls.

nightly.yml: 458,313 bytes (31,687 under 490,000). All 124 tests that read nightly.yml:
the same results as at the feat tip 49aa291. shellcheck -S warning clean; actionlint:
the same 5 findings as before.

---------

Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>

This branch was previously deployed

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

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant