Repository navigation
ci(nightly): republish a verified nightly-next build with the tip's publication tooling - #35588
Conversation
…ooling New dispatch inputs nightly_next_republish_run / _attempt. On nightly-next only, the run builds, signs and notarizes nothing: republish-nightly-next (no secrets) checks that the source is a completed nightly-next push whose signing job and both verify jobs passed in that attempt, fetches its variant, tested digests, SSH daemon assets, source archive and Chromium pack by GitHub-recorded digest, requires every DMG to be one its verify job tested, and hands them over in the recovered layout. publish-nightly publishes it as a recovered build, so the lease, recheck, lineage/webview gate, digest match and every write run from the tip's .publish-tooling unchanged. find-nightly-next-recovery skips a republish. Motivation: run 41815641855 built, notarized and verified build 4181564185501 and published nothing (supersede bug, #35436); the fix needed a 1.5 h rebuild. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
|
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)
Shipped in:
|
|
Owned by an agent session · session |
|
Found 18 test failures on Blacksmith runners: Failures
...and 8 more test failures. View all on Blacksmith
|
|
Review (codex, router-review): SHIP at 68fc1a8 Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 2. They land as checklist items in this PR's one follow-up tracking issue in this repo ( SHIP at 68fc1a8 Visual verdict: unchanged by this diff
Follow-ups:
|
…ld_only guards Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
|
Review (codex, router-review): SHIP at b1d50f5 Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 3. They land as checklist items in this PR's one follow-up tracking issue in this repo ( SHIP at b1d50f5 Visual verdict: no images; Leo tries the build The focused recovery and workflow test suites pass (74 and 157 tests).
Follow-ups:
|
Each push that touches .github/, tests/ or scripts/ci/ judges the guard profile at its tip, and 14 steps were red there. This clears nine (fork routing and the Blacksmith failover also need #35717): - full clones: commandRules.ts runs no git; it lists `git clone`'s --depth as a flag to skip when it names a shown command (#35137). - send-path caps: the dependency-cache timing record bound (#35237) and the local replica's file size bound (larger files read from the machine) refuse nothing a person sends; listed as safe. - fleet rule lints: a sample machine name in a colour test fixture, and a plan table row naming SecItemCopyMatching in prose; listed as safe. - pinned Xcode: drop the exemption for nightly.yml's launch-smoke-nightly, which no longer exists. - macOS job class: nightly.yml's republish-nightly-next (#35588) only downloads and re-uploads a verified build: portable-checks. - label events: the production cmux-vm jobs are gated first on github.ref == refs/heads/feat-cmux-next, which a pull_request event never has (its ref is refs/pull/N/merge); the guard now reads that, for pull_request only and only when no top-level || follows. - fork routing: tail-production and sweep-orphans-production take the fork pull-request branch before vars.LINUX_RUNNER, like their siblings. - supply chain: the jobs that mint the cmux-bot token (swift-test, generated-files, push-attribution, #35123) run in ci-routing-agent off pull requests, as macos-placement and compile-status do; tail-production reads its Cloudflare secrets in cmux-vm-production. - upload retention: the production journey's step table keeps 3 days. Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…F pack and source archive; report a failed fetch (#35735) Follow-ups F1-F3 from the review of #35588 at b1d50f5: - F1: publish-nightly publishes the Chromium runtime pack when the selected build has one. A republished build follows its source run (republish-nightly-next's cef), so a switch flipped since then neither drops a pack the app's pin names nor fails on one the source never made. - F2: a republished build whose source made no cmux-next source tarball publishes none (republish-verified-nightly.py's source_archive; the artifact always carries the license trees), instead of failing at `mv nightly-out/source-archive` after the feed was written. CMUX_NEXT_PUBLISH_SOURCE_ARCHIVE stays the switch. - F3: republish-nightly-next is in report-nightly-failure's needs, so a failed fetch opens the nightly failure issue. Agent-Session: https://cmux.com/deeplink/agent?id=aid-03add12a0ffdd7814ff4 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Adds a "republish this verified build with tip tooling" path to the NEXT nightly. Today publish-nightly runs
.publish-toolingfromgithub.sha, the build commit, so every fix to publishing needs a new ~1.5 h build before it reaches a build that already passed.Motivating runs:
With this PR, that build can go out with the fixed tooling and no rebuild:
The artifacts of that run expire on 2026-11-07 (3-day retention).
How it works
New inputs
nightly_next_republish_runandnightly_next_republish_attempt, built likenightly_next_unsigned_runand_attempt.deciderefuses them in these cases:workflow_dispatchonrefs/heads/nightly-nextA republish builds and submits nothing. It reuses
continue_only(now "this run builds and submits nothing"), so every build job skips as it does for a continuation.find-nightly-next-recoveryskips a republish. It forcesshould_build, so publication always runs and the recheck decides. The run title isRepublish nightly-next run N attempt M.New job
republish-nightly-nexthas no environment and no secrets, andactions: readonly. It runsscripts/ci/republish-verified-nightly.py, which followsresume-unsigned-nightly.pyand reuses its downloader. It refuses unless all of these hold:nightly.yml.build-sign-notarize-nightly (arm64),Verify signed nightly app (arm64),Verify final nightly DMG (arm64)andbuild-nightly-appsucceeded.await-nightly-tree-markerpassed or was skipped.If all of these hold, it uploads the build in the recovered layout as
cmux-nightly-republished-variant-arm64and-tested-arm64, pluscef-runtime-packif the source had one.publish-nightly gets a third way to start (
needs.republish-nightly-next.result == 'success'). Its "Select the build to publish" step picks the republished build assource=recovered. Every guard then runs unchanged from the tip's.publish-tooling:The gate's
RECOVERED_RUN_IDnow comes from the select step's newrun_idoutput, so it names whichever run the published build came from.Same as for a recovered build: no deltas, no release-note signing and no
published-in. The legacy-identity jobs are untouched. They read the live NEXT feed, so the next run signs the republished build as cmux NIGHTLY.Testing
From
tests/,python3 -m unittest test_nightly_next_recoverypasses all 74 tests (new:RepublishSourceTests,RepublishDecideTests,RepublishWorkflowTests). The new tests cover:validate, for good and untrusted sources, failed or other-attempt verify jobs, the tree marker, producer windows, digests, ambiguity, optional artifacts and the dSYM receiptrun_id, and that no kept guard names the republishAlso passing:
test_nightly_unsigned_resume,test_nightly_cmux_tui_resolve(the new job is exempt like the recovery jobs: it ships no source),test_nightly_trusted_routing,test_ci_runs_on_fallback,test_nightly_never_blacksmith,test_ci_nightly_off_blacksmith,test_workflow_file_size(421,724 bytes),test_gh_budget_wait,test_nightly_background_steps. Lint: actionlint, pluscheck-bash32-parse.shover 423 inline scripts.Observed / Not run
test_nightly_owned_minis_only,test_nightly_next_arm64_onlyandtest_ci_macos_xcode_selectionfail with the same failures on base, because they depend on the local environment./actions/runs/41815641855/attempts/1/jobs,/artifacts) fit the producer windows the validator checks.Changelog
none
Risk: high (release publication path). Merges on an independent SHIP receipt at the exact head.
Agent session: agent session
🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Summary
Adds a way to republish an already verified nightly-next build with the tip's publication tooling, so publication fixes reach builds that passed verification without a ~1.5-hour rebuild. Previously publish-nightly used the build commit's
.publish-tooling, so fixing a failed publication of a finished build required rebuilding it (run 41815641855 verified build 4181564185501 and then published nothing, a supersede bug fixed by #35436). New dispatch inputsnightly_next_republish_run/nightly_next_republish_attemptmake the run build nothing; a secret-freerepublish-nightly-nextjob fetches the source run's verified build and publish-nightly publishes it as a recovered build through every existing guard.Safety
published-in.Written for commit b1d50f5. Summary will update on new commits.