Skip to content

cmux-next palette: titles end in "…" exactly when the action asks first, outside Phone - #23360

Merged
teamleaderleo merged 1 commit into
feat-cmux-nextfrom
cmux/palette-close-group
Oct 21, 2026
Merged

teamleaderleo merged 1 commit into
feat-cmux-nextfrom
cmux/palette-close-group

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

A palette title ends in "…" exactly when choosing it asks for more before it acts (macOS HIG, and how the palette runs an action: ActionRegistry.performNow hands an action with a missing required argument to the palette, and PaletteArgumentFlow asks for it). #23332 applied this to the Phone actions. This PR fixes the rows outside Phone where the code shows the title is wrong.

Action Old New Why
palette.browserClearHistory Clear Browser History Clear Browser History… Required range (an enumeration) and browserProfile (a target the focused pane doesn't supply). The palette asks for both first.
history.open Open History Entry Open History Entry… Required id. The palette asks for it as text.
app.hide Hide App Hide App… Required app (a string, no target). The palette asks for it. The sidebar item's own Hide App (sidebar.item.hideApp) acts on its target at once and keeps no "…".
app.unhide Show Hidden App Show Hidden App… Required app, same as Hide App.
openTeamPicker Team Picker Team Picker… Required team with suggestions. The palette pushes a list of teams (PaletteArgumentCurrentValueTests.teamStepMarksAndSelectsTheCurrentTeam, PaletteInsteadOfDialogTests).
remote.openBrowserTab (DEV only) Open Remote Browser Tab Open Remote Browser Tab… Required address.
cloudDiagnostics Cloud Diagnostics… Cloud Diagnostics Takes no arguments. The handler runs the diagnostics and shows the result in a toast with Copy, so nothing is asked.
workspaceGroup.editConfig Edit Group Config… Edit Group Config Takes no arguments. The handler is SettingsHandlers.openCmuxConfig, the same one behind Open cmux-next.json, which has no "…".

English and all 20 translations change by just the "…" (U+2026). The one exception is the Khmer Edit Group Config, which was still English and is now translated. The audit's matching rows in plans/cmux-next/palette-audit.md are updated.

PaletteMenuVocabularyTests.auditedTitlesEndInAnEllipsisExactlyWhenTheyAsk lists these eight rows. For each one it checks that the title's "…" matches whether the action has a required argument. All eight fail on the base.

Left alone (borderline, not changed):

  • Set Space Terminal Defaults… (space.setDefaults): both arguments are optional and the handler never calls ask, so from the palette it runs at once and clears the space's defaults. That looks like a missing ask, not a title problem.
  • Copy Machine Link / Copy Machine Port (cloudCopyLink, cloudCopyPort): a required port, but they are context-menu rows on a machine and the menu may supply the port.
  • Titles with "…" that open a sheet, a picker, a Settings panel, a confirmation or a palette page (Rename…, Set … Icon…, Settings-opening rows, Roll Back to Previous Version… (destructive, confirms), Restart cmux-tui… (confirms)). They ask, so they keep the "…".
  • The "Close Group" item: palette-audit.md on feat-cmux-next has no note about Close Group, so nothing changed for it. The menu label "Close Group" is shared by three actions (tabGroup.close, screenGroup.close, workspaceGroup.closeWorkspaces), and their palette titles are Close Tab Group, Close Screen Group and Close All Workspaces in Group. Which of these the audit meant is still an open question.

Generated outputs (plans/cmux-next/action-surfaces.json, webviews/test/fixtures/palette-eval, web/data/cmux-shortcuts.generated.json) are not hand-edited. The autofix regenerates them.

Changelog

  • Changed: Command palette titles end in "…" only when the command asks for something first (Clear Browser History…, Hide App…, Team Picker…; Cloud Diagnostics and Edit Group Config no longer do).

Observed / Not run

Observed: python3 scripts/cmux-next/prepush-gate.py reported no new violations. ./scripts/localize-changes reports no errors for the changed keys, and the catalog's total parity errors drop from 41584 to 41546. The rest are needs_review states already on the base. A JSON diff shows that only the eight intended keys changed in the four catalogs.
Not run: Swift build and tests (not run locally, per repo rules). The new test's red on the base and green on the head come from reading the code and were not executed. A fleet compile is dispatched for the head.

No capture: copy-only change to eight palette and menu titles (an ellipsis added or removed). There is no layout or interaction change.

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

Completes the "…" rule for palette titles outside the Phone family: a title now ends in "…" exactly when choosing it asks the user for more input first, matching what #23332 did for Phone actions and the macOS Human Interface Guidelines.

Six actions gain "…" because the palette collects a required argument before running them: Clear Browser History…, Open History Entry…, Hide App…, Show Hidden App…, Team Picker…, and Open Remote Browser Tab… (DEV only). Two lose it because they run at once: Cloud Diagnostics (shows a result toast) and Edit Group Config (opens cmux-next.json, like Open cmux-next.json). English and the 20 translations change by only the ellipsis (U+2026); the Khmer Edit Group Config, previously untranslated English, is now translated. PaletteMenuVocabularyTests now verifies all eight rows, palette-audit.md is updated, and generated outputs were regenerated by the autofix.

Scoped out

  • Set Space Terminal Defaults… stays as-is: both args are optional and the handler never asks, which looks like a missing ask rather than a title problem
  • Copy Machine Link and Copy Machine Port keep no "…": the context menu may supply the required port
  • Titles that open a sheet, picker, Settings, confirmation, or palette page keep their "…" because they do ask
  • Close Group is unchanged because the audit note doesn't identify which of the three group-close actions it means

Written for commit 4f867f5. Summary will update on new commits.

View guided diff Turn on auto-fix

Six palette actions collect a required argument before they run, so
their titles now end in "…": Clear Browser History… (time range and
profile), Open History Entry… (entry), Hide App… and Show Hidden App…
(app), Team Picker… (team) and the DEV-only Open Remote Browser Tab…
(host address). Two run at once and lose the "…": Cloud Diagnostics shows
its result in a toast, and Edit Group Config opens cmux-next.json, as
Open cmux-next.json does. English and all 20 translations change; the
Khmer Edit Group Config, which was English, is translated.
PaletteMenuVocabularyTests checks the rule for these rows, and
palette-audit.md's rows follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray
@teamleaderleo teamleaderleo added the risk:low Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by palette-audit on cosmic-gray · session

@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 4f867f5: 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=pr23360 -f ref=cmux/palette-close-group -f platform=macos -f backend_mode=local

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

CI passes on 4f867f5e57 (run 39594819417 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.

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on f90fbd9 to compare; do not merge until green; see lane-rules

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026

Copy link
Copy Markdown

Found 5 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp_nbxy8nn/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpj7rcq7cq/summary-fail.json (live):/summary-fail.json (live): View Logs
test_a_pull_request_that_changes_the_shortcut_inputs_still_rewrites_them (main.Sett
ingsOnlyArtifactLeavesTheActionFollowers.test_a_pull_request_that_changes_the_shortcut_
inputs_still_rewrites_them) (job='autofix')/
test_a_pull_request_that_changes_the_shortcut_inputs_still_rewrites_them (main.Sett
ingsOnlyArtifactLeavesTheActionFollowers.test_a_pull_request_that_changes_the_shortcut_
inputs_still_rewrites_them) (job='autofix')
View Logs
test_regenerated_action_exports_bring_the_followers (main.SettingsOnlyArtifactLeave
sTheActionFollowers.test_regenerated_action_exports_bring_the_followers) (job='autofix'
)/
test_regenerated_action_exports_bring_the_followers (main.SettingsOnlyArtifactLeave
sTheActionFollowers.test_regenerated_action_exports_bring_the_followers) (job='autofix'
)
View Logs
test_settings_exports_alone (main.SettingsOnlyArtifactLeavesTheActionFollowers.test
_settings_exports_alone) (job='autofix')/
test_settings_exports_alone (main.SettingsOnlyArtifactLeavesTheActionFollowers.test
_settings_exports_alone) (job='autofix')
View Logs

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

@teamleaderleo
teamleaderleo merged commit 363f3e6 into feat-cmux-next Oct 21, 2026
@teamleaderleo
teamleaderleo deleted the cmux/palette-close-group branch October 21, 2026 11:55
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…outside #expect) (#23386)

#23332/#23360 put contains(where: \.isRequired) inside #expect, which Swift
Testing expands to a throwing call ("call can throw, but it is not marked with
try"), so the CmuxNext test target does not build on feat-cmux-next.


Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bdd-a3a7-70f3-960d-db7379df3d8d&host=cosmic-gray

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…eaches (#23423)

* test(ci): the fleet compile check compiles the test targets a change can break (red)

fleet/compile-check compiles only the app executable, so #23360 (a
throwing call in #expect without try, CmuxNextActionsTests) and #23163
(a FakeClient that missed #21258's requirement, CmuxNextAppTests) passed
it and broke feat-cmux-next's test build. This test pins the plan the
check must compile and the new package-test-lane.sh compile-tests
argument check; neither exists yet.

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(fleet compile-check): also compile the test targets the change reaches

fleet/compile-check compiled only the app executable, which links no test
target, and merge_compile_guard accepts it in place of a queued Release
compile. #23360 (CmuxNextActionsTests) and #23163 (CmuxNextAppTests)
passed it while every Mac job that builds tests sat queued, and broke the
base's test build.

The workflow now reads the head's merge base with feat-cmux-next from the
compare API and runs `package-test-lane.sh compile-tests MERGE_BASE` on a
fleet Mac beside the Linux app compile; success needs both. The plan
(scripts/ci/compile_test_plan.py) is the CmuxNext test targets that depend
on a changed target in the existing SwiftPM target graph (the routing
cmux_next_route.py gives the swift test tier), plus the macOS package
lane's packages whose sources or path dependencies changed. Each CmuxNext
test target builds with `swift build --target`, so nothing links or runs.
The Linux pool cannot do it: its SDK has no Testing module.

A head whose package-test-lane.sh predates the phase gets no verdict
(error), with "merge feat-cmux-next and dispatch again".

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: the test-target compile is an advisory check; fleet/compile-check is the app compile again

coord-deputy: an ~11 min Mac queue on every PR's merge gate costs too much.
fleet-compile-check.yml and merge_compile_guard.py are back to feat-cmux-next's
(the Linux app compile, same status semantics).

fleet-test-compile.yml runs on pull requests into feat-cmux-next that touch
Packages/ or vendor/: a Linux job plans with compile_test_plan.py over the
merge commit's diff; an empty plan passes there in seconds and queues no
Mac; a plan runs `package-test-lane.sh compile-tests BASE` as a light fleet
step, and the check `fleet/test-compile (advisory)` goes red only when a
planned test target does not compile. It is a bridge until the Linux pool
image carries cmuxterm-hq #2750 (Testing search paths).

Tests: the guard ignores the advisory check, red or pending, and it never
stands in for the Release compile; CI and app-host changes plan nothing.

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

* test(ci): compile-tests stays red after a later setup failure; one fallback per package; advisory verdicts

Red on c150a5c: a target failure followed by a later package's setup
failure exits before the failure marker, so the check only warns; a refused
--target falls back to --build-tests once per target; the job's 45 min
timeout is shorter than the client's queue plus run timeouts, so a slow
fleet ends red; exit 128 after the marker maps to a warning.

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(fleet-test-compile): a compile failure stays red; a slow fleet never does

- package-test-lane.sh compile-tests prints the failure marker as soon as a
  target fails, so a later package's setup failure cannot hide it.
- A refused --target falls back to --build-tests once per package, in place
  of its remaining targets.
- fleet-test-compile.yml: red on the marker whatever the exit; the job
  timeout (55 min) outlasts the client's queue plus run timeouts (45 min),
  so a timeout is a warning, never red.
- cmux-next.yml runs tests/test_ci_compile_test_plan.py with the merge guard tests.

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(package tests): compile_test_plan.py is a global input of the package test job

package-test-lane.sh compile-tests runs it, so test_ci_select_package_tests.py
requires it in GLOBAL_INPUTS (red on b96188a: "scripts the package test
job runs are not global inputs").

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>
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…rows, archive check)

- Mark Chat as Read…, Pin/Unpin Chat in Priority… and Snooze Chat for
  1 Hour… end in "…": from the palette each asks which chat (#23360's
  rule, now in PaletteMenuVocabularyTests' audited list). The row's own
  menu names its chat, so it reads Mark as Read and Snooze for 1 Hour
  (Pin or Unpin stays the chat's live title). English and all 20
  translations change; the two menu labels take the hover buttons'
  translations.
- Archive Chat on a row's chat (`agent-chat:`) is refused while the
  Priority view is off, with the reason the other row actions give
  (a target reason, so Archive Chat on the focused chat still runs).
- A row closing its slot takes no clicks: the rows' document skips it in
  hitTest, so a right-click there opens no menu for a chat that left.
- A row still opening when a later move retargets it keeps clipping
  until that move ends (a placement count per row, like the main list's
  `opens`), so its preview does not draw over the row below.
- With motion off, rows land through `animator()` inside
  `Motion.withoutAnimation`, as `RowMotion` does, so a move in flight
  cannot pull them back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&host=cosmic-gray
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…rows, archive check) (#23597)

* cmux NEXT sidebar: Priority view follow-up tests (red first)

Behavioral tests for the review findings of #23527 and #23577, before
their fixes:

- the palette's Priority row actions ask which chat, so their titles
  end in "…" (PaletteMenuVocabularyTests' audited list), while the row's
  own menu, which names the chat, asks nothing;
- with the Priority view off, Archive Chat on a row's chat is refused
  like the other row actions, and the focused chat's Archive still runs;
- acpmux refusing an archive shows the row again;
- motion: the sidebar switch off on its own, a second reorder during a
  slide, a motion-off change during a slide, a row retargeted while it
  opens keeps its clip, and a closing row takes no clicks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&host=cosmic-gray

* cmux NEXT sidebar: Priority view follow-ups (palette titles, closing rows, archive check)

- Mark Chat as Read…, Pin/Unpin Chat in Priority… and Snooze Chat for
  1 Hour… end in "…": from the palette each asks which chat (#23360's
  rule, now in PaletteMenuVocabularyTests' audited list). The row's own
  menu names its chat, so it reads Mark as Read and Snooze for 1 Hour
  (Pin or Unpin stays the chat's live title). English and all 20
  translations change; the two menu labels take the hover buttons'
  translations.
- Archive Chat on a row's chat (`agent-chat:`) is refused while the
  Priority view is off, with the reason the other row actions give
  (a target reason, so Archive Chat on the focused chat still runs).
- A row closing its slot takes no clicks: the rows' document skips it in
  hitTest, so a right-click there opens no menu for a chat that left.
- A row still opening when a later move retargets it keeps clipping
  until that move ends (a placement count per row, like the main list's
  `opens`), so its preview does not draw over the row below.
- With motion off, rows land through `animator()` inside
  `Motion.withoutAnimation`, as `RowMotion` does, so a move in flight
  cannot pull them back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&host=cosmic-gray

* cmux NEXT sidebar: the row archive's Priority view check lives with the row actions

Keeps SidebarPriorityFeed.swift as it was, so the Priority remote chats
branch merges without a conflict there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&host=cosmic-gray

* cmux NEXT sidebar: the view-off test runs the focused chat's Archive with an agent chat focused

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&host=cosmic-gray

* cmux-next: regenerate action exports for the Priority row actions

Copied from the CI cmux-next-generated-patch artifact (run 39644207201).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fe0d-7f92-b3aa-5ffc1910a994&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

risk:low Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant