Skip to content

Issue #3931: Add goal supervision sidebar UI - #3961

Closed
austinywang wants to merge 35 commits into
mainfrom
issue-3931-goal-supervision-ui
Closed

austinywang wants to merge 35 commits into
mainfrom
issue-3931-goal-supervision-ui

Conversation

@austinywang

@austinywang austinywang commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Adds a dedicated Goals mode to the right sidebar and command palette.
  • Provides a first-pass persisted local goal record with title, acceptance criteria, linked workspace, lifecycle status, notes, and simple lifecycle metrics.
  • Keeps pause/resume semantics scoped to goal status transitions for this first slice; agent process snapshot/rehydration and PR/CI/cost automation should layer on top of this persisted goal model in follow-up PRs.

Implementation proposal

This PR intentionally starts with the native supervision surface and local goal lifecycle record rather than attempting the full multi-day orchestration backend in one change. The next durable steps are:

  1. Link goals to workspace IDs, branches, PRs, and agent session IDs from existing cmux event streams.
  2. Replace manual metrics with event-derived metrics for agent invocations, CI failures, human interventions, PRs, and cost.
  3. Add a shared pause/resume action path that captures workspace state and emits a resumable agent prompt from the goal record.

Validation

  • jq empty Resources/Localizable.xcstrings
  • git diff --check
  • Local tests/build were not run per repository and task instructions; CI will verify.

Closes #3931


Note

Medium Risk
Adds a new right-sidebar mode with local persistence and async file I/O, touching sidebar mode routing, focus behavior, and CLI/remote command parsing. Risk is moderate due to new state/persistence paths and UI interactions, though changes are scoped and covered by new tests.

Overview
Adds a new Goals mode to the right sidebar, including list/detail UI for creating goals, changing status, adding notes, viewing simple time/updated metrics, and deleting with confirmation, backed by a new GoalSupervisionStore that persists to Application Support/cmux/goals.json.

Wires goals into right-sidebar mode selection, availability, focus handling, command palette entries/titles, and cmux right-sidebar + remote socket commands/usage strings; also ensures Goals is treated as a non-pane mode (no tool-pane/open-as-pane support). Updates localization strings and expands/adjusts test coverage for CLI forwarding, mode parsing, command palette contributions, pane rejection, and goal store persistence/error handling.

Reviewed by Cursor Bugbot for commit a29424f. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Adds a Goals mode to the right sidebar, command palette, and CLI/remote so you can create, view, and track goals with status, notes, and live metrics, persisted to Application Support/cmux/goals.json. Async file I/O runs on a background queue to keep the UI responsive and completes #3931.

  • New Features

    • Goals panel: list/detail, create popover, link current workspace, delete with confirm, inline error banner.
    • Status/metrics: pending/active/paused/blocked/done/abandoned; wall‑clock/active durations; note count; “Updated” time; active‑first then updated‑at sort; live refresh every 60s; “0m” for zero durations.
    • Notes: inline editor with timestamps.
    • UI/CLI/Remote: command palette “Show Sidebar Goals” (no shortcut or shortcut pill); right‑sidebar label/icon and focus wiring; cmux right-sidebar and socket aliases accept goals; localized EN/JA strings.
  • Bug Fixes

    • Persistence: ignore no‑op mutations; cancellable load/save; move file I/O off the cooperative executor; revision‑merge with local edits; preserve deletions until the latest save completes; clear errors on success; friendly, localized errors; clarified load result type.
    • Treat Goals as non‑pane: excluded from pane commands/shortcuts and rejected as a right‑sidebar tool pane; focus controller/host mapping updated.
    • CLI/Remote: help/usage fallback strings updated to include goals (EN/JA).
    • Align bonsplit pin with main tab zoom API.

Written for commit a29424f. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Goals panel to the right sidebar for creating and managing goals with status tracking (pending, active, paused, blocked, done, abandoned)
    • Goals now support workspace linking, notes, and time metrics (wall-clock and active duration tracking)
    • Added Goals mode to the CLI right-sidebar command and command palette
    • Goals feature includes full localization support (English and Japanese)
  • Bug Fixes

    • Improved error handling for goal persistence with user-facing error messages

Review Change Stack

@vercel

vercel Bot commented May 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment May 22, 2026 8:19pm
cmux-staging Building Building Preview, Comment May 22, 2026 8:19pm

@coderabbitai

coderabbitai Bot commented May 12, 2026 •

Copy link
Copy Markdown

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

This PR implements a native Goals supervision panel as a new right-sidebar mode in cmux, enabling long-running multi-day objectives with persistent storage, lifecycle metrics, and note-keeping. It adds domain models (status, notes, records, snapshots), a JSON-backed observable store with merge-conflict resolution, a complete UI flow (list/detail/new-goal popover), command-palette integration, CLI support, and comprehensive test coverage.

Changes

Goals Panel Feature

Layer / File(s) Summary
Domain models and snapshot helpers
Sources/GoalSupervisionModels.swift
GoalSupervisionStatus enum with localized labels/symbols; GoalSupervisionNote (UUID, body, timestamp); GoalSupervisionRecord (title, status, workspace path, notes, active-time accumulation); GoalSupervisionSnapshot with wall-clock/active-duration helpers and workspace label formatting.
Persistence actor and observable store
Sources/GoalSupervisionStore.swift
GoalSupervisionPersistence actor (ISO-8601 JSON load/save); GoalSupervisionStore singleton (@MainActor @Observable) with create/update/delete mutations, mutation-revision merge, deterministic ordering (active goals first, then by updatedAt), async persistence scheduling, and error tracking.
Panel structure and control bar
Sources/GoalSupervisionPanelView.swift (lines 1–103)
GoalSupervisionPanelView with store subscription, selection state, plus-button control bar opening NewGoalPopover, @ViewBuilder content switching (empty/list/detail), and error banner display.
List rendering
Sources/GoalSupervisionPanelView.swift (lines 104–249)
GoalListView with periodic TimelineView updates for relative timestamps; GoalListRow with status chip, relative updated time, title, workspace label; StatusChip with status-driven tint styling; empty-state GoalEmptyView.
Goal detail view
Sources/GoalSupervisionDetailView.swift
GoalDetailView with top chrome (back button, status picker, delete confirmation), header (status, title, criteria, workspace label), notes section (draft editor, add action), and metrics grid (wall-clock/active durations, notes count, relative updated time) with periodic updates and formatters.
New goal popover
Sources/GoalSupervisionNewGoalView.swift
NewGoalPopover form with title and acceptance-criteria fields, optional "link current workspace" checkbox, and Create/Cancel actions with title validation.
RightSidebarMode.goals
Sources/RightSidebarPanelView.swift (lines 16–60)
Added .goals enum case with localized label and symbol; made shortcutAction optional (returns nil for .goals); added .goals-specific commandPaletteTitle; updated ModeBarButton to accept optional shortcutHint with conditional pill rendering.
Panel wiring
Sources/RightSidebarPanelView.swift (lines 400–401)
Wired GoalSupervisionPanelView into contentForMode for .goals, passing currentWorkspacePath: sessionIndexDirectory.
Command palette
Sources/ContentView+RightSidebarCommandPalette.swift
Maps .goals to command ID "palette.showRightSidebarGoals"; updates command-palette titles to use mode.commandPaletteTitle for all modes; excludes .goals from tool-pane descriptors.
Focus controller and tool panel
Sources/MainWindowFocusController.swift, Sources/RightSidebarToolPanel.swift
Groups .goals with non-file-explorer modes; maps to .host focus target; returns false for endpoint focus. Treats .goals like .feed/.dock across workspace sync, focus behavior, focus intent, and UI rendering.
CLI and availability
Sources/RightSidebarMode+Availability.swift, CLI/cmux.swift, Sources/RightSidebarRemoteCommand.swift
Parses "goals" CLI argument; marks .goals always available; updates CLI help/validation/dispatch; includes "goals" in remote command usage; adds isRightSidebarCLIMode handling.
Localization
Resources/Localizable.xcstrings
Adds en/ja strings for Goals mode label, navigation (back, delete, cancel, help), empty state, load/save errors, form fields, metrics labels, status picker, and "no workspace" fallback.
Xcode project wiring
cmux.xcodeproj/project.pbxproj
Registers five GoalSupervision Swift files and test file: PBXFileReference, PBXBuildFile, Sources group, main target build phase, and cmuxUITests/cmuxTests build phases.
Tests
cmuxTests/GoalSupervisionStoreTests.swift, cmuxTests/*.swift (updated)
Five async store tests covering ordering, field normalization, no-op updates, load failures, save failures, plus helpers for temp directories and test records. Updates existing tests in CLI, command-palette, socket security, mode persistence, and workspace suites.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • manaflow-ai/cmux#3810: Extends right-sidebar CLI command parsing and localization to recognize the new .goals mode, directly overlapping with core "right-sidebar CLI command parity" implementation.
  • manaflow-ai/cmux#4065: Routes the new .goals mode through existing right-sidebar tool-pane infrastructure, building on "open right sidebar tools as panes" changes.
  • manaflow-ai/cmux#3537: Both touch right-sidebar mode availability plumbing; the retrieved PR gates Feed/Dock by beta flags while this PR adds .goals parsing/availability alongside those checks.

Poem

🐰 A bunny's dream of goals at last,
No more forgotten, lost in the past!
With notes and timers, pause and play,
Long-running dreams now have their day. 🎯

🚥 Pre-merge checks | ✅ 14 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 1.64% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description includes a Summary section explaining what changed and why, and a Validation section detailing testing and verification steps. However, the Testing section (with subsections 'How did you test this change?' and 'What did you verify manually?') is not explicitly present in the author-provided description. Add explicit Testing section documenting local testing steps, manual verification performed, and test case additions. Note that CI verification is mentioned but explicit local testing details would strengthen the description.
✅ Passed checks (14 passed)
Check name Status Explanation
Title check ✅ Passed Title clearly and specifically summarizes the primary change: adding a goal supervision sidebar UI with proper scoping to issue #3931.
Linked Issues check ✅ Passed PR fully implements #3931 objectives: adds Goals sidebar mode with title/criteria/workspace/status/notes, provides persistence, UI for list/detail/create, delete confirmation, basic metrics, and wires through CLI/remote/command-palette. Pause/resume are properly scoped to status transitions per design.
Out of Scope Changes check ✅ Passed All changes are directly scoped to Goals feature: new GoalSupervision files, mode/command/CLI/remote wiring, localization, tests, and project configuration. No unrelated changes detected.
Cmux Swift Actor Isolation ✅ Passed Store @MainActor-isolated, models nonisolated+Sendable, persistence is actor, background tasks properly marshal to MainActor for mutations, store accessed only from UI.
Cmux Swift Blocking Runtime ✅ Passed No blocking runtime patterns introduced in new code. Uses TimelineView for 60s UI refreshes and Task.checkCancellation for async cancellation, both correct patterns.
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift files, Xcode project, and localization resources. Custom check scope covers only TypeScript, JavaScript, shell, and build/runtime scripts (not Swift). No files in scope.
Cmux Swift Concurrency ✅ Passed Code uses modern Swift concurrency: @Observable, actors, async/await, managed Tasks. No legacy patterns (DispatchQueue, Combine, completion handlers, unmanaged Tasks) detected.
Cmux Swift @Concurrent ✅ Passed File I/O properly isolated to separate actor with explicit hops from MainActor. No violation of @concurrent or nonisolated async requirements.
Cmux Swift File And Package Boundaries ✅ Passed All new files meet boundary requirements: no oversized files, persistence isolated in actor, UI in separate views, domain models isolated, clear responsibilities.
Cmux Swift Logging ✅ Passed All 11 production Swift files (5 new, 6 modified) contain no logging violations. No print, NSLog, ad hoc file logging, or improperly declared Logger statements. Error messages are localized and safe.
Cmux User-Facing Error Privacy ✅ Passed All user-facing error messages comply with privacy rules. No vendor/provider names, credentials, or restricted content. Uses safe generic terminology and proper localization.
Cmux Swiftui State Layout ✅ Passed Store uses @Observable. Views use local @State. List rows receive snapshots only. No GeometryReader, mutations, or @Published/@StateObject.
Cmux Architecture Rethink ✅ Passed Single @Observable @MainActor store owns goal state. Clear mutations via store methods with revision tracking. Proper cancellation. No timing repairs, observers, locks, or split lifecycle.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed Goal UI components are SwiftUI Views integrated into right sidebar. Standard .popover() modifier used. No NSWindow/NSPanel/WindowGroup or cmux.* window identifiers added.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-3931-goal-supervision-ui

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 and usage tips.

@greptile-apps

greptile-apps Bot commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a Goals supervision panel to the right sidebar, wiring a new goals mode through the mode bar, command palette, CLI, and socket remote command, with a locally-persisted JSON store under Application Support. It's a second-revision implementation that incorporates fixes from multiple prior review rounds.

  • New persistence layer: GoalSupervisionStore (@MainActor @Observable) wraps GoalSupervisionPersistence (actor) and GoalSupervisionFileIO (private serial DispatchQueue + withCheckedThrowingContinuation), keeping all blocking I/O off the cooperative executor and off the main actor; revision-merge with deletions-tracking prevents local edits from being clobbered by a concurrent initial load.
  • New UI: Five focused files (Models, Store, PanelView, DetailView, NewGoalView) all under 400 lines, each with a single responsibility; GoalListView wraps rows in TimelineView(.periodic(from: .now, by: 60)) with context.date threaded through GoalListRow.relativeTo (and included in its Equatable check) so relative timestamps refresh every 60 s without stale display; GoalMetricsSection similarly uses TimelineView for live wall-clock/active-duration tiles.
  • Sidebar plumbing: goals added to RightSidebarMode, shortcutAction made optional (Goals ships without a keyboard shortcut), mode bar shortcut pill hidden for nil, and Goals correctly excluded from tool-pane and focus-host mappings.

Confidence Score: 5/5

Safe to merge — all blocking-I/O, actor-isolation, stale-UI, and error-message issues surfaced in prior rounds have been addressed; the new code is well-structured and consistent with existing sidebar patterns.

Every area previously flagged (synchronous I/O on the main actor, ObservableObject broad invalidation, 785-line monolith, stale metrics tiles, stale list-row timestamps, raw Foundation error strings) is resolved in the current revision. The persistence pipeline correctly keeps blocking disk work on a dedicated serial DispatchQueue via a checked-continuation bridge, the actor boundary is clean, and the SwiftUI state model uses @observable with fine-grained tracking. No new actor-isolation mistakes, blocking primitives, or missing locale entries were found.

No files require special attention.

Important Files Changed

Filename Overview
Sources/GoalSupervisionStore.swift @mainactor @observable singleton with actor-backed persistence; blocking I/O correctly off cooperative executor via DispatchQueue+continuation bridge; revision-merge logic and deletion tombstoning look correct.
Sources/GoalSupervisionModels.swift Lightweight nonisolated value types; accumulateActiveTime mutation and snapshot duration helpers are correct.
Sources/GoalSupervisionPanelView.swift Panel, list, and row views correctly use TimelineView + relativeTo parameter threading to keep timestamps live; Equatable conformance on GoalListRow includes relativeTo so equatable() short-circuit is safe.
Sources/GoalSupervisionDetailView.swift Detail and metrics views correct; TimelineView wraps GoalMetricsSection so wall-clock and active-duration tiles tick every 60 s.
Sources/RightSidebarPanelView.swift goals mode added to enum; shortcutAction made Optional with correct nil for goals; shortcut pill correctly hidden with if-let guard; commandPaletteTitle uses dedicated localized string.
Resources/Localizable.xcstrings All new goals.* keys and updated CLI/remote usage strings include both EN and JA translations; no missing locale entries.
cmuxTests/GoalSupervisionStoreTests.swift Covers sorting, normalization+persistence, no-op update stability, and both load/save failure paths with user-facing message assertions.
Sources/MainWindowFocusController.swift goals added to non-host-mapping case and focus-target/.host case consistently; no regressions introduced.
Sources/RightSidebarToolPanel.swift goals correctly excluded from tool-pane workspace-sync, focus-anchor, and ownership-query switch arms; no regressions.

Sequence Diagram

sequenceDiagram
    participant UI as GoalSupervisionPanelView<br/>(@MainActor)
    participant Store as GoalSupervisionStore<br/>(@MainActor @Observable)
    participant Persist as GoalSupervisionPersistence<br/>(actor)
    participant FileIO as GoalSupervisionFileIO<br/>(DispatchQueue)
    participant Disk as goals.json

    UI->>Store: init (first access of .shared)
    Store->>Store: "loadTask = Task { await load() }"
    Store->>Persist: await persistence.load()
    Persist->>FileIO: await loadData(from: fileURL)
    FileIO->>Disk: Data(contentsOf:) [blocking, off coop executor]
    Disk-->>FileIO: Data?
    FileIO-->>Persist: Data?
    Persist->>Persist: decoder.decode(...)
    Persist-->>Store: [GoalSupervisionRecord]
    Store->>Store: "goals = sorted(loaded)"
    Store-->>UI: "@Observable invalidates body"

    UI->>Store: createGoal(title:...)
    Store->>Store: goals.insert / sortGoals / recordMutation
    Store->>Store: "persistTask = Task { await persistence.save(...) }"
    Store-->>UI: goals updated → body re-renders
    Store->>Persist: await persistence.save(snapshot)
    Persist->>FileIO: await saveData(data, to: fileURL)
    FileIO->>Disk: data.write(atomic) [blocking, off coop executor]
    Disk-->>FileIO: ok
    FileIO-->>Persist: ok
    Persist-->>Store: ok
    Store->>Store: [MainActor] clear lastError / deletedGoalIDs
Loading

Reviews (25): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread Sources/GoalSupervisionPanelView.swift Outdated
Comment thread Sources/GoalSupervisionPanelView.swift
Comment thread Sources/GoalSupervisionPanelView.swift Outdated
Comment thread Sources/GoalSupervisionPanelView.swift
Comment thread Sources/GoalSupervisionPanelView.swift Outdated
coderabbitai[bot]
coderabbitai Bot previously requested changes May 12, 2026

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/GoalSupervisionPanelView.swift`:
- Around line 163-170: The update currently always updates updatedAt / re-sorts
/ persists even when the mutation closure is a no-op (e.g. in
updateStatus(for:id:) where guard goal.status != status returns), causing
spurious recency/activity changes; change updateGoal(id: _ , ...) so the
mutation closure returns a Bool indicating whether it mutated the goal (or have
updateGoal return Bool), then in updateStatus(for:id:) (and the similar block
covering lines ~189-205) only set goal.updatedAt, re-sort, and persist when that
Bool is true; reference the updateGoal(id:), updateStatus(for:id:), and the
other status/mutation closure blocks so you only update timestamps and save when
a real change occurred.
- Around line 4-785: This file mixes domain models, persistence/store logic, and
many SwiftUI views into one large file; split it into focused files: move the
model types (GoalSupervisionStatus, GoalSupervisionNote, GoalSupervisionRecord,
GoalSupervisionSnapshot and their helpers like normalized/normalizedOptional)
into a Models file, move GoalSupervisionStore (keeping `@MainActor`, static
shared, fileURL logic, load/persist and helper methods) into a Store file, and
move GoalSupervisionPanelView and all its view subcomponents (GoalEmptyView,
GoalListView, GoalListRow, GoalDetailView, MetricTile, StatusChip,
NewGoalPopover) into one or more View files; preserve access control, keep
formatters and static helpers near the views that use them (or extract shared
formatters into a small Utilities file), update imports/usages so types like
GoalSupervisionSnapshot and GoalSupervisionStore are referenced from the new
files, and run a build to ensure no symbol or attribute (e.g., `@MainActor`,
`@StateObject`, .shared) was lost during the move.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0b47b8ad-ac53-4ad8-a820-24a764ffecff

📥 Commits

Reviewing files that changed from the base of the PR and between 37e2330 and a3c465a.

📒 Files selected for processing (7)
  • GhosttyTabs.xcodeproj/project.pbxproj
  • Resources/Localizable.xcstrings
  • Sources/ContentView+RightSidebarCommandPalette.swift
  • Sources/GoalSupervisionPanelView.swift
  • Sources/MainWindowFocusController.swift
  • Sources/RightSidebarMode+Availability.swift
  • Sources/RightSidebarPanelView.swift

Comment thread Sources/GoalSupervisionPanelView.swift Outdated
Comment thread Sources/GoalSupervisionPanelView.swift Outdated
Comment thread Sources/RightSidebarPanelView.swift
@austinywang
austinywang dismissed coderabbitai[bot]’s stale review May 12, 2026 05:06

Dismissed stale CodeRabbit changes-requested review from commit a3c465a after addressing its findings in later commits, resolving all review threads, and receiving a passing CodeRabbit status on the current head.

Comment thread Sources/GoalSupervisionModels.swift Outdated
Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionPanelView.swift
coderabbitai[bot]
coderabbitai Bot previously requested changes May 12, 2026

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/GoalSupervisionStore.swift`:
- Around line 200-210: The persistCurrentGoals() flow can persist a stale
snapshot because persistTask?.cancel() only marks the prior Task cancelled;
update persistCurrentGoals() so the Task cooperatively checks cancellation
before saving: inside the Task block, call try Task.checkCancellation() (or
Task.checkCancellation()) immediately before awaiting
persistence.save(snapshot), and add a catch branch for CancellationError that
returns early without calling persistence.save or updating lastError; keep the
existing catch for other errors to set lastError = error.localizedDescription;
reference persistCurrentGoals(), persistTask, persistence.save(_:), and
lastError when making the change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 78e47d1c-28fe-42e1-9141-37f867daac00

📥 Commits

Reviewing files that changed from the base of the PR and between a3c465a and 126de82.

📒 Files selected for processing (7)
  • GhosttyTabs.xcodeproj/project.pbxproj
  • Sources/GoalSupervisionDetailView.swift
  • Sources/GoalSupervisionModels.swift
  • Sources/GoalSupervisionNewGoalView.swift
  • Sources/GoalSupervisionPanelView.swift
  • Sources/GoalSupervisionStore.swift
  • Sources/RightSidebarPanelView.swift

Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionDetailView.swift Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

Verified the CodeRabbit persistence-cancellation finding against current HEAD. persistCurrentGoals() now calls Task.checkCancellation() before and after persistence.save(snapshot) and exits on CancellationError without saving error state, so the stale-snapshot write path is addressed.

@lawrencecchen
lawrencecchen dismissed coderabbitai[bot]’s stale review May 12, 2026 09:29

Obsolete automated review on an older commit. The requested persistence cancellation guard is present at current HEAD: persistCurrentGoals() checks cancellation before and after persistence.save(snapshot) and exits on CancellationError without updating lastError.

Comment thread Sources/RightSidebarMode+Availability.swift
Comment thread CLI/cmux.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 and found 2 potential issues.

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 a19e408. Configure here.

Comment thread Sources/GoalSupervisionStore.swift
Comment thread Sources/GoalSupervisionDetailView.swift

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 20 files

Re-trigger cubic

Comment thread Sources/GoalSupervisionStore.swift Outdated
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — a29424f2 Deployed May 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Goal supervision UI: long-running, multi-day objectives that pause/resume across sessions with lifecycle metrics

3 participants