Codewhale 0.9.12: Fleet-only UX (workbar, startup, underwater default, provider, settings, logo, hover, roles, retro theme) - #5862
Conversation
UiThemeValue::Custom now holds its full custom:<name> selector, the same single string /theme and the persisted theme setting use, so the typed /config document round-trips a custom theme without the sibling custom_theme_name field. No disk migration: that key was typed-UI only and was never persisted.
ConfigLabelLaunchScreen belonged to the retired launch_screen setting (load already accepts and drops it) and ConfigLabelSidebarWidth / ConfigLabelSidebarFocus belonged to sidebar load-only shims that were never schema keys and had no hints. Remove the MessageIds and every pack entry; all 15 packs stay in parity. No behavior change.
- work_surface_placement: the live default is bottom and Settings::set accepts top|bottom|left|right|off, but the schema offered top|left|right|off defaulting to left, and WorkSurfacePlacementValue only had Top|Left|Right — a persisted bottom round-tripped as top through the typed /config document and corrupted the setting on save. Schema gains bottom (default bottom); the typed enum gains Bottom and Off so every live value round-trips. - rail_panel: the schema offered tasks|agents|context|pinned while the dock cycles eight panels and Settings::set rejected five of them. Schema and set() now accept tasks, agents, background, files, notepad, context, git, price; pinned stays an accepted alias that folds into tasks like the load-time migration. - status_indicator: drop the retired whale choice from the schema; the whale|🐳|🐋 → cw load migration stays. - UiThemeValue gains claude and solarized-light (SELECTABLE_THEMES entries the typed document could not round-trip) and a test pins the typed value space to every selectable theme. - packs: widen the two value-enumeration hints, add the bottom placement copy, and drop the retired choice keys from all 15 packs. Test updates: rail_panel_persists_tasks_agents_context_and_pinned encoded the old four-panel set() and its pinned-verbatim persistence; it now covers all eight panels and the pinned→tasks fold.
`/theme underwater` validated through normalize_theme_name, which has no underwater entry — the alias only existed on the ocean_treatment field, so the command the founder reached for said "invalid theme". Underwater is a compound choice (Dark palette + deepsea treatment); route the aliases underwater|deepsea|deep-sea|ombre through set_theme_selection, the same setter the picker's Deepsea row uses. Test: theme_command_underwater_alias_applies_the_deepsea_pair. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… has Esc back
Enter on the empty launch composer ran the pre-highlighted "New worktree"
entry, which the founder hit by reflex ("toxic"). The menu now starts
with nothing selected (menu_selected: Option<usize>); ↑/↓ highlight, Enter
runs only a highlighted entry, Esc unhighlights.
Every launch flow now walks back to the card: LaunchState::restore_card()
is applied when the resume picker or changelog pager closes over the
launch screen, on Esc from the empty composer once the card has dissolved,
and Resume with no saved sessions no longer dissolves the card just to
show a status line. The worktree prompt copy says "Esc back".
Suspecting the New worktree entry of doing nothing, prove it end to end:
new_worktree_creates_a_checkout_and_the_session_starts_inside_it drives
provision_launch_worktree against a scratch repo and checks the checkout,
the branch, duplicate refusal, and that begin_launch_session points the
session at the worktree. It did work — silently. It now leaves a receipt
in the transcript and status line (LaunchWorktreeCreated, 15 packs).
Startup goldens re-blessed: the only symbol change is the removed ▸ on
the first menu row; the ink goldens relabel because one palette entry
(SELECTION_TEXT BOLD) is no longer on screen.
Tests: launch/tideline slice 157 passed; event_loop/session_state/
localization/theme_picker slice 91 passed.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Alias deepsea; picker single list; config read-only migration folds deepsea into theme underwater and drops the key; OceanRamp keys on theme. Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…p orphans) Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…rip test Signed-off-by: Hunter Bown <hmbown@codewhale.net>
The cucumber PTY suite was not in the local gate (--lib only), so three expectations shipped stale against the collapse rules: - the startup/live-shell wordmark is the lowercase codewhale mark; - the ctx reading stays silent below 50% fullness, so the inline screen-mode proof keys on the composer placeholder, which paints in both screen modes, and the pointer proof on the plain-workspace caption; - the new launch-worktree test pins core.autocrlf=false in its fixture repo so Windows CI (global autocrlf=true) checks out HEAD's files verbatim for the byte-fidelity assert. Receipts: cucumber active_composer_pointer + screen_mode_inline 2/2 passed with --features long-running-tests; launch_worktree 1/1 with RUST_MIN_STACK=16MiB; fmt clean; workspace clippy under CI flags clean. Signed-off-by: CodeWhale Bot <bot@codewhale.net>
… into fix/0912-ux-20260902
…fix/0912-ux-20260902
Legacy deepseek_theme token module was never user-selectable; expose its flat phosphor-teal era as ThemeId::UnderwaterRetro (underwater-retro, retro) with underwater ink roles on a flat unpainted ground.
…er_layer dispatch)
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_b3cb9c26-35f6-4755-8443-f86c6224e45f) |
|
Claude finished @Hmbown's task in 4m 47s —— View job Claude is reviewing this PR
|
There was a problem hiding this comment.
🔵 Needs a closer look
The change set is broad and cross-cutting (commands, TUI UX, docs, goldens, and runtime behavior), and I found multiple user-facing accuracy/consistency issues that should be addressed before a safe merge.
Pull request overview
This PR rolls up the 0.9.12 “Fleet-only” UX changes across the TUI, CLI/docs, and test/golden fixtures—standardizing terminology (Pod→Fleet, sidebar/rail→workbar), updating startup/settings/theme flows, and aligning hover/interaction affordances.
Changes:
- Retires Pod-facing surfaces in favor of Fleet wording and behavior (CLI, slash commands, docs, skills, receipts, tests).
- Renames/reshapes the “rail/sidebar” work surface into a bottom-default “workbar” with updated panels and keybindings.
- Updates startup and settings UX (recent sessions, theme picker/live preview, underwater defaults) and re-blesses goldens accordingly.
File summaries
| File | Description |
|---|---|
| fleets/stopship.toml | Updates fleet role mapping copy/values |
| docs/zh_hans/README.md | Pod→Fleet doc link wording |
| docs/zh_hans/CONFIGURATION.md | Adds underwater themes / updates theme docs |
| docs/WORKROOM_ARCHITECTURE.md | Sidebar→workbar wording |
| docs/SUBAGENTS.md | Sidebar→workbar wording |
| docs/skills/codew-release-qa-sweep/SKILL.md | Sidebar→workbar QA wording |
| docs/RUNTIME_API.md | Sidebar→workbar wording |
| docs/MODES.md | Sidebar→workbar wording in flags section |
| docs/KEYBINDINGS.md | Keybinding doc updates for workbar/panels |
| docs/id/FLEET.md | Removes Pod alias mention |
| docs/GUIDE.md | Workbar wording/placement updates |
| docs/FLEET.md | Removes Pod alias table; workbar wording |
| docs/FLEET_WORKFLOW_TUTORIAL.md | Removes Pod alias mention |
| docs/examples/fleet-dogfood.toml | Updates example commands to fleet |
| docs/design/TIDELINE_RATATUI_TRANSLATION.md | Pod→Fleet in Tideline design doc |
| crates/tui/tests/features/core_command_surfaces.feature | Fleet help contract + /pod unknown assertion |
| crates/tui/tests/cucumber/screen_mode_inline_pty.rs | Startup sentinel/menu text updates |
| crates/tui/tests/cucumber/plugin_e2e_acceptance.rs | Startup “New session” updates |
| crates/tui/tests/cucumber/active_composer_pointer_pty.rs | Startup/live-shell assertions updated |
| crates/tui/src/worker_profile.rs | Imports FleetRole from new location |
| crates/tui/src/tui/work_surface/tideline/tests.rs | POD→FLEET rail label assertions |
| crates/tui/src/tui/work_surface/tideline.rs | POD→FLEET in Tideline rail rendering |
| crates/tui/src/tui/work_surface/panels/tideline_tests.rs | Ledger golden contract wording |
| crates/tui/src/tui/work_surface/panels.rs | POD LEDGER→FLEET LEDGER text |
| crates/tui/src/tui/work_surface/model.rs | Work surface placement/panel model updates |
| crates/tui/src/tui/work_surface/mod.rs | Workbar docs (bottom default, new panels) |
| crates/tui/src/tui/widgets/header.rs | Wordmark casing normalization in header |
| crates/tui/src/tui/widgets/agent_card.rs | Moves public_role_label import |
| crates/tui/src/tui/whales.rs | Plain whale species name casing |
| crates/tui/src/tui/views/tideline_tests.rs | Settings/theme list tests updated |
| crates/tui/src/tui/views/tideline_preview.rs | Pod→Fleet wording in preview |
| crates/tui/src/tui/views/route_save_prompt.rs | Pod→Fleet wording in save prompt docs |
| crates/tui/src/tui/views/fleet_setup.rs | /pod setup→/fleet setup wording + imports |
| crates/tui/src/tui/views/fleet_roster/tests.rs | Adds hover behavior tests |
| crates/tui/src/tui/views/fleet_roster.rs | Adds hover tint state/logic |
| crates/tui/src/tui/views/fleet_detail.rs | Moves public_role_label import |
| crates/tui/src/tui/underwater/tideline_tests.rs | Startup recent sessions + mark tier tests |
| crates/tui/src/tui/ui/terminal.rs | Resets sixel emission on screen rebuild |
| crates/tui/src/tui/ui/session_state.rs | Adds launch-session resume path + tests |
| crates/tui/src/tui/ui/overlays.rs | Theme picker API change + launch-card restore helper |
| crates/tui/src/tui/ui/motion.rs | Rail→workbar status messaging |
| crates/tui/src/tui/ui/handlers.rs | Theme selection event simplified (theme only) |
| crates/tui/src/tui/ui/frame/one_owner_tests.rs | Context reading conditional paint test updates |
| crates/tui/src/tui/ui/apply.rs | Rail→workbar status messaging + theme picker API |
| crates/tui/src/tui/ui.rs | Pod→Fleet status strings for setup targets |
| crates/tui/src/tui/theme_picker/tideline_tests.rs | Theme rows count assertions updated |
| crates/tui/src/tui/setup/operate.rs | Pod→Fleet wording in readiness facts |
| crates/tui/src/tui/setup/mod.rs | Pod→Fleet wording in runtime facts |
| crates/tui/src/tui/setup/fleet_draft.rs | Pod→Fleet wording in drafting prompts |
| crates/tui/src/tui/notifications.rs | Wordmark casing in terminal title paths |
| crates/tui/src/tui/notification_payload.rs | Wordmark casing fallback headline |
| crates/tui/src/tui/mouse_ui.rs | Launch-screen hover + click row routing |
| crates/tui/src/tui/model_picker.rs | Pod→Fleet wording in picker docs |
| crates/tui/src/tui/menu_style.rs | Adds shared hovered-row style helper |
| crates/tui/src/tui/mcp_routing.rs | Uses display-target redaction for MCP manager |
| crates/tui/src/tui/keybindings.rs | Sidebar→workbar chord label updates |
| crates/tui/src/tui/infoline/tests.rs | Adds hover behavior test for context segment |
| crates/tui/src/tui/infoline.rs | Adds Cache segment + hover rules for actionable segments |
| crates/tui/src/tui/hover_hit.rs | Hover registry docs + hit-test coverage |
| crates/tui/src/tui/hotbar/setup.rs | Sidebar→workbar action label updates |
| crates/tui/src/tui/hotbar/actions.rs | Removes slash.pod compat binding + wording updates |
| crates/tui/src/tui/history/tideline_stream.rs | Pod→Fleet wording in stream docs |
| crates/tui/src/tui/goldens/work_160x40.txt | Re-blessed Tideline work golden |
| crates/tui/src/tui/goldens/work_120x32.txt | Re-blessed Tideline work golden |
| crates/tui/src/tui/goldens/work_100x30.txt | Re-blessed Tideline work golden |
| crates/tui/src/tui/goldens/theme_picker_80x24.txt | New theme picker golden |
| crates/tui/src/tui/goldens/theme_picker_120x32.txt | New theme picker golden |
| crates/tui/src/tui/goldens/startup_surfacing_80x24.txt | Startup surfacing golden updates |
| crates/tui/src/tui/goldens/startup_ink_80x24.txt | Startup ink golden updates |
| crates/tui/src/tui/goldens/startup_ink_160x40.txt | Startup ink golden updates |
| crates/tui/src/tui/goldens/startup_ink_120x32.txt | Startup ink golden updates |
| crates/tui/src/tui/goldens/startup_ink_100x30.txt | Startup ink golden updates |
| crates/tui/src/tui/goldens/startup_first_run_80x24.txt | Startup first-run golden updates |
| crates/tui/src/tui/goldens/startup_80x24.txt | Startup golden updates |
| crates/tui/src/tui/goldens/startup_40x10.txt | Startup floor golden updates |
| crates/tui/src/tui/goldens/startup_160x40.txt | Startup golden updates |
| crates/tui/src/tui/goldens/startup_120x32.txt | Startup golden updates |
| crates/tui/src/tui/goldens/startup_100x30.txt | Startup golden updates |
| crates/tui/src/tui/goldens/settings_80x24.txt | Settings stage golden updates |
| crates/tui/src/tui/goldens/settings_160x40.txt | Settings stage golden updates |
| crates/tui/src/tui/goldens/settings_120x32.txt | Settings stage golden updates |
| crates/tui/src/tui/goldens/settings_100x30.txt | Settings stage golden updates |
| crates/tui/src/tui/goldens/ledger_80x24.txt | Ledger title golden updates |
| crates/tui/src/tui/goldens/ledger_160x40.txt | Ledger title golden updates |
| crates/tui/src/tui/goldens/ledger_120x32.txt | Ledger title golden updates |
| crates/tui/src/tui/goldens/ledger_100x30.txt | Ledger title golden updates |
| crates/tui/src/tui/goldens/edit_theme_80x24.txt | New edit-theme golden |
| crates/tui/src/tui/goldens/edit_theme_120x32.txt | New edit-theme golden |
| crates/tui/src/tui/goldens/config_panel_80x24.txt | Config panel golden updates |
| crates/tui/src/tui/goldens/config_panel_120x32.txt | Config panel golden updates |
| crates/tui/src/tui/command_palette.rs | Adds hover tinting + MCP target display |
| crates/tui/src/tui/app/types.rs | Pod→Fleet comments for actions |
| crates/tui/src/tui/app/init.rs | Removes ocean_treatment init plumbing |
| crates/tui/src/tui/ambient_life.rs | Smooths ambient motion physics |
| crates/tui/src/tui/agent_roster.rs | Pod→Fleet wording in empty state |
| crates/tui/src/tools/workflow/mod.rs | Role-only dispatch + snapshot-based binding updates |
| crates/tui/src/tools/spec.rs | Pod→Fleet wording in envelope docs |
| crates/tui/src/tools/shell.rs | Pod→Fleet wording in availability error |
| crates/tui/src/tools/execution_envelope.rs | Updates denylist module reference |
| crates/tui/src/session_manager.rs | Exposes is_empty_auto_created_session |
| crates/tui/src/route_runtime.rs | Pod→Fleet wording in preflight hint |
| crates/tui/src/request_manifest.rs | “Pod assignment”→“Fleet assignment” label |
| crates/tui/src/palette/osc11.rs | Adds CSI-terminated terminal query for sixel probing |
| crates/tui/src/operate.rs | Pod→Fleet wording in module docs |
| crates/tui/src/mcp/tests.rs | Adds tests for MCP display target |
| crates/tui/src/mcp.rs | Adds mcp_display_target presentation helper |
| crates/tui/src/fleet/worker_runtime.rs | Centralizes role permission logic into fleet::role |
| crates/tui/src/fleet/store.rs | Pod→Fleet wording throughout store module docs |
| crates/tui/src/fleet/scheduler.rs | Pod→Fleet error wording |
| crates/tui/src/fleet/profile.rs | Moves role label helper to fleet::role |
| crates/tui/src/fleet/mod.rs | Exposes new fleet::role module |
| crates/tui/src/fleet/members.rs | Moves public_role_label import |
| crates/tui/src/fleet/host.rs | Pod→Fleet wording in SSH host errors |
| crates/tui/src/fleet/control.rs | /pod→/fleet wording; receipt key expectations |
| crates/tui/src/fleet/alerts.rs | Pod→Fleet wording in alerts + commands |
| crates/tui/src/doctor.rs | Pod→Fleet wording in path report contexts |
| crates/tui/src/core/engine/turn_loop.rs | Title animation base casing update |
| crates/tui/src/core/engine/preview/tests.rs | Removes fleet_roster from preview route context |
| crates/tui/src/core/engine/preview.rs | Removes fleet_roster from preview route context |
| crates/tui/src/core/engine.rs | Removes fleet_roster from TurnRouteContext |
| crates/tui/src/commands/traits.rs | /rail discovery→/workbar |
| crates/tui/src/commands/mod.rs | Renames /rail command to /workbar (aliases kept) |
| crates/tui/src/commands/groups/core/setup.rs | Retires /setup pod target |
| crates/tui/src/commands/groups/core/core.rs | Pod→Fleet status text in /model messaging |
| crates/tui/src/commands/groups/core/acceptance.rs | Updates acceptance scenario step count |
| crates/tui/src/commands/groups/config/mod.rs | Registers /workbar (aliases rail/sidebar) + theme usage update |
| crates/tui/assets/skills/fleet-manager/SKILL.md | Updates skill copy to Fleet naming |
| crates/lane/src/lib.rs | Re-exports ProvisionedWorktree |
| crates/lane/src/control.rs | Pod→Fleet wording in lane control hints |
| crates/config/src/tests.rs | Removes legacy hotbar normalization test |
| crates/config/src/lib.rs | Removes hotbar action id normalization |
| crates/config/src/app_mode.rs | Pod→Fleet wording for Operate mode |
| config.example.toml | Sidebar→workbar wording in example config |
Review details
- Files reviewed: 71/187 changed files
- Comments generated: 5
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| static RAIL_INFO: CommandInfo = CommandInfo { | ||
| name: "rail", | ||
| // /sidebar is the name users already know; it now drives the one rail. | ||
| aliases: &["sidebar"], | ||
| usage: "/rail [top|left|right|off|tasks|agents|context|pinned] [--save]", | ||
| name: "workbar", | ||
| // /rail and /sidebar are the names users already know; both now drive | ||
| // the one workbar. | ||
| aliases: &["rail", "sidebar"], | ||
| usage: "/workbar [bottom|top|left|right|off|tasks|agents|context|pinned] [--save]", | ||
| description_id: MessageId::CmdSidebarDescription, |
| /// Hovered-but-not-selected row (Slice G global rule: every clickable | ||
| /// element responds visibly on hover). Underline + bold, deliberately *no* | ||
| /// background fill, so a hovered row can never masquerade as the keyboard | ||
| /// selection (`selected_row_style` owns the `SELECTION_BG` band). Callers | ||
| /// apply this only when `!selected`; selection always wins. |
| #[test] | ||
| fn theme_rows_are_the_thirteen_selectable_themes() { | ||
| assert_eq!(tideline_theme_rows().len(), 13); | ||
| fn theme_rows_are_the_fourteen_selectable_themes() { | ||
| assert_eq!(tideline_theme_rows().len(), 15); | ||
| assert_eq!(tideline_theme_rows().as_slice(), SELECTABLE_THEMES); | ||
| } |
| @@ -126,12 +126,12 @@ fn settings_strip_windows_to_the_selected_category_with_painted_hitboxes() { | |||
| } | |||
|
|
|||
| #[test] | |||
| fn theme_list_shows_thirteen_themes_boxed_selection_and_motion_toggles() { | |||
| let list = TidelineThemeList::new(&UI_THEME, 3).motion(false, true); | |||
| fn theme_list_shows_fourteen_themes_boxed_selection_and_motion_toggles() { | |||
| @@ -936,7 +936,7 @@ codewhale 还把用户偏好存储在: | |||
|
|
|||
| 常用设置键: | |||
|
|
|||
| - `theme`(`system`、`terminal`、`dark`、`light`、`grayscale`、`catppuccin-mocha`、`tokyo-night`、`dracula`、`gruvbox-dark`、`claude`、`matrix`、`solarized-light`;默认 `system`):`system` 跟随终端背景检测,`dark`/`light` 使用 Codewhale Whale 配对,`terminal` 继承宿主终端,`grayscale` 是低意见的黑/白主题,命名的社区预设应用于整个 TUI。`whale`、`mono`、`black-white`、`tokyonight` 和 `gruvbox` 这样的别名被接受。在 Whale 中,钴蓝色拥有动作/焦点,海沫绿拥有实时工作,Signal Gold 拥有人类决策和鲸鱼,珊瑚色拥有警告,玫瑰色拥有危险,紫色拥有 Operate,绿色保持已完成/已验证。文本标签、标记和动效策略在颜色不可用时携带同样的状态;颜色从来不是唯一的线索。用户创作的覆盖只存在于 `~/.codewhale/themes/<name>.json`(或 `$CODEWHALE_HOME/themes/<name>.json`),用 `/theme custom:<name>` 选择。文件名是有界的 slug,符号链接和超过 64 KiB 的文件被拒绝,颜色必须是 `#RRGGBB`,未知字段会验证失败。`/theme schema` 打印嵌入的 JSON Schema,`/theme path` 显示确切目录。覆盖命名一个编译好的 `base` 主题,只改变列出的语义颜色;它不能包含或读取另一个文件。 | |||
| - `theme`(`system`、`terminal`、`underwater`、`underwater-retro`、`dark`、`light`、`grayscale`、`catppuccin-mocha`、`tokyo-night`、`dracula`、`gruvbox-dark`、`claude`、`matrix`、`solarized-light`、`uwu`;默认 `system`):`system` 跟随终端背景检测,`dark`/`light` 使用 Codewhale Whale 配对,`terminal` 继承宿主终端,`grayscale` 是低意见的黑/白主题,命名的社区预设应用于整个 TUI。`whale`、`mono`、`black-white`、`tokyonight` 和 `gruvbox` 这样的别名被接受。在 Whale 中,钴蓝色拥有动作/焦点,海沫绿拥有实时工作,Signal Gold 拥有人类决策和鲸鱼,珊瑚色拥有警告,玫瑰色拥有危险,紫色拥有 Operate,绿色保持已完成/已验证。文本标签、标记和动效策略在颜色不可用时携带同样的状态;颜色从来不是唯一的线索。用户创作的覆盖只存在于 `~/.codewhale/themes/<name>.json`(或 `$CODEWHALE_HOME/themes/<name>.json`),用 `/theme custom:<name>` 选择。文件名是有界的 slug,符号链接和超过 64 KiB 的文件被拒绝,颜色必须是 `#RRGGBB`,未知字段会验证失败。`/theme schema` 打印嵌入的 JSON Schema,`/theme path` 显示确切目录。覆盖命名一个编译好的 `base` 主题,只改变列出的语义颜色;它不能包含或读取另一个文件。 | |||
There was a problem hiding this comment.
Codewhale review
PR #5862 retires the pod CLI alias and fully renames Pod to Fleet across CLI, config, lane control, and locale strings. It also renames sidebar/rail to workbar, changes default placement to bottom, regroups settings, changes default theme to underwater, adds new rail panel options, and consolidates tests. The changes are largely mechanical and the test suites reportedly pass, but several compatibility and test-quality issues remain.
Findings
- [WARNING] CLI test assertion is ineffective due to case mismatch (
crates/cli/src/lib.rs:6569)
Incrates/cli/src/lib.rs, the testfleet_is_the_only_top_level_command_and_pod_is_rejectedasserts!help.contains("Manage durable Agent Fleet runs"). The actual command summary in the doc comment is 'Manage durable Agent fleet runs' (lowercase 'f'). The assertion therefore always passes, even if the summary is present in top-level help. The intent is unclear because Fleet is not retired; the test comment says 'the retired Fleet-led summary must be gone', but Fleet remains the command. This does not guard against regressions where the old Pod text is reintroduced. - [WARNING] Removal of hotbar action normalization breaks existing
slash.podbindings (crates/config/src/lib.rs:1433)
The functionnormalize_hotbar_action_idwas removed andresolve_hotbar_bindingsnow clones the action directly. Users with saved hotbar slots containingslash.podwill have those slots treated as unknown actions without migration. This is a deliberate breaking change, but it is likely to silently disable functionality for existing users. A migration or a load-time warning would be safer. - [INFO] New rail panel options have empty label/detail strings (
crates/config/src/settings_schema.rs:314)
The settings schema addsbackground,files,notepad,git, andpriceoptions with empty strings for label and detail. The comment suggests the UI relies on raw value fallback, but if the settings editor requires these strings to be non-empty, these options will render as blank rows. This needs verification or fallback logic.
Suggestions
crates/cli/src/lib.rs:6569— Remove the ineffective assertion or correct the string to match the actual command summary ('Manage durable Agent fleet runs') if the intent is to ensure that text is absent from top-level help. Since Fleet is a valid subcommand, that line likely should not be in top-level help in the first place; consider dropping the assertion entirely.crates/config/src/lib.rs:1433— Consider keeping a lightweight migration or adding a warning when a legacyslash.podaction is encountered during hotbar resolution, so users are not silently left with broken bindings.crates/config/src/settings_schema.rs:314— Verify that the settings UI falls back to the raw value when label/detail are empty for the new rail panel options; otherwise provide proper localization keys for these options to avoid blank entries.
Assessment
The PR is a large but mostly mechanical rename and UI regroup. The reported test gates are green, but the ineffective CLI test assertion and the compatibility risks with hotbar bindings and potential blank settings entries should be addressed before merge. The changes are otherwise coherent and align with the stated 0.9.12 UX goals.
Advisory review by Codewhale (codewhale review --pr 5862 --post, head 1454f895f61ebf50dc492ad74a4f24b11ea8ec6a). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.
| assert!( | ||
| !help.contains("Manage durable Agent Pod runs"), | ||
| "the retired Pod-led summary must be gone from top-level help" | ||
| !help.contains("Manage durable Agent Fleet runs"), |
There was a problem hiding this comment.
[WARNING] CLI test assertion is ineffective due to case mismatch
In crates/cli/src/lib.rs, the test fleet_is_the_only_top_level_command_and_pod_is_rejected asserts !help.contains("Manage durable Agent Fleet runs"). The actual command summary in the doc comment is 'Manage durable Agent fleet runs' (lowercase 'f'). The assertion therefore always passes, even if the summary is present in top-level help. The intent is unclear because Fleet is not retired; the test comment says 'the retired Fleet-led summary must be gone', but Fleet remains the command. This does not guard against regressions where the old Pod text is reintroduced.
| @@ -1447,7 +1433,7 @@ pub fn resolve_hotbar_bindings( | |||
| .iter() | |||
There was a problem hiding this comment.
[WARNING] Removal of hotbar action normalization breaks existing slash.pod bindings
The function normalize_hotbar_action_id was removed and resolve_hotbar_bindings now clones the action directly. Users with saved hotbar slots containing slash.pod will have those slots treated as unknown actions without migration. This is a deliberate breaking change, but it is likely to silently disable functionality for existing users. A migration or a load-time warning would be safer.
| "ConfigChoiceRailAgents", | ||
| "ConfigChoiceDetailRailAgents", | ||
| ), | ||
| SettingOption::new("background", "", ""), |
There was a problem hiding this comment.
[INFO] New rail panel options have empty label/detail strings
The settings schema adds background, files, notepad, git, and price options with empty strings for label and detail. The comment suggests the UI relies on raw value fallback, but if the settings editor requires these strings to be non-empty, these options will render as blank rows. This needs verification or fallback logic.
| !help.contains("Manage durable Agent Pod runs"), | ||
| "the retired Pod-led summary must be gone from top-level help" | ||
| !help.contains("Manage durable Agent Fleet runs"), | ||
| "the retired Fleet-led summary must be gone from top-level help" |
There was a problem hiding this comment.
Remove the ineffective assertion or correct the string to match the actual command summary ('Manage durable Agent fleet runs') if the intent is to ensure that text is absent from top-level help. Since Fleet is a valid subcommand, that line likely should not be in top-level help in the first place; consider dropping the assertion entirely.
| @@ -1447,7 +1433,7 @@ pub fn resolve_hotbar_bindings( | |||
| .iter() | |||
There was a problem hiding this comment.
Consider keeping a lightweight migration or adding a warning when a legacy slash.pod action is encountered during hotbar resolution, so users are not silently left with broken bindings.
| "ConfigChoiceDetailRailAgents", | ||
| ), | ||
| SettingOption::new("background", "", ""), | ||
| SettingOption::new("files", "", ""), |
There was a problem hiding this comment.
Verify that the settings UI falls back to the raw value when label/detail are empty for the new rail panel options; otherwise provide proper localization keys for these options to avoid blank entries.
| "child stays on the session endpoint, got {}", | ||
| child.client.base_url() |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_6a348b73-6a7e-40e6-b121-335fc611803c) |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_46942469-c00c-4b63-960a-db0ed5edd046) |
|
Claude finished @Hmbown's task in 1m 24s —— View job Claude is reviewing this PR
|
There was a problem hiding this comment.
Codewhale review
Fleet-only UX integration for 0.9.12: removes pod spelling and compat shims, renames sidebar/rail to workbar, changes settings defaults and grouping, updates locales, and adds launch-screen recent sessions. Large but mostly mechanical; main risks are backward compatibility for removed settings and stale non-English UI text.
Findings
- [WARNING] Stale keyboard shortcut description still references removed Pinned panel (
crates/tui/locales/en.json:651)
KbFocusSidebarin en.json lists "Tasks / Agents / Context / Pinned", but therail_panelenum no longer includespinnedand now includes background, files, notepad, git, and price. Users reading the shortcut help will see an outdated panel list. - [WARNING] Removing
pinnedfromrail_panelenum may break existing user configs (crates/config/src/settings_schema.rs)
TheRAIL_PANELsetting loses thepinnedoption without a visible load-time migration. Existing TOML configs that setrail_panel = "pinned"may fail to parse or become invalid after upgrade, producing a broken settings file. Consider accepting the legacy value and mapping it totasksor adding a migration. - [INFO] Non-English locales retain 'Sidebar' terminology after workbar rename
Several locale files (ca, de, es-419, fr, hi, id, ja) still translateConfigLabelWorkSurfacePlacementandConfigSectionSidebaras 'Sidebar' while the English locale and command names now use 'Workbar'. This produces an inconsistent UI for non-English users. - [INFO] Missing tests for settings removal migrations and new defaults
The PR removesocean_treatment, the whale status indicator, and thepinnedrail panel, and changes defaults forthemeandwork_surface_placement. No tests are added to prove old configs migrate or fail gracefully. Given the breakage risk, add tests for load-time migration/validation of these settings.
Suggestions
-
crates/tui/locales/en.json:651— Update the shortcut help to match the new rail_panel options, removing the retired Pinned panel and including the new workbar panels."KbFocusSidebar": "Focus the Tasks / Agents / Background / Files / Notepad / Context / Git / Price workbar panel",
Assessment
The change is coherent and the code paths are updated consistently for the Fleet-only rename. Main concerns are backward compatibility for removed settings and stale user-facing text. No critical correctness errors were found in the reviewed diff, but the compatibility risks should be addressed before merge.
Advisory review by Codewhale (codewhale review --pr 5862 --post, head 0f90457e474f2c21971595022f3e723253522549). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.
| @@ -655,7 +651,7 @@ | |||
| "KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)", | |||
There was a problem hiding this comment.
[WARNING] Stale keyboard shortcut description still references removed Pinned panel
KbFocusSidebar in en.json lists "Tasks / Agents / Context / Pinned", but the rail_panel enum no longer includes pinned and now includes background, files, notepad, git, and price. Users reading the shortcut help will see an outdated panel list.
| @@ -655,7 +651,7 @@ | |||
| "KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)", | |||
There was a problem hiding this comment.
Update the shortcut help to match the new rail_panel options, removing the retired Pinned panel and including the new workbar panels.
| "KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)", | |
| "KbFocusSidebar": "Focus the Tasks / Agents / Background / Files / Notepad / Context / Git / Price workbar panel", |

Integrates 10 slices onto fix/0912-ux-20260902 for the 0.9.12 release.
Slices (each on its own branch, merged --no-ff):
Gates on merged tree: tui lib 11617 passed / 13 skipped; tui-integration 279/280 (1 load flake, passes alone); cucumber 16/16; cli 333; config 626; lane 67; workspace clippy clean; cargo fmt clean. Goldens jointly re-blessed (B+F+E+C+retro): startup dots-only diff, picker/settings show Underwater Retro row.
Note
Medium Risk
Breaking change for scripts or muscle memory using
codewhale podand hotbarslash.pod, plus new workbar defaults and trimmed settings UI that may surprise upgraded configs.Overview
Retires the
podspelling end-to-end in favor of Fleet: the top-levelcodewhale podalias is removed (those tokens fall through as prompt text instead of dispatching), TUI passthrough and help text usefleetonly, hotbar no longer maps legacyslash.podtoslash.fleet, and user-facing copy/skills/lane hints are updated accordingly.Renames “sidebar/rail” to workbar in settings, commands, and locales, with
work_surface_placementdefaulting tobottom(new bottom-bar choice) and expanded rail panel options (background,files,notepad,git,price; Pinned and some editor-only rows dropped).Reorganizes the settings schema: default theme
underwater, removesocean_treatmentand the animated whale status option, drops the dedicated Fleet config tab (fleet.exec.max_spawn_depthmoves under Models), and hides several Advanced rows (fast_model,default_model,features.vision_model) while keeping them/set-able.Launch screen copy/flow gains recent-session strings, worktree success/escape hints, and updated Claude migration text;
ProvisionedWorktreeis re-exported from the lane crate.Reviewed by Cursor Bugbot for commit 0f90457. Bugbot is set up for automated code reviews on this repo. Configure here.