Repository navigation
cmux-next updates: pulled-build banner (Wait for the Fix / Roll Back) from pulled.json - #22896
Conversation
…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
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
…ulledBuildWatch 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
|
Bead |
…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
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
|
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 |
|
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
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. |
|
Orphan sweep (owner session): independent subagent review passed (no blocking findings). Pushed c23f92b, which fixes two of its should-fix items:
Left as follow-ups: a confirmation step before Roll Back, and normalizing hand-written 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. |
|
Shipped in:
|
|
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:
The merge-audit revert of this PR is handled separately. See leo-workspace |
…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>
…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>
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.ymlpulls a bad build off the feed, Macs already on it keep running it with no signal, and the only way back is knowing aboutupdates.rollback.Behavior.
pulled.jsonnext to the appcast (nightly-next/next/pulled.jsonin R2):[{build, reason, pulledAt, serve}], newest first, merged with the existing list, guarded bynightly-next-guard.py r2-keyand a write-once /--replace-sha256conditional upload. A build served again is dropped from the list.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.UpdateDropBackand 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.pyPulledListTests. Run on CI; not dogfooded in the app.Localization. 5 new
updater.pulled.*keys inLocalizable.xcstringswith all 9 app locales.Not in scope: the Updated toast / What's New work.
Agent session: cosmic-gray
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith 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
pulled.jsonnext 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.Written for commit c23f92b. Summary will update on new commits.