Spec: add a discoverable return to Harness below Control Rail settings #2289
Description
Problem Statement
Humans in Bot mode cannot readily discover how to return to the standard Harness workspace. The top Bot logo can look like branding rather than navigation, so users can believe the previous Harness interface is gone.
Bot mode intentionally remembers whether the Human last had it open and restores that view on the next launch. Installation does not automatically enter Bot mode. The maintainer clarified this on 2026-10-19. Last-opened-mode restoration is expected behavior and must remain intact.
The original report did not record product version or platform and was not independently reproduced in that original environment. Current main's qualified wide workspace presents its exit as a Bot logo that changes to an exit icon on hover or keyboard focus. Existing earlier onboarding work does not fully address this surface: #1496 shipped a checklist and exit walkthrough, while #2200 later replaced the current Desktop first-use journey with Tob + Home and four short layout tips.
Solution
For the qualified wide Desktop/Web workspace, keep the existing top Bot-logo exit behavior and add a second, clearly recognizable, always-visible return icon at the bottom of the Control Rail, immediately below Bot settings.
The new icon's accessible name and tooltip are Back to Harness / 返回 Harness. Clicking it returns to the ordinary Harness workspace immediately through the existing mode-exit operation. It does not stop PersonaBots or reset the Bot-mode layout.
The Human confirmed this solution, first-slice scope and testing seam on 2026-10-19. This issue is the executable specification; publishing it authorizes no implementation, merge or release by this specification task.
User Stories
- As a Human unfamiliar with Bot mode, I want a recognizable return icon, so that I can discover how to reach the ordinary Harness workspace.
- As a Human reopening the app in Bot mode, I want the same return control available immediately, so that restored state does not leave me searching for a way out.
- As a Human entering Bot mode deliberately, I want its return control available without completing onboarding, so that navigation is independent of setup.
- As a returning Human who skips or pauses onboarding, I want the return icon to remain visible, so that I do not have to replay a tutorial.
- As a Human scanning the Control Rail, I want the return icon immediately below Bot settings, so that it has a stable place at the bottom.
- As a Human using the existing top logo, I want it to retain its current exit behavior, so that an established interaction continues to work.
- As a Human unsure what the new icon does, I want a tooltip naming Harness, so that I understand its destination before clicking.
- As a keyboard user, I want to focus and activate the return control, so that leaving Bot mode does not require a pointer.
- As a Human using English or Chinese, I want a localized accessible name and tooltip, so that the destination is understandable.
- As a Human using either theme, I want a readable icon and visible focus state, so that the return action remains usable.
- As a Human with Home open or no selected Channel, I want the return control available, so that it does not depend on a conversation.
- As a Human moving the Control Rail, I want the return control to move with it and stay below settings, so that rearranging panels preserves navigation.
- As a Human returning to Harness and refreshing, I want Harness to remain selected, so that my explicit exit is remembered.
- As a Human who later chooses Bot mode again, I want my existing chats, unsent drafts and saved panel layout retained, so that switching views does not erase work.
- As a Human with running PersonaBot work, I want leaving Bot mode to change the displayed view only, so that an exit control is not mistaken for stopping or logging out.
Implementation Decisions
- Bounded surface. Implement only the qualified wide Desktop/Web workspace Control Rail. Use the existing workspace eligibility and lifecycle, including its responsive cutoff; do not broaden native-shell qualification or force the wide workspace into an unsupported shell. Narrow responsive Web, mobile Web, the independent Expo app and the legacy sidebar fallback are outside this slice.
- Two deliberate entry points, one operation. Preserve the top logo's current behavior, including its hover/focus presentation. Add the bottom return control as explicitly requested by the Human. Both invoke the same existing application-defined exit callback. Do not create another mode store, navigation owner or exit lifecycle.
- Placement and visibility. Place the new icon button immediately after Bot settings at the bottom of the Control Rail, outside the scrolling panel-switch list. Keep it visible without hover, selection or onboarding completion. Moving the Control Rail preserves this order. Do not add a text row or widen the rail for this slice.
- Label and styling. Use Back to Harness in English and 返回 Harness in Chinese for both the accessible name and tooltip. Reuse the existing exit/return glyph and established Control Rail icon-button and tooltip patterns with DSH tokens. Support hover, focus-visible and ordinary keyboard button activation. The icon must express return in its resting state; it must not show a Bot logo until hover.
- DSH-native navigation seam. Keep the existing Client Plugin's Slots/layout ownership. The current callback selects the DSH-native Conversation via the public layout operation with a null panel selection. Upstream documents this as changing the selected panel without changing the current Session. BotHarness mode persistence and workspace cleanup remain the existing application-defined behavior. No new Host bridge, API Gateway route, Bot tool or Host persistence is needed.
- Restoration. Keep the existing last-view preference as the sole mode-restoration authority. A manual exit through either entry point records the ordinary Harness view. Re-entry or a later refresh while Bot mode is active continues to restore Bot mode normally. This work must not alter install defaults or onboarding triggers.
- Preservation. Reuse current workspace disposal/restoration and native shell recovery. Do not reset panel geometry, create or delete PersonaBots, clear drafts, send messages, stop executions, sign out or add an exit confirmation dialog.
- Onboarding boundary. Do not restore the old mandatory checklist or introduce a separate first-run hint, new walkthrough step, progress receipt or tutorial reset in this slice. The permanent control works independently of all guide participation states.
- Delivery records. Implementation updates the maintained Control Rail/mode-exit verification journey and feature map, adds a bilingual release fragment and records any necessary current UI documentation changes. With no new Host operation, there is no new CLI command; existing CLI parity requirements still apply if implementation unexpectedly expands the boundary.
Testing Decisions
- Human-confirmed highest seam. Acceptance is a real isolated DSH Host operated through the actual Client: enter or restore Bot mode → activate the bottom Back to Harness control → observe ordinary Harness → refresh and remain in Harness → deliberately enter Bot mode again. Use the repository's isolated Host verification workflow. A direct state mutation or mocked layout call alone does not qualify the user path. No model response is required.
- Observable success. The resting screenshot visibly includes the return icon beneath settings, with no pointer over it. Activation restores native Harness navigation and removes Bot-mode workspace chrome. Re-entry preserves the same PersonaBot/Channel identities, available history, unsent draft and saved panel geometry. Verify canonical identities/history through existing read APIs after the visible actions.
- Existing test seams. Prefer mounted Client interaction coverage using the existing exit callback and real mode lifecycle over a new Service or reducer. Reuse the sidebar/panel-entry interaction tests, last-view restoration tests, workspace-shell cleanup tests and the maintained panel-workspace browser journey as prior art. Test the new button's click and keyboard behavior, localized accessible label and position relative to settings. Do not use a private state enum or generated CSS snapshot as the acceptance condition.
- Restoration regression. Cover both deliberate entry and a reload restoring a previously active Bot view. Verify manual exit persists across reload, and explicit subsequent Bot entry still persists normally. Starting with no prior Bot-mode preference must not introduce automatic entry.
- Presentation matrix. Inspect light/dark and English/Chinese, pointer and keyboard activation, fresh/Home and existing-conversation states, skipped/paused/completed guides, moved Control Rail and a constrained window height. The exit stays reachable when the panel-switch list scrolls. Existing top-logo exit remains functional. Crossing to the narrow fallback must remove the wide-only control and return without losing saved wide layout.
- Evidence boundaries. Save screenshots, accessible snapshots and console/Client diagnostic output with the exact source revision and runtime version. Browser verification and genuine native Desktop verification are separate results; never label a Web run as Desktop QA. Implementation must record native Desktop review according to the repository UI gate and keep unrun platforms explicit. Before/after PR screenshots must satisfy repository publication rules.
Out of Scope
- Changing last-opened-mode restoration, installation behavior, startup defaults or first-entry triggers.
- Replacing or removing the existing top-logo exit.
- Widening the Control Rail or adding a permanent text row.
- New onboarding flows, mandatory tutorials, extra first-run prompts or restoring the old checklist.
- Narrow/mobile Web, the Expo app or legacy sidebar-fallback redesign.
- The collapsed legacy-rail progress ring and entry hint owned by Onboarding: show the progress ring and "Try it" hint on the collapsed sidebar rail #1519.
- Host APIs, new CLI commands, credentials, model setup, PersonaBot execution controls or production Bot changes.
- [Bug] 工作区写权限授权链路失效:UI 批准后 orchestrator_write 不落盘;grant-write-set 在线/离线均不可用(1.3.1) #2080, Cloud channel UX: source marks, organization navigation and scoped sharing #2161 or 1.4.0: forward-compatible DSH 0.2.x admission and release qualification #2167.
- Implementing code, merging, publishing a release or changing production as part of this specification task.
Further Notes
- Baseline: latest origin/main verified at
99a224faf3d22e7e60e7420b6e410f89f90bad29on 2026-10-19. This task uses its owncodex/2289-bot-mode-discoverybranch/worktree and does not carry existing shared-checkout changes. - Related completed work: Spec: Bot-mode onboarding from the default DeepSeek Bot to a first real conversation #1174, Onboarding: getting-started checklist launched from a progress ring in the Bot-mode row #1496 and feat: simplify Desktop onboarding around Tob and real Home dismissal #2200. Keep this issue focused on the currently agreed permanent bottom return entry rather than reopening their scope.
- Existing startup restoration is supported by current source inspection and the maintainer's correction. The original platform/version remains unknown; this specification does not claim reproduction of that original environment.
- Upstream navigation contract: DSH UI layout. Verify the implementation against the task's installed pinned DSH generation as well as official sources.
- Task reference:
codex/local/01a152fa-e500-7cf1-a044-47574cae8cd0(not a DSH Session). Scope: investigation and specification only. Product code and the new bottom return button are not implemented by this task. - Specification task claim.
- Baseline verification limit: the unchanged main build completed. The isolated verification launcher then refused before Host launch because the machine-local selected OpenCode Go model is absent from the pinned native catalog. No live Client reproduction, screenshot or native Desktop acceptance was obtained by this specification task. Shared model configuration was not changed; the real UI round trip above remains an implementation acceptance requirement.
Activity
[-]Installed plugin opens in Bot mode with no discoverable way back to the standard workspace[/-][+]Bot mode return to the standard Harness workspace is hard to discover[/+]DoodleBears commentedon Oct 19, 2026
Agent work claim
codex/local/01a152fa-e500-7cf1-a044-47574cae8cd0(not a DSH Session)codex/2289-bot-mode-discoveryThe Human confirmed retaining the top-logo exit and adding a permanent return icon below Bot settings in the qualified wide Desktop/Web Control Rail. The Human also confirmed the real isolated Host/Client round-trip acceptance seam. Preserve last-opened-mode restoration and existing onboarding. No merge, release or production change is requested.
[-]Bot mode return to the standard Harness workspace is hard to discover[/-][+]Spec: add a discoverable return to Harness below Control Rail settings[/+]DoodleBears commentedon Oct 19, 2026
Agent work outcome
codex/local/01a152fa-e500-7cf1-a044-47574cae8cd0(not a DSH Session)codex/2289-bot-mode-discovery, from latest verified main99a224faf3d22e7e60e7420b6e410f89f90bad29ready-for-agenttriage state; no duplicate issue, product implementation, PR, merge or releaseThe Human corrected the startup attribution: this is intentional restoration of previously open Bot mode, not entry triggered by installation. The Human explicitly chose the wide Desktop/Web first slice and confirmed both the affordance and testing seam.
Existing #1496/#1174 work and the later #2200 Tob/Home onboarding were reviewed. The specification does not restore an old checklist or add another onboarding lifecycle.
Evidence limit: unchanged main build completed; the isolated launcher refused before starting a Host because the local selected OpenCode Go model is absent from the pinned native catalog. No live UI reproduction or new-button acceptance is claimed. The task did not change shared model configuration or any running Host.
DoodleBears commentedon Oct 19, 2026
Agent work claim
codex/local/01a152fa-e500-7cf1-a044-47574cae8cd0(not a DSH Session)codex/2289-bot-mode-discoveryThe Human explicitly requested implementation and authorized merging after local screenshots and E2E pass and screenshots are embedded in the PR. Start from updated main
33334b22cb7d9e79f667b171d089c71df2dc572a. Keep the top logo and existing last-view authority. Use the already confirmed Client interaction and real Host round-trip seams. Do not change production Bots or shared model configuration.DoodleBears commentedon Oct 19, 2026
Agent work completion
codex/local/01a152fa-e500-7cf1-a044-47574cae8cd0(not a DSH Session)7c2755b16e8761f9256d8443c8d1afe474315d6cDelivered the permanent bottom Back to Harness / 返回 Harness icon below settings, retaining the original top-logo exit and last-view authority. The task also fixed the reproduced Windows vfile browser-import prerequisite with existing bundle contract coverage.
The Human authorized merge after local screenshot review, E2E and PR screenshots. The matched English/light and Chinese/dark images were inspected locally and all four were confirmed loaded at 1440 × 900 in GitHub. Real isolated-Host Web E2E passed pointer/keyboard exit, last-mode restoration, moved rail, short/narrow transitions, unchanged Channel identities and message history, real unsent Home/Channel drafts and paused/skipped guide states. Independent Standards and Spec reviews report zero remaining findings. Complete CI passed on the merged PR head, including all three full-suite shards and isolated-Host smoke; CodeRabbit completed without actionable findings.
Boundaries remain explicit in the PR: the local Windows full run completed with 7,325 passed / 89 failed / 41 skipped (37 failed files, none under Client tests); a separate telemetry run reproduced fixture-cleanup EPERM. These were not labelled a local full pass. Native Desktop was not qualified by Web evidence. The task-owned UI Host has stopped and its temporary Profile was removed; screenshots and test evidence remain.
feat(client): add a permanent return to Harness below settings (BotHa…