Repository navigation
cmux NEXT: Update Channel setting picks a release ring (Stable/Nightly/Canary/Dev) - #22781
Conversation
…anary/Dev) in the one cmux NEXT appcast Each ring accepts its own sparkle:channel tag and every slower ring's (cmux-next-stable < cmux-next < cmux-next-canary < cmux-next-dev). Nightly, the default, is the one tag every published item carries today, so nothing changes until CI publishes ring-tagged items. Sparkle's allowedChannels and the read-only probe both follow the ring; updates.status reports it. Design: cmuxterm-hq docs/release-rings.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
|
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)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green Tour of |
|
Bead |
…not grow (size cap) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
|
|
…t; probe filters by the baked feed like Sparkle) configure's ring is an optional String so the public default needs no CmuxUpdater type, and a call without it keeps the ring. The probe takes the allowed tags computed from the baked feed, as Sparkle's allowedChannels does, so a test feed is filtered the same way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
|
owner: 01a15c1c-9365-71b3-b73b-dc961610d618 |
…d's ring, as Sparkle does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
|
Found 1 test failure on Blacksmith runners: Failure
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
…m UpdaterService+Flow.swift) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
…el (fleet export at 1dce839) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c1c-9365-71b3-b73b-dc961610d618&host=huge-blue
Bugbot needs on-demand usage enabledBugbot 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. |
|
Human approval after the fact: Leo (teamleaderleo) approved this PR in the coordinator chat on 2026-10-20 ("I approved the 22781 ... this is not that bad"). It had merged through next-autoland without approval; no revert needed. Agent session: cosmic-gray |
|
Shipped in:
|
|
Shipped in:
|
…high (#23371) * ci(risk): an update channel setting is normal; the update path stays high Leo, after #22781: a settings-only channel toggle that reuses the signed feeds is not high-risk. UpdateTrack.swift and UpdatePreferences.swift (the channel and preference values) are now normal. Parsing, probing, installing and verifying an update stay high. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdac-78a0-ac2e-a3aef81402c7&host=cosmic-gray * ci(risk): the channel setting is UpdateRing, not UpdateTrack Review of #23371: UpdateTrack is the build's release line and decides whether Sparkle runs, so it stays high (now pinned by the test). The user's ring is UpdateRing in the CmuxUpdater package. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdac-78a0-ac2e-a3aef81402c7&host=cosmic-gray * ci(risk): the CmuxUpdater package is the update path Signature verification, the feed resolver, the Sparkle driver and the install code graded normal because no high rule named the package. Only UpdateRing stays normal; each file is pinned by a test that fails on base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdac-78a0-ac2e-a3aef81402c7&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…2974) * ci: run the feat-cmux-next risk tier gate from main, enforced now GitHub runs pull_request_target workflows from the default branch, so feat-cmux-next's risk-tier.yml never ran: no feat pull request got a risk label or a risk evidence check, and risk:high ones (updater, nightly.yml, signing) merged with no person looking (#22781, 2026-10-21). This copy on main grades feat-cmux-next pull requests with the classifier at the pull request's base commit (scripts/ci/risk_tier.py lives on feat-cmux-next), never the pull request's code, and holds high from now instead of after the feat copy's advisory window (2026-10-24). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdac-78a0-ac2e-a3aef81402c7&host=cosmic-gray * ci(risk): grade with the classifier at the tip of feat-cmux-next, not the pull request's stale base commit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdac-78a0-ac2e-a3aef81402c7&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Adds the
updates.channelsetting (Settings > General > Updates > "Update Channel"): Stable, Nightly (default), Canary or Dev. This is the client half of release rings. The design is cmuxterm-hqdocs/release-rings.md(manaflow-ai/cmuxterm-hq#2694, merged), with the sources it draws on inknowledge/inspiration/.sparkle:channeltags in the one cmux NEXT appcast (files-next.cmux.com/nightly-next/next/appcast-arm64.xml). The rings form a ladder, and each accepts its own tag plus every slower ring's:cmux-next-stable<cmux-next<cmux-next-canary<cmux-next-dev. There are no new feeds, bundle ids or keys.cmux-nextis the tag every published item carries now, andallowedSparkleChannelsfor the Nightly ring is the same set as before. Canary and Dev get exactly what Nightly gets until CI publishes ring-tagged items. Stable gets nothing until soaked items are tagged, and its help text says so.allowedChannels(for:)reads the ring fromUpdateDriver.ring(UpdateController.ring). The read-only probe (updates.check, tagged DEV builds) now parsessparkle:channeland skips items the ring doesn't accept, so it never reports an update Sparkle won't install. Untagged items are still offered on every ring.updates.statusreportsring. Agents can't change the setting (.userOnly): which builds a Mac installs is the person's call.Not in this PR:
sparkle_generate_appcast.shand the rollback workflow must keep each item's tag first.updates.web(cmux NEXT: signed web UI updates between app updates (every merge on NIGHTLY) #22777), whose default will follow this setting.Generated exports (
settings-schema.json,schemas/defaults/cmux-next.json,docs/mdm/*) are left to the autofix, per CLAUDE.md.Risk
risk:high, because this is the updater. The default (Nightly) leaves the accepted Sparkle tags exactly as they are, so nothing changes for anyone unless they pick another ring. A non-default ring only changes which items of the existing signed feed are offered. Sparkle's EdDSA check and its never-downgrade rule are unchanged.Changelog
Observed / Not run
python3 scripts/cmux-next/gen-settings-sources.py --checkpassed.python3 scripts/cmux-next/prepush-gate.pyreported no new violations.scripts/localization_catalog.py checkreported no errors for the 6 new keys (all 9 required locales; its other errors are already on base).UpdateRingTests,UpdateRingProbeTests). Agents don't compile on this host, so these run on CI. I haven't regenerated the settings exports.Agent session: huge-blue
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Adds the
updates.channelsetting (Settings > Updates > Update Channel) so users choose which release ring of cmux NEXT they get: Stable, Nightly (default), Canary, or Dev.sparkle:channeltags in the one cmux NEXT appcast; each ring accepts its own tag plus every slower ring's (stable < nightly < canary < dev), so a faster ring always gets at least what a slower ring gets and switching to a slower ring never downgrades.allowedChannels, the read-onlyupdates.checkprobe, andupdates.statusall follow the ring; the probe filters by the baked feed's allowed tags, like Sparkle does, so it never reports an update Sparkle won't install even on a test feed.configuretakes the ring as an optional String so the App needs noCmuxUpdatertype in its public API, and a call without it keeps the current ring. Agents can't change the setting (.userOnly).settings-schema.json, defaults,docs/mdm/*) are regenerated.Not included: CI publishing ring-tagged items, the App Store row, and the existing palette/CLI channel switch.
Written for commit dc92954. Summary will update on new commits.