Skip to content

cmux-next updates: pulled-build banner (Wait for the Fix / Roll Back) from pulled.json - #22896

Merged
teamleaderleo merged 6 commits into
feat-cmux-nextfrom
feat/pulled-build-banner-2
Oct 21, 2026
Merged

teamleaderleo merged 6 commits into
feat-cmux-nextfrom
feat/pulled-build-banner-2

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Nightly train PR 4 (teamleaderleo/leo-workspace#624, section 2): the pulled-build banner. Follows #22590 (Roll Back to Previous Version), which merged as 010e772.

Problem. When nightly-next-rollback.yml pulls a bad build off the feed, Macs already on it keep running it with no signal, and the only way back is knowing about updates.rollback.

Behavior.

  • The rollback workflow now also writes pulled.json next to the appcast (nightly-next/next/pulled.json in R2): [{build, reason, pulledAt, serve}], newest first, merged with the existing list, guarded by nightly-next-guard.py r2-key and a write-once / --replace-sha256 conditional upload. A build served again is dropped from the list.
  • The app (PulledBuildWatch) reads that list at launch and after every Sparkle update cycle (no polling). The legacy NIGHTLY feed also reads /nightly-next/next/pulled.json.
  • If the running build is listed, the update notice card says This Nightly Was Pulled with the reason, and offers Wait for the Fix (default, prominent, also the ×; remembered per build) and Roll Back, which runs UpdateDropBack and only shows when that rollback would run. A failed rollback shows its reason on the card.

Tests. PulledBuildWatchTests (list URLs, decode, wait-first/rollback actions, nothing-kept, not-listed, wait remembered across launches, rollback failure shown); tests/test_nightly_next_feed_rollback.py PulledListTests. Run on CI; not dogfooded in the app.

Localization. 5 new updater.pulled.* keys in Localizable.xcstrings with all 9 app locales.

Not in scope: the Updated toast / What's New work.

Agent session: cosmic-gray

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Adds a pulled-build banner to nightly updates so Macs running a build pulled from the feed get a signal instead of silently continuing.

Behavior

  • The rollback workflow now writes pulled.json next to the appcast, listing pulled builds with reason, timestamp, and the build being served instead; a failed write only warns (and the rollback summary says so), so the fix-forward still runs.
  • The app reads that list at launch and after every Sparkle update cycle; a pulled build shows a This Nightly Was Pulled notice with the reason, offering Wait for the Fix (default, remembered per build) and Roll Back to the kept build, shown only when a rollback would run.
  • The kept-build check runs once per pulled build, and a second Roll Back press while one runs is ignored.
  • A failed rollback shows its reason on the card; a build served again is removed from the list, and a build leaving the list clears a stale rollback failure.
  • The banner shows even when that update was snoozed.

Written for commit c23f92b. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 3 commits October 20, 2026 20:46
…e fix

nightly train design, section 2 / PR 4. nightly-next-rollback.yml now
also writes pulled.json next to the cmux NEXT appcast in the same run:
[{build, reason, pulledAt, serve}], merged with the existing list,
written once or with If-Match on the bytes it read, and a build served
again is cleared (nightly_next_feed_rollback.py pulled, with tests).

The app reads that list at launch and after every Sparkle update cycle
(PulledBuildWatch; the legacy NIGHTLY feed also reads /next/). When the
running build is listed, the update notice says This Nightly Was Pulled,
with the reason. It offers Wait for the Fix (the default, prominent, and
also the x; remembered per build) and Roll Back to the kept build
through UpdateDropBack, shown only when that rollback would run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15b04-1ea0-75e2-b2c3-ae36125663d9&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-n3eu4 created for this PR by the cmux coordinator.

teamleaderleo and others added 2 commits October 20, 2026 20:52
…nowned in the watch

The crash ratchet flagged pulledWatch! and three unowned captures: the watch is a
lazy property and its closures hold the updater weakly. A failed pulled.json write
is a warning, so fix-forward still runs (a re-run sees changed=false). A snoozed
update no longer hides the pulled banner, and a build leaving the list clears a
stale rollback failure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c8d-058a-7222-a98e-30cd2eaa4229&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

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

Review e06e101: 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=pr22896 -f ref=feat/pulled-build-banner-2 -f platform=macos -f backend_mode=local

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

CI passes on c23f92b096 (run 39554159342 attempt 1).
macOS jobs did not run: compile and app tests were 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by projects-3f on cosmic-gray · session

…nd ignores a second Roll Back

The check verifies the app bundle's signature on the main actor, so it no
longer runs after every update cycle. A Roll Back press while one runs is
ignored instead of starting a second swap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray
@cursor

cursor Bot commented Oct 21, 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphan sweep (owner session): independent subagent review passed (no blocking findings). Pushed c23f92b, which fixes two of its should-fix items:

  • The rollback check verifies the app's signature on the main actor. It now runs once per pulled build instead of after every update cycle.
  • A second Roll Back press while one is running is ignored (covered by a test).

Left as follow-ups: a confirmation step before Roll Back, and normalizing hand-written pulled.json entries.

Reds at c23f92b, all shared with base or every current PR:

PulledBuildWatchTests compiled in that job. The fleet compile-check of the app at merge ref 783d829 passed.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

merge-audit: #22896 merged at c23f92b without no SHIP review receipt on the head; no risk tier label. #23275 reverts it. To keep this change, add the missing evidence for c23f92b here; the next audit pass then closes #23275. Otherwise review and land #23275.

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): SHIP at c23f92b

This is a post-hoc independent review of the merged change (merge commit 311050c). It was read-only and nothing was run. risk:high (automatic trigger into the updater and rollback path).

Nothing blocks. Notes:

  • Roll Back on the banner swaps and quits with no confirmation, though updates.rollback is marked destructive (PulledBuildWatch.swift:160). Medium, follow-up.
  • signingTeam(of: Bundle.main) does a nested signature check on the main actor, and now runs unprompted when the running build is listed (UpdaterService+Rollback.swift:98). Low to medium.
  • rollbackChecked gets set even when the check returned nil, so Roll Back stays hidden until relaunch (:145). Low, fails safe.
  • Reason text and download size have no length limit (:153, :184). Low.

The merge-audit revert of this PR is handled separately. See leo-workspace briefs/2026-10-20-gui-push/revert-triage.md.

teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…ner (#23599)

updates.rollback is declared destructive: it swaps in the kept build and
quits, so every entrypoint a person uses must ask first. The pulled-build
banner's Roll Back (#22896) called the drop-back directly and quit with
no question. The palette and app menu did not ask either: the registry's
destructive gate reached the App's confirmation presenter, but
DestructiveConfirmation had no prompt for updates.rollback, and a nil
prompt runs without asking.

DestructiveConfirmation now asks "Roll Back to the Previous Version?" for
updates.rollback (text from UpdateDropBack.confirmation in
CmuxNextUpdater, with en and 20 translations), and the banner asks
through that same registry presenter (PulledBuildWatch.confirmRollBack,
wired in UpdateHandlers). Cancel runs nothing and leaves the banner as it
was; with no presenter wired nothing runs. The CLI and the control
method still need --confirm / confirm:true.

PulledBuildWatchTests cover Cancel (no rollback, banner unchanged, a
later confirmed press still runs), confirm, and no presenter.


Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ce6-07ef-7c43-8bd7-9f20d4c93180&host=cosmic-gray

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 22, 2026
…hover card with state pills (#23746)

* cmux NEXT agent chat: tests that a link chip never grows when its title loads (red)

[#22896](…/pull/22896) grew inline into "#22896 · cmux-next updates: …" once
the page title came in, reflowing the paragraph. These fail on the base: the
chip's text and icon must not change after metadata arrives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1602e-25ea-7611-8c79-d16df0c4058f&host=cosmic-gray

* cmux NEXT agent chat: a link chip's text and icon are fixed when it first draws

A pull request chip no longer appends its title (cv-chip__title), and a bare
address no longer swaps to the site's title and favicon once cmux learns them.
Both now show only in the hover card, so a hover or a late lookup never widens
the chip and reflows the reply.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1602e-25ea-7611-8c79-d16df0c4058f&host=cosmic-gray

* cmux NEXT agent chat: a tighter link hover card with state pills and base-red checks

Leo: "the styling/layout/spacing could be a bit better". The card's head is
one compact row: the favicon or GitHub mark inline beside the title (a pull
request's own title, cut to two lines), then Open and Open in. A pull request
card drops the github.com address footer; a web link keeps its masked address
under the title. One 12px inset and 8px between rows. The state is a pill
tinted in its colour (open green, merged purple, closed red). Checks whose
failures all fail on the base branch read muted "N failing (base)"; some of
them read "N failing, M on base". The pr.inspect answer gains an optional
failingOnBase, which the host does not send yet. Gallery: merged-with-base-reds
and closed pull request states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1602e-25ea-7611-8c79-d16df0c4058f&host=cosmic-gray

* cmux NEXT agent chat: a quieter pull request card (glyph colour, compact checks)

Leo, on a #22826 card: no state word and no pill. The state is the pull
request glyph's colour alone, as Claude draws it (open green, merged purple,
closed red, draft grey); the word stays as the glyph's accessible name.
Open and Open in are quiet borderless buttons with a hover background, the
card is tighter (8px/10px inset, 6px rows, no divider), a web card's address
sits under its title only when it says more than the host, and "+N −M" has no
dotted underline. An open pull request's checks are a compact "✓ 90 ✗ 10"
(◷ for running ones) with base's "(N already on base)" note, the ✗ muted when
every red is also red on base; a finished pull request shows no checks line
and no conflicts. The card stays on the tooltip's glass tokens.

This also clears the agent-pane-no-capsules red: the 999px state pill is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1602e-25ea-7611-8c79-d16df0c4058f&host=cosmic-gray

* Hover card test checks the liquid glass the card now uses

Base #23477 moved the link card onto .ui-glass, so the card rule sets no fill;
the test now pins the ui-glass class and the glass token fallback instead of
the old tooltip background.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a1602e-25ea-7611-8c79-d16df0c4058f&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant