Skip to content

Cloud welcome: show the 0.65.1 clip campaign once - #17243

Merged
austinywang merged 91 commits into
mainfrom
cloud-welcome-media
Oct 9, 2026
Merged

austinywang merged 91 commits into
mainfrom
cloud-welcome-media

Conversation

@lucasr1b

@lucasr1b lucasr1b commented Oct 4, 2026 •

Copy link
Copy Markdown
Collaborator

The Cloud welcome introduces the 0.65.1 release with five bundled, muted clips: creating a machine, keeping work running, opening a desktop, inviting a team, and collaborating on one machine.

Automatic presentation applies only to version 0.65.1, while Cloud is available and disabled. It writes cmux.cloud.welcome.seenVersion = 0.65.1 before presenting; a matching marker prevents later launches from repeating it, and an older marker upgrades to the current campaign. The DEBUG, XCTest, and UI-test guards from #17647 remain intact. DEBUG Help-menu previews still open the stacked, list, and list-with-dots layouts.

Missing media preserves the static hero; partial media preserves all feature rows with placeholders. Playback handles unreadable movies, cancelled duration loads, stale callbacks and timer cancellation. The fallback timer cancels on teardown, and the pause button sits outside the clip tap gesture.

The UI verification wrapper now reads genuine app stdout from the current xcresult when Xcode omits it from the outer log. It still requires socket-listener evidence, rejects the default debug socket, bounds diagnostic export, and preserves test failures. A registered Linux guard covers successful, missing, wrong-process, stale, unsafe, and unreadable receipts. No welcome behavior changed in this verification repair.

Verification

Head: 4b2929f232471dd7f43586793894a232035534b5, including main ce6be93cf232b381befbfcac8ff107f14fd40a02.

  • PR CI 37881637108, attempt 2: success. Compilation, warning budget, and selected native suites passed: 460 Swift tests in 34 suites, including CloudWelcome; XCTest reported 487 cases with 1 skipped and no failures. All three required checks passed. PR rollup: 42 passed, 21 skipped, no failed/pending checks.
  • Manual UI tour 37881998770, attempt 2: workflow success, including the post-test socket guard and runner completion. All 39 tour steps passed (1 XCTest, 0 failures or runtime warnings): no automatic popup, five clips, pause/resume, three Help previews, and dismissal. The wrapper reports Socket readiness confirmed in xcresult app stdout; the genuine listener receipt is at line 28 of the app stdout in the test-results artifact.
  • Focused CloudWelcomeTests 37881664237, attempt 2: success, 8 tests executed and passed for this head. Coverage includes release eligibility, older-marker upgrade and no-repeat, DEBUG/XCTest/UI-test suppression, all five bundled clips, and minimum dwell.
  • The socket-evidence regression failed at 166a5c52bdd and passed after 6ec0bc311d6. Its 8 tests also executed successfully in the Linux app-host execution guard. The full wrapper retry suite, isolation guard, registry tests, and CI change-routing tests passed locally. Scoped preflight passed 16/16 after the final wiring update (17/17 before it).
  • Independent correctness review found no actionable defect. All 13 review threads are resolved, including Cursor's timer-teardown and pause-control concerns. The conflict-only gate passed; worktree and submodules are clean.
  • Exact-head fleet job f9992337a4bc9d527119b85c: done, tag pr-17243-cloud-welcome-v13, with workspace-reset and after-cleanup evidence. Downloaded archive SHA-256: 2e4a7bc56fc11ff98dd0881bc9ee54c47ba08ba51f9df187db614c0e4e29c1cb. Bundle identity, commit metadata, and all five clips were verified. HQ link publication still returns HTTP 502; the controller artifact is valid and downloadable.

Stable 0.65.1 eligibility, older-marker upgrade, no-repeat, and dev/test suppression are unit-tested. The marker remains written before presentation, and #17647's startup guards are unchanged. The runtime build is 0.65.0 DEV; no live stable Release launch is claimed.

UI evidence

Fresh DEBUG Help previews from UI run 37881998770 at this head. The tour also verifies that the welcome is absent at launch and after dismissal.

4b2929f2 cloud welcome list

4b2929f2 cloud welcome desktop

4b2929f2 cloud welcome invite

Changelog

Added: The 0.65.1 Cloud welcome demonstrates Cloud features with five short clips and appears once for eligible stable users.

lucasr1b and others added 28 commits October 3, 2026 18:40
…he panel rebuilds

the cloud tab and settings > cloud now show enable cloud only when the plan
includes cloud and upgrade for free accounts. the plan answer lives on the
account flow (per account) instead of the panel's view state, so switching
sidebar modes no longer drops the button back to "checking your cmux plan…".
…e enable row until cloud is on, enable cloud machines title
…ep a known plan through failed or cancelled checks, recheck settings on account change
…ayouts, sidebar intro with banner and reasons, enablement view takes plain values (wip)
…sidebar intro titles by plan, 6pt buttons, drop the comparison layouts
…considered once per launch, size after hosting, no return shortcut, comments, orphaned string)
…s, debug items for each, clips read live in debug)
@coderabbitai

coderabbitai Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The Cloud welcome window now supports a media carousel with autoplay, manual navigation, and feature-list layouts. The window passes carousel options to the welcome view, and debug commands open previews of carousel variants.

Changes

Cloud welcome media carousel

Layer / File(s) Summary
Slide media and playback
Sources/Cloud/CloudWelcomeMedia.swift, Resources/Localizable.xcstrings, cmuxTests/CloudWelcomeTests.swift
The carousel defines five localized slides, locates supported media, and renders GIFs or muted looping movies. Playback timing supports pause and resume, Reduce Motion, and fallback durations. The test checks slide order and unique IDs.
Carousel layouts and navigation
Sources/Cloud/CloudWelcomeMedia.swift
The carousel adds stacked and feature-list layouts, slide selection, progress indicators, captions, and playback controls.
Welcome window integration
Sources/Cloud/CloudWelcomeView.swift, Sources/Cloud/CloudWelcomeWindowController.swift, Sources/App/CmuxHelpCommands.swift, Sources/Debug/CloudWelcomeDebugMenu.swift, cmux.xcodeproj/project.pbxproj
The welcome view selects the hero or carousel based on its options and available media. The controller forwards layout options and sizes the window to the hosting view. Debug commands preview carousel variants, and the project registers the new source and resources.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant CloudWelcomeWindowController
  participant CloudWelcomeAccountView
  participant CloudWelcomeView
  participant AVQueuePlayer
  CloudWelcomeWindowController->>CloudWelcomeAccountView: Pass carousel layout options
  CloudWelcomeAccountView->>CloudWelcomeView: Forward layout options
  CloudWelcomeView->>AVQueuePlayer: Play muted looping movie
  AVQueuePlayer->>CloudWelcomeView: Report completed loop
  CloudWelcomeView->>CloudWelcomeView: Advance slide when autoplay allows
Loading

Suggested reviewers: lawrencecchen

Merge Risk

Merge Risk: 🟡 Moderate · up to 4372c

The welcome window remains usable with its static fallback, but the proposed clips cannot play, and the first non-movie slide may advance early. Add the clips and correct the timer before merging the carousel.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 0e80b

The change is limited to welcome-screen presentation and local media playback. No change to account access or cloud permissions was identified. Remaining uncertainty concerns playback failure recovery and cleanup, rather than an identified remote attack path.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The newly introduced decoding exposure is local to the desktop application's welcome presentation. Controlling the default media input requires control over application resources or, in DEBUG builds, the developer checkout resource directory. The inspected flow does not accept tenant-selected or remotely supplied media URLs.

Trust Boundaries and Controls

  • observed — The new DEBUG layout commands use the existing direct presentation path rather than automatic availability checks. That direct preview path already existed in the base; the added callers do not introduce a release-build gate bypass or change account-action authority.

Resilience and Maintainability Implications

  • inferred — Current-player identity checks contain stale loop callbacks, and view teardown stops its owned player. Present-but-unreadable movies have no explicit failure-advancement path, so playback recovery may stall. The inspected consequences concern the local illustration, not a demonstrated loss of authorization or tenant isolation.

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (3 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Blocking Runtime Error The diff adds a production sleep-based wait in Sources/Cloud/CloudWelcomeMedia.swift:453-461. advanceWhenDone() calls ContinuousClock().sleep(for: .seconds(remaining)) before advancing GIF or pl… Replace the raw ContinuousClock.sleep with a cancellation-aware playback completion signal or an approved timer/scheduler abstraction for non-movie slides. Advance when that signal fires, and preserve cancellation when the user pauses, ch…
Cmux Swift @Concurrent Error loadDuration() adds movie-duration loading on the SwiftUI view’s UI isolation. Its .task(id:) call awaits AVURLAsset(url: url).load(.duration) directly at `Sources/Cloud/CloudWelcomeMedia.swift:… Move movie-duration loading into a nonisolated async helper marked @concurrent when supported, similar to gifDuration(_:). Have loadDuration() await that helper, then assign the result to duration on the UI actor. Alternatively, a…
Cmux Full Internationalization Error The PR adds 16 localization entries to Resources/Localizable.xcstrings, and every added entry omits 11 locales already present in the base catalog: bs, da, it, km, nb, pl, pt-BR, ru,… Add translated values for all 16 new keys in Resources/Localizable.xcstrings for bs, da, it, km, nb, pl, pt-BR, ru, th, tr, and uk. Verify each new entry covers all 20 locales represented in the base catalog and does…
Docstring Coverage Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 35 functions across 6 files. (2 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (21 passed)
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Cmux Cloud Persistent Session And Early Input Passed The check is not applicable to the changed behavior. The authoritative diff changes the Cloud welcome carousel, its debug menu and window presentation, localized copy, bundle resource registration, an…
Cmux Swift Actor Isolation Passed The production Swift changes introduce no matching actor-isolation mistake. CloudWelcomeMediaCarousel and the representable views are UI types. The shared mutable Playback class is explicitly `@Ma…
Cmux Browser Automation Off-Main Passed The pull request does not change browser socket automation. The changed-file inventory contains welcome UI, media, localization, project resources, and tests. The Swift diff contains no browser.* co…
Cmux Expensive Synchronous Load Passed The changed Swift code adds no agent-history store loads, transcript or trajectory reads, large JSON parsing, or directory scans. The only synchronous lookup is a bounded existence check for the five …
Cmux Cache Substitution Correctness Passed The diff introduces no cache substitution in a persistence, history, undo, or snapshot path. CloudWelcomeMediaCarousel keeps playback and clip duration in view-local @State and transient `Playback…
Cmux No Hacky Sleeps Passed The changed-file inventory contains Swift sources/tests, localization strings, a resource marker, and the Xcode project file. The project-file changes only register Swift files and the CloudWelcome re…
Cmux Algorithmic Complexity Passed The changed production collection work is bounded. CloudWelcomeView.body filters CloudWelcomeSlide.all, which defines exactly five slides, and the carousel iterates that same fixed slide set. Medi…
Cmux Swift Concurrency Passed The diff adds no background Dispatch work, Combine app state, or internal completion-handler API. The new async work uses SwiftUI .task modifiers tied to view lifetime, cancellation-aware sleep, and…
Cmux Swift Package Boundaries Passed The production Swift diff adds a welcome media carousel and small debug-menu wiring. CloudWelcomeMediaCarousel is SwiftUI presentation code, and its playback, file lookup, and GIF-duration helpers a…
Cmux Swiftpm Lockfiles Passed No SwiftPM lockfile policy failure is introduced. The PR changes cmux.xcodeproj/project.pbxproj only to add source and resource entries; its package-reference declarations are identical between base…
Cmux Swift Logging Passed No changed Swift logging violates the rule. The changed Swift diff contains no added print, debugPrint, dump, NSLog, logger declaration, or diagnostic file/stdout logging. `FileManager.default…
Cmux User-Facing Error Privacy Passed The changed code reaches users through the Cloud welcome window: AppDelegate.presentCloudWelcomeIfNeeded calls CloudWelcomeWindowController.presentIfNeeded, which presents CloudWelcomeView. The …
Cmux Swiftui State Layout Passed The SwiftUI diff does not introduce a pattern prohibited by the state/layout rule. New playback state uses @Observable with @State (Sources/Cloud/CloudWelcomeMedia.swift:95, 674-682). The featur…
Cmux Architecture Rethink Passed The Swift diff adds carousel behavior with one explicit Playback owner for slide index, pause state, and elapsed time (CloudWelcomeMedia.swift:674-749). The NSViewRepresentable bridge owns AVPla…
Cmux Swift Auxiliary Window Close Shortcuts Passed The slider layouts reuse the existing Cloud welcome NSWindow. Its stable cmux.cloud.welcome identifier remains assigned in CloudWelcomeWindowController.swift, and that identifier is registered in …
Cmux Source Artifacts Passed No changed path violates the source-control-artifacts rule. The changed files are application source, a test, project configuration, and a localization catalog. Resources/CloudWelcome/.gitkeep is an…
Cmux No Test Or Debug Seam In Production Source Passed The diff adds no test-observation accessor or state wrapper in production source. The new cloudWelcomeDebugMenuItems member is a #if DEBUG Help-menu facility in `Sources/Debug/CloudWelcomeDebugMen…
Title check Passed The title clearly and concisely identifies the main change: showing the 0.65.1 Cloud welcome clip campaign once.
Description check Passed The description provides a detailed summary, verification results, UI evidence, changelog entry, and known limitations. It is mostly complete, although it uses alternative headings instead of the temp…
Full details: Docstring Coverage

Explanation

Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 35 functions across 6 files. (2 skipped: 2 unsupported.)

Full details: Cmux Swift Blocking Runtime

Explanation

The diff adds a production sleep-based wait in Sources/Cloud/CloudWelcomeMedia.swift:453-461. advanceWhenDone() calls ContinuousClock().sleep(for: .seconds(remaining)) before advancing GIF or placeholder slides. The carousel is part of CloudWelcomeView and runs this task during normal presentation, so this is not test scaffolding or a short visual animation delay. The repository rule flags sleeps used for runtime timing, even when they suspend an async task.

Resolution

Replace the raw ContinuousClock.sleep with a cancellation-aware playback completion signal or an approved timer/scheduler abstraction for non-movie slides. Advance when that signal fires, and preserve cancellation when the user pauses, changes slides, or dismisses the carousel. Keep progress and advancement driven by the same playback state.

Full details: Cmux Swift `@Concurrent`

Explanation

loadDuration() adds movie-duration loading on the SwiftUI view’s UI isolation. Its .task(id:) call awaits AVURLAsset(url: url).load(.duration) directly at Sources/Cloud/CloudWelcomeMedia.swift:473-480. This media-file work has no explicit actor hop or @concurrent boundary. The GIF path already uses a @concurrent helper at lines 488-502, but the movie path does not. advanceWhenDone() and observePlayback() only coordinate playback and UI state, so they are intentionally UI-bound.

Resolution

Move movie-duration loading into a nonisolated async helper marked @concurrent when supported, similar to gifDuration(_:). Have loadDuration() await that helper, then assign the result to duration on the UI actor. Alternatively, add an explicit hop to a suitable non-UI actor for the media-file work and return the duration before updating UI state.

Full details: Cmux Full Internationalization

Explanation

The PR adds 16 localization entries to Resources/Localizable.xcstrings, and every added entry omits 11 locales already present in the base catalog: bs, da, it, km, nb, pl, pt-BR, ru, th, tr, and uk. The added welcome slide text and slider controls use localized Swift APIs, but the catalog entries only contain ar, de, en, es, fr, ja, ko, zh-Hans, and zh-Hant. This violates the rule requiring translations for every locale supported by the touched catalog.

Resolution

Add translated values for all 16 new keys in Resources/Localizable.xcstrings for bs, da, it, km, nb, pl, pt-BR, ru, th, tr, and uk. Verify each new entry covers all 20 locales represented in the base catalog and does not use placeholder or copied-English translations.

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Passes: CI passes on 4b2929f232.

CI passes on 4b2929f232 (run 37881637108 attempt 2).

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.

lucasr1b and others added 7 commits October 8, 2026 20:52
the first slide's clock only started for slides without a movie, so a
first clip never reached the 4 s minimum dwell and autoplay stayed on
slide 1 until someone clicked a row. start the clock before the movie
check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge-main commit by scripts/merge-main.sh.
Merged by scripts/merge-main.sh: origin/main at 09a51fb.

Resolved conflicts:
- Resources/Localizable.xcstrings: xcstrings key-level union
- cmux.xcodeproj/project.pbxproj: union of added entries, then normalize-pbxproj.py

Merge-main-previous-head: 1435797
Merge-main-base: 09a51fb

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

Stale Bugbot comment from a previous run.

Comment thread Sources/Cloud/CloudWelcomeMedia.swift

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

Stale Bugbot comment from a previous run.

Comment thread Sources/Cloud/CloudWelcomeMedia.swift Outdated

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 89500e6. Configure here.

Comment thread Sources/Cloud/CloudWelcomeMedia.swift
Merge-main commit by scripts/merge-main.sh.
Merged by scripts/merge-main.sh: origin/main at ed6ee7d.

Merge-main-previous-head: aba9449
Merge-main-base: ed6ee7d
Merge-main commit by scripts/merge-main.sh.
Merged by scripts/merge-main.sh: origin/main at ce6be93.

Merge-main-previous-head: cfe41e3
Merge-main-base: ce6be93
@austinywang austinywang changed the title cloud welcome: feature clips slider (draft, three layouts to pick from) Cloud welcome: show the 0.65.1 clip campaign once Oct 9, 2026
@austinywang
austinywang merged commit 3faf603 into main Oct 9, 2026
114 of 117 checks passed
@austinywang
austinywang deleted the cloud-welcome-media branch October 9, 2026 04:24
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Merge receipt for 4b2929f232: every check was green at merge (16 verified; 18 skipped by policy). Full suite runs on main after merge.

rustybret pushed a commit to rustybret/bmux that referenced this pull request Oct 9, 2026
3faf603 Cloud welcome: show the 0.65.1 clip campaign once (manaflow-ai#17243)

# Conflicts:
#	.github/workflows/ci-guards.yml
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.

3 participants