Engel’s notebook

Home and starting work

F03 · 42 mapped behaviors in the Self-Healing Codebase Project. Follow the prerequisites, actions and expected results; expand the original CLI recipe to replay it.

778 behavior IDs · 28 families · 844 named recipes & support steps
16 October 2026 · PR #18334 at 9a3c3a69
Canvas 1.27.1 · Agent Server 1.55.0 · automation 1.20.0

This is the map at the revision above, including its open bug notes. It does not incorporate later changes on main or claim a fresh verification run. Setup & reading guide · Download the scenario inventory

All scenarios & marker key · Open a script to read Given / Do / Expect. Expand the exact recipe for replayable commands.

F03 Home and starting work

42 behaviors · 46 scripts & contracts · Maintained source

Entry points & prerequisites

What this family covers

Home is the "What do you want to work on?" screen at / and /conversations. A Code / Automate toggle above the composer picks what a submit starts: a coding conversation, or an automation setup conversation where the agent fills an automation form. A user describes a task in the composer and, on a local backend, can first pick a workspace folder (Open Workspace, folder browser, Manage Workspaces), a workspace mode and plugins; submitting creates a conversation and opens it. A warning banner replaces a silent failure when no LLM is configured. Below the composer, home offers recommended automations, a pinned-automations grid and an activity list of enabled automations with per-item actions.

How a user gets here

  • Sidebar New Chat (sidebar-conversations-link), which opens /conversations; the logo does the same (see F02).
  • Direct URL / (unless a page is pinned as home, see F02) or /conversations.
  • Command menu (Control+k, Meta+k or command-menu-trigger): search "New chat", choose New chat.
  • Above the composer: the Code / Automate toggle (home-launcher-mode-code, home-launcher-mode-automate).
  • Under the composer: Open Workspace (open-workspace-button) or, once confirmed, the preview bar (home-git-control-bar-preview); Plugins (open-plugin-picker).
  • In the Open Workspace dialog: the combobox (workspace-dropdown) and its footer + Add Workspace (add-workspaces-button) and Manage Workspaces (manage-workspaces-button, shown once any workspace or parent exists); in Add workspaces, the Favorites/Locations sidebar (folder-browser-sidebar-<name>).
  • Below the composer: recommended cards (recommended-automation-rail-card-<id>), pinned cards (pinned-automation-card-<id>) and rows (running-automation-row-<id>) with their kebabs; + Add (home-automations-manage).

Given

Preconditions:

  • F03.llm-not-configured-banner and F03.composer-blocked-without-llm need a fresh control-openhands launch --new with only control-openhands onboard --skip done (no llm preset yet). Run them first.
  • Everything else: baseline state with control-openhands llm preset deepseek (deepseek-flash active).
  • Workspace fixtures: control-openhands fixture git-repo --name qa-f03-repo and control-openhands fixture folder --name qa-f03-folder (both under <run>/workspace).
  • Automation fixtures (arranged through F22 import and F21 Turn on, not proof): control-openhands fixture file --name qa-f03-pong.automation.json --content '{"version":1,"kind":"automation","spec":{"name":"QA_F03 Pong","trigger":{"type":"cron","schedule":"0 0 1 1 *","timezone":"UTC"},"enabled":true,"prompt":"Reply with the single word: pong. Do not run any tools."}}' and the same with qa-f03-beta / QA_F03 Beta. Run control-openhands browser goto /automations, then for each file run control-openhands browser click 'testid=automations-add-automation', control-openhands browser click 'testid=automations-import-automation', control-openhands browser upload 'testid=automations-import-file' "$OH_VERIFY_RUN/evidence/_fixtures/qa-f03-pong.automation.json", control-openhands browser click 'testid=import-automation-confirm', control-openhands browser wait 'testid=import-automation-modal' --state detached. Imports arrive disabled: turn each on with control-openhands browser click '[data-testid^="automation-card-"] >> has-text=QA_F03 Pong >> role=button[name="Automation actions"]' and control-openhands browser click 'role=list >> has-text=Export >> role=button[name="Turn on"]'. The yearly cron never fires by itself.
  • Blocked here: F03.open-repository-dialog (OpenHands Cloud backend with a connected GitHub/GitLab/Bitbucket provider), F03.isolated-workspace-notice (isolated-runtime backend), F03.workspaces-unsupported (an Agent Server without /api/workspaces), F03.recommended-prompt-launch (a Tavily/Linear/Jira integration installed so some card has nothing missing).

Starting work:

No-LLM bannerF03.llm-not-configured-bannerMapped behavior

Scenario F03--no-llm-banner · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Setup
    Use the phone viewport.
  2. Setup
    Configure or inspect the model profiles specified in the recipe.
  3. Setup
    Use the desktop viewport.
  4. Do
    Choose “Home llm not configured action”.
  5. Setup
    Configure or inspect the model profiles specified in the recipe.
  6. Do
    Open /.

Expect

with no usable LLM, a role=alert banner reads Your LLM isn't set up yet, so conversations won't run. Finish setup to get started.; Set up LLM opens /settings/llm; the banner is gone once a profile with a key is active.

Exact CLI recipe & bug checks

On a fresh run after onboard --skip, run control-openhands browser text 'testid=home-llm-not-configured-banner': Your LLM isn't set up yet, so conversations won't run. Finish setup to get started. and Set up LLM; control-openhands browser screenshot --feature F03.llm-not-configured-banner --name banner. At phone width (control-openhands browser viewport phone), control-openhands browser bbox 'testid=home-llm-not-configured-banner' is inside the viewport (F03.phone; the banner exists only before llm preset); return with control-openhands browser viewport desktop. control-openhands browser click 'testid=home-llm-not-configured-action' --expect-url '/settings/llm' lands on /settings/llm. Run the blocked-composer bullet and the draft bullet next (they also need no LLM); only then control-openhands llm preset deepseek, control-openhands browser goto / and control-openhands browser count 'testid=home-llm-not-configured-banner' is 0.

Blocked composerF03.composer-blocked-without-llmMapped behavior

Scenario F03--blocked-composer · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Enter “QA no llm” in “Message”.
  3. Do
    Press Enter then --selector then testid=chat-input.

Expect

with no LLM, Send is disabled and Enter creates nothing (the text stays editable).

Exact CLI recipe & bug checks

Still without an LLM, run control-openhands browser goto / (the banner's action left /settings/llm), control-openhands browser type 'testid=chat-input' 'QA no llm', control-openhands browser enabled 'testid=home-chat-launcher >> testid=submit-button' (false), control-openhands browser press Enter --selector 'testid=chat-input', then control-openhands browser url (still /) and control-openhands api GET '/api/conversations/search?limit=5' (items is empty).

DraftF03.draft-persistenceMapped behavior

Scenario F03--draft · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Reload the page.
  2. Do
    Use browser storage as specified in the exact recipe.

Expect

the home draft survives a reload and is cleared after a conversation is created.

Exact CLI recipe & bug checks

With text in the home composer, control-openhands browser reload and control-openhands browser text 'testid=chat-input' returns the same text; control-openhands browser storage --session lists oh:home-prompt-draft. That the draft clears after a successful launch is checked in the first launch (Launch without a folder).

Entry pointsF03.home-entry-pointsMapped behavior

Scenario F03--entry-points · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.
  2. Do
    Open /settings/secrets.
  3. Do
    Press Control+k.
  4. Do
    Enter “New chat” in “Command menu” / the combobox.
  5. Do
    Press Enter.
  6. Do
    Open /settings/secrets.
  7. Do
    Choose “Sidebar conversations”.

Expect

/, /conversations, the sidebar New Chat and the command-menu item New chat show the launcher (home-chat-launcher) with the heading, subtitle, the Code / Automate toggle and the composer, whose Code-mode placeholder reads What do you want to build?.

Exact CLI recipe & bug checks

control-openhands browser goto /conversations and control-openhands browser count 'testid=home-chat-launcher' is 1 (same for /). From /settings/secrets (control-openhands browser goto /settings/secrets), control-openhands browser press Control+k, control-openhands browser type 'testid=command-menu >> role=combobox' 'New chat', control-openhands browser snapshot 'testid=command-menu' (one option New chat Start a fresh OpenHands conversation. Go [selected]), control-openhands browser press Enter, control-openhands browser url: /conversations. From /settings/secrets (control-openhands browser goto /settings/secrets again), control-openhands browser click 'testid=sidebar-conversations-link' --expect-url '/conversations(\?|$)' and browser count 'testid=home-chat-launcher' is 1.

`/model` on homeF03.home-model-commandMapped behavior

Scenario F03--model-on-home · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Enter “” in “Message”.
  3. Do
    Enter “/model deepseek-pro” in “Message”.
  4. Do
    Press Escape then --selector then testid=chat-input.
  5. Do
    Press Enter then --selector then testid=chat-input.

Expect

/model <profile> sent from home activates that LLM profile without creating a conversation.

Exact CLI recipe & bug checks

control-openhands api GET /api/profiles shows active_profile deepseek-flash. Run control-openhands browser goto / (Entry points ended on /conversations). The draft from the earlier bullets is still in the composer: clear it with control-openhands browser fill 'testid=chat-input' '' (typing would append). Run control-openhands browser type 'testid=chat-input' '/model deepseek-pro', control-openhands browser press Escape --selector 'testid=chat-input' (closes the slash menu), control-openhands browser press Enter --selector 'testid=chat-input'. The URL stays /, chat-input is empty, the composer's model pill (browser text 'testid=chat-input-llm-profile') reads deepseek-pro, api GET /api/profiles shows active_profile deepseek-pro, and api GET '/api/conversations/search?limit=20' lists no new conversation. Restore with the same steps and /model deepseek-flash.

Launch without a folderF03.launch-without-workspace · F03.draft-persistenceKnown issueBlocked

Scenario F03--launch-without-a-folder · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.
  2. Wait
    Wait for the conversation to finish.
  3. Do
    Choose “Sidebar conversations”.
  4. Do
    Use browser storage as specified in the exact recipe.

Expect

with nothing picked, the conversation runs in a fresh per-conversation folder under the server home.

the home draft survives a reload and is cleared after a conversation is created.

Linked known issues

Known issue #16801 (F03.launch-without-workspace): Agent starts by looking in workspace, even when started with "no workspace". Live prerequisite: A working Claude Opus agent and the original task/prompt that makes it explore the default workspace; the prompt is absent.

Exact CLI recipe & bug checks

Run control-openhands browser goto /conversations (no workspace is picked yet; the pill reads Open Workspace), then fill chat-input with Reply with only the word ok. and click testid=home-chat-launcher >> testid=submit-button with --expect-url '/conversations/[^/]+$'. control-openhands conversation wait <id> --timeout 180 reports workspace <run>/private/home/workspace/project/<id without dashes>. This is the first successful launch: control-openhands browser click 'testid=sidebar-conversations-link' --expect-url '/conversations$' shows an empty chat-input and browser storage --session no longer lists oh:home-prompt-draft.

Code / Automate toggleF03.launcher-mode-toggleMapped behavior

Scenario F03--code-automate-toggle · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Enter “” in “Message”.
  3. Do
    Choose “Home launcher mode automate”.
  4. Do
    Reload the page.
  5. Do
    Reload the page.
  6. Do
    Hover over “Home launcher mode automate”.
  7. Do
    Reload the page.

Expect

a Choose launcher mode radio group above the composer offers Code (checked on every page load) and Automate. Automate changes the placeholder to What work do you want to automate? and greys out and disables the Open Workspace and Plugins row (home-composer-actions aria-disabled="true"); Code restores both. The active option stays readable in every colour theme.

Exact CLI recipe & bug checks

Run control-openhands browser goto /, control-openhands browser fill 'testid=chat-input' '' and control-openhands browser snapshot 'testid=home-launcher-mode-toggle': radiogroup "Choose launcher mode" with radio "Code" [checked] and radio "Automate"; control-openhands browser eval "document.querySelector('[data-testid=chat-input]').getAttribute('data-placeholder')" is What do you want to build?. Run control-openhands browser click 'testid=home-launcher-mode-automate': Automate is checked, the placeholder is What work do you want to automate?, control-openhands browser attr 'testid=home-composer-actions' aria-disabled is true, and control-openhands browser enabled 'testid=open-workspace-button' and control-openhands browser enabled 'testid=open-plugin-picker' are false (browser screenshot --feature F03.launcher-mode-toggle --name automate). control-openhands browser reload brings Code back (browser attr 'testid=home-launcher-mode-code' aria-checked is true). Light theme: arrange control-openhands browser eval "localStorage.setItem('openhands-color-theme','light-plus')" and browser reload, then control-openhands browser eval "getComputedStyle(document.querySelector('[data-testid=home-launcher-mode-code]')).color" and browser screenshot 'testid=home-launcher-mode-toggle' --feature F03.launcher-mode-toggle --name light-plus-code. The checked label uses the theme's high-emphasis ink (text-contrast): rgb(31, 31, 31) on the light pill, and a hovered inactive option (control-openhands browser hover 'testid=home-launcher-mode-automate') turns the same dark ink; Solarized Light reads rgb(0, 43, 54), also at phone width. Restore with browser eval "localStorage.removeItem('openhands-color-theme')" and browser reload.

Automate launchF03.launch-automate-modeMapped behavior

Scenario F03--automate-launch · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Home chat launcher” / “Submit”.
  2. Wait
    Wait for the conversation to finish.

Expect

submitting in Automate mode creates a conversation and opens /conversations/<id> as an automation setup split view: the chat on the left and the automation form (automation-setup-panel) on the right, whose fields the agent fills with ✦ Filled by OpenHands markers. Attached plugins are not sent, and nothing is created until Create Automation. The setup view itself is F22's.

Exact CLI recipe & bug checks

On / click testid=home-launcher-mode-automate, fill chat-input with Set up a disabled automation named QA_F03 Auto that runs every day at 09:00 UTC with the prompt: Reply with the single word pong. Only fill the automation form; do not run any other tools and do not create the automation. and run control-openhands browser click 'testid=home-chat-launcher >> testid=submit-button' --expect-url '/conversations/[^/]+'. The page shows automation-setup-panel beside the chat (browser testids --filter automation-setup lists automation-setup-form, automation-setup-create, automation-setup-save-draft). After control-openhands conversation wait <id> --timeout 240 is finished, control-openhands browser value 'testid=automation-setup-name' is QA_F03 Auto and the filled fields carry ✦ Filled by OpenHands (browser screenshot --feature F03.launch-automate-mode --name setup-split), while control-openhands api GET /api/automation/v1 --pick total is still 0. The sidebar row is tagged Automation setup: Draft.

PluginsF03.plugin-pickerKnown issueBlocked

Scenario F03--plugins · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.
  2. Do
    Choose “Open plugin picker”.
  3. Wait
    Wait for “Plugin picker loading” to disappear.
  4. Do
    Enter “weather” in “Plugin picker search”.
  5. Do
    Choose “Plugin picker toggle city weather”.
  6. Do
    Choose “Plugin picker done”.

Expect

Plugins opens Attach plugins (catalog, search, Add/Remove switch, N selected, Done and X); the pill then shows a count badge.

Linked known issues

Known issue #16210 (F03.plugin-picker): [Cloud Backends] Plugins not available when starting a new conversation. Live prerequisite: An authenticated Cloud organization with configured account plugins before opening New Chat > Plugins.

Exact CLI recipe & bug checks

Run control-openhands browser goto /conversations (a fresh page), control-openhands browser click 'testid=open-plugin-picker' and control-openhands browser wait 'testid=plugin-picker-loading' --state hidden --timeout 60000; cards plugin-picker-card-<name> are listed. control-openhands browser fill 'testid=plugin-picker-search-input' weather leaves one card (control-openhands browser count '[data-testid^="plugin-picker-card-"]' is 1); zzz-none makes browser text 'testid=plugin-picker' read No plugins available. With weather again, control-openhands browser click 'testid=plugin-picker-toggle-city-weather' --hover-first 150: the footer reads 1 selected and control-openhands browser attr 'testid=plugin-picker-toggle-city-weather' aria-label is Remove. control-openhands browser click 'testid=plugin-picker-done', then control-openhands browser text 'testid=plugin-picker-count' is 1; reopening keeps the switch checked, and testid=plugin-picker-close also closes it. On hover-swapping cards, use --hover-first 150 for subsequent Add/Remove clicks too and assert both the label and aria-checked; the shared index gotcha explains why a plain mouse click can be swallowed (including at phone width).

Plugin reaches the agentF03.launch-with-pluginKnown issueBlocked

Scenario F03--plugin-reaches-the-agent · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.

Expect

a conversation started with a plugin attached loads it; the selection resets afterwards. Workspaces (local backend):

Linked known issues

Known issue #18418 (F03.create-error-toast, F03.launch-with-plugin): hosted runtime 1.50.1 can fail during skills/plugins setup because its packaged plugin-schema resource is missing. Live prerequisite: the affected Cloud runtime/PyInstaller image and original plugin setup plus its account. A Local 1.55.0 launch does not verify that deployment.

Exact CLI recipe & bug checks

With city-weather attached, start the no-folder launch above without its goto (a page load drops the attached plugin), then control-openhands api GET '/api/conversations/<id>/events/search?limit=20': the system prompt contains city-weather:now (a conversation started without the plugin has none). Back on /conversations (control-openhands browser goto /conversations), control-openhands browser count 'testid=plugin-picker-count' is 0.

Creation failureF03.create-error-toastKnown issueBlocked

Scenario F03--creation-failure · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Setup
    Change the run-owned service state: stop agent-server.
  2. Do
    Use browser record as specified in the exact recipe.
  3. Do
    Choose “Home chat launcher” / “Submit”.
  4. Wait
    Wait for the element identified in the CLI recipe to appear.
  5. Wait
    Wait for the status / containing “Creating conversation…” to disappear.
  6. Do
    Use browser record as specified in the exact recipe.
  7. Do
    Restart the run-owned stack as specified.
  8. Do
    Reload the page.

Expect

when creation fails, the loading toast is replaced by one error toast and the prompt is not lost.

Linked known issues

Known issue #18418 (F03.create-error-toast, F03.launch-with-plugin): hosted runtime 1.50.1 can fail during skills/plugins setup because its packaged plugin-schema resource is missing. Live prerequisite: the affected Cloud runtime/PyInstaller image and original plugin setup plus its account. A Local 1.55.0 launch does not verify that deployment.

Exact CLI recipe & bug checks

Fill chat-input with QA error path, run control-openhands service stop agent-server, then clear the observation window with control-openhands browser toasts --clear. Start genuine temporal evidence before submitting: control-openhands browser record start --feature F03.create-error-toast --name failed-launch. Run control-openhands browser click 'testid=home-chat-launcher >> testid=submit-button' --observe 'role=status' --observe-ms 500, then immediately control-openhands browser screenshot --feature F03.create-error-toast --name toasts (this early still may show the loading state). Keep recording and wait for the real error with control-openhands browser wait-text 'HTTP request failed (502 Bad Gateway)' --timeout 15000, then control-openhands browser wait 'role=status >> has-text=Creating conversation…' --state hidden --timeout 15000. browser toasts and browser toasts --history show Creating conversation… replaced by exactly one error toast, such as HTTP request failed (502 Bad Gateway): "Bad Gateway: connect ECONNREFUSED 127.0.0.1:<port+1>" (transport detail is preserved by design, #17985). Count every new error toast in this window; an additional toast is a failure to record, not one to discard. browser text 'testid=chat-input' still reads QA error path and browser enabled 'testid=home-chat-launcher >> testid=submit-button' is true. Stop the recording with control-openhands browser record stop; inspect its loading→error transition and recovered prompt, paired with the full screenshot. Bring the stack back with control-openhands restart and control-openhands browser reload; the prompt remains QA error path.

Workspaces:

Folder browserF03.folder-browserKnown issueBlocked

Scenario F03--folder-browser · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Open workspace”.
  2. Do
    Choose “Workspace dropdown”.
  3. Do
    Choose “Add workspaces”.
  4. Do
    Choose “Folder browser up”.
  5. Do
    Choose “Folder browser entry workspace”.
  6. Do
    Choose “Workspace dropdown”.
  7. Do
    Choose “Add workspaces”.
  8. Do
    Choose “Folder browser cancel”.
  9. Do
    Choose “Folder browser add all subdirs”.
  10. Do
    Choose “Workspace dropdown”.
  11. Do
    Choose “Folder browser use”.

Expect

+ Add Workspace opens Add workspaces at the server home with Favorites/Locations, Up and the current path; Add this directory adds and selects the folder, Add all subdirectories adds a parent whose children become workspaces, Cancel adds nothing.

Linked known issues

Known issue OpenHands/software-agent-sdk#5837 (F03.folder-browser): case-only directory names at a page boundary can repeat the server cursor; Canvas detects the repeated cursor and the directory listing fails instead of showing all choices. Live prerequisite: a case-sensitive filesystem with enough directories to cross the real picker page boundary, including two distinct case-only names. A case-insensitive Mac volume cannot hold that fixture.

Known issue OpenHands/software-agent-sdk#5849 (F03.folder-browser, F03.manage-workspaces): re-adding a saved workspace or removing an already-removed stale row can return500 because the registry writes even for a no-op. Live prerequisite: an owned read-only workspace registry plus the already-saved or stale picker row; changes to registry mtime/inode alone are not a Canvas failure.

Exact CLI recipe & bug checks

Run control-openhands browser click 'testid=open-workspace-button'; before any workspace is picked, control-openhands browser snapshot 'role=dialog' shows Open Workspace, combobox "Select a workspace" and button "Confirm" [disabled] (F03.open-workspace-dialog). Run control-openhands browser click 'testid=workspace-dropdown'; with no saved workspace, control-openhands browser text 'testid=workspace-dropdown-empty' is No workspaces yet, above + Add Workspace (F03.workspace-dropdown-search; browser screenshot --feature F03.workspace-dropdown-search --name empty-list). Run control-openhands browser click 'testid=add-workspaces-button'. control-openhands browser text 'testid=folder-browser-current-path' is <run>/private/home. Run control-openhands browser click 'testid=folder-browser-up' twice (now <run>) and control-openhands browser click 'testid=folder-browser-entry-workspace'; control-openhands browser text 'testid=folder-browser-list' lists qa-f03-folder and qa-f03-repo as Folder (browser screenshot --feature F03.folder-browser --name workspace-dir). Then, reopening the browser each time with browser click 'testid=workspace-dropdown' and browser click 'testid=add-workspaces-button' (the Open Workspace dialog stays open behind it; the browser always restarts at <run>/private/home, so repeat Up twice and folder-browser-entry-workspace):

  • control-openhands browser click 'testid=folder-browser-cancel': browser count 'testid=folder-browser-modal' is 0 and the selection is unchanged.
  • control-openhands browser click 'testid=folder-browser-add-all-subdirs': the browser closes; after browser click 'testid=workspace-dropdown' the dropdown offers qa-f03-folder and qa-f03-repo (browser snapshot 'role=dialog': option "qa-f03-folder", option "qa-f03-repo", button "Manage Workspaces").
  • control-openhands browser click 'testid=folder-browser-use' (Add this directory) at <run>/workspace: control-openhands browser value 'testid=workspace-dropdown' is workspace (auto-selected).
Favorites and locationsF03.folder-browser-locationsMapped behavior

Scenario F03--favorites-and-locations · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Folder browser sidebar /”.

Expect

the browser's Favorites (Home, plus workspace once a no-folder conversation exists) and Locations (/) jump to that folder; Up is disabled at /.

Exact CLI recipe & bug checks

With the browser open, control-openhands browser testids 'testid=folder-browser-sidebar' lists folder-browser-sidebar-home, folder-browser-sidebar-/ and, after any no-folder conversation, folder-browser-sidebar-workspace. control-openhands browser click 'testid=folder-browser-sidebar-/' makes browser text 'testid=folder-browser-current-path' read / and control-openhands browser enabled 'testid=folder-browser-up' false; folder-browser-sidebar-workspace goes to <run>/private/home/workspace and folder-browser-sidebar-home back to <run>/private/home. Close with testid=folder-browser-cancel.

Open WorkspaceF03.open-workspace-dialogMapped behavior

Scenario F03--open-workspace · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Workspace dropdown”.
  2. Do
    Choose “Workspace dropdown menu” / “qa-f03-repo”.
  3. Do
    Choose “Workspace launch”.
  4. Do
    Choose “Home git control bar preview” / the button.
  5. Do
    Choose “Close open workspace dialog”.
  6. Do
    Press Escape.

Expect

Open Workspace opens a dialog with a workspace combobox; Confirm stays disabled until a pick; confirming swaps the pill for a preview bar that reopens the dialog; X and Escape close it.

Exact CLI recipe & bug checks

The dialog is still open from the previous bullets, with workspace selected (its disabled Confirm before a pick is checked at the start of Folder browser). Run control-openhands browser click 'testid=workspace-dropdown', control-openhands browser click 'testid=workspace-dropdown-menu >> role=option[name="qa-f03-repo"]', control-openhands browser enabled 'testid=workspace-launch-button' (true), control-openhands browser click 'testid=workspace-launch-button'. The dialog closes and control-openhands browser text 'testid=home-git-control-bar-preview' is qa-f03-repo and Local Repo (browser screenshot --feature F03.open-workspace-dialog --name preview-bar). control-openhands browser click 'testid=home-git-control-bar-preview >> role=button[name*="qa-f03-repo"]' reopens the dialog with browser value 'testid=workspace-dropdown' qa-f03-repo; control-openhands browser click 'testid=close-open-workspace-dialog' closes it, and so does control-openhands browser press Escape.

Launch in a folderF03.launch-in-workspaceKnown issueBlocked

Scenario F03--launch-in-a-folder · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Enter “Run pwd and reply with only its output.” in “Message”.
  2. Do
    Choose “Home chat launcher” / “Submit”.
  3. Wait
    Wait for the conversation to finish.

Expect

submitting with a workspace picked shows Creating conversation…, opens /conversations/<id>, and the agent runs in that folder.

Linked known issues

Known issue #15701 (F03.launch-in-workspace): Creating Conversation toast stuck visible. Live prerequisite: The original stuck creation request/outcome sequence; the report is intermittent and gives no deterministic trigger.

Exact CLI recipe & bug checks

Open Workspace (above) left qa-f03-repo confirmed in the preview bar. Run control-openhands browser fill 'testid=chat-input' 'Run pwd and reply with only its output.' and control-openhands browser click 'testid=home-chat-launcher >> testid=submit-button' --observe 'text=Creating conversation' --expect-url '/conversations/[^/]+$'. observed shows Creating conversation… then <absent>; the returned URL holds <id>. control-openhands conversation wait <id> --timeout 180 reports workspace <run>/workspace/qa-f03-repo, and control-openhands conversation events <id> --kinds ObservationEvent,MessageEvent shows the terminal observation and the reply <run>/workspace/qa-f03-repo.

Search, groups and emptyF03.workspace-dropdown-searchMapped behavior

Scenario F03--search-groups-and-empty · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Choose “Open workspace”.
  3. Do
    Choose “Workspace dropdown”.
  4. Do
    Enter “repo” in “Workspace dropdown”.
  5. Do
    Enter “zzz-none” in “Workspace dropdown”.
  6. Do
    Enter “” in “Workspace dropdown”.

Expect

typing filters workspaces; with more than one group, workspaces are grouped by parent with an Other group; no match (or no workspaces) shows No workspaces yet.

Exact CLI recipe & bug checks

Run control-openhands browser goto / (Launch in a folder left its conversation), control-openhands browser click 'testid=open-workspace-button' and control-openhands browser click 'testid=workspace-dropdown'. With the dropdown open, control-openhands browser fill 'testid=workspace-dropdown' repo and control-openhands browser text 'testid=workspace-dropdown-menu' is qa-f03-repo. With the parent and the standalone workspace saved, the menu text is workspace, qa-f03-folder, qa-f03-repo, Other, workspace and control-openhands browser count 'testid=workspace-group-header' is 2 (--name grouped). control-openhands browser fill 'testid=workspace-dropdown' zzz-none shows the empty state: control-openhands browser text 'testid=workspace-dropdown-empty' is No workspaces yet (--name no-match) and control-openhands browser count 'testid=add-workspaces-button' is still 1. Clear with control-openhands browser fill 'testid=workspace-dropdown' ''; browser count 'testid=workspace-dropdown-empty' is 0 again.

ReloadF03.selection-after-reloadMapped behavior

Scenario F03--reload · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Reload the page.
  2. Do
    Choose “Workspace dropdown”.
  3. Do
    Choose “Workspace dropdown menu” / “qa-f03-folder”.
  4. Do
    Choose “Close open workspace dialog”.
  5. Do
    Use browser storage as specified in the exact recipe.
  6. Do
    Open /settings.
  7. Do
    Open /conversations.
  8. Do
    Reload the page.
  9. Do
    Choose “Workspace dropdown”.
  10. Do
    Choose “Workspace dropdown menu” / “qa-f03-repo”.
  11. Do
    Choose “Workspace launch”.

Expect

after a reload the preview bar is gone, but the dialog preselects the last workspace picked in its dropdown, confirmed or not: a pick closed with the X survives leaving for another page and coming back, and a reload.

Exact CLI recipe & bug checks

After confirming qa-f03-repo, control-openhands browser reload; control-openhands browser count 'testid=home-git-control-bar-preview' is 0 and the pill is back. Click it; control-openhands browser value 'testid=workspace-dropdown' is qa-f03-repo (sessionStorage oh:home-selected-workspace-path). An unconfirmed pick persists the same way: control-openhands browser click 'testid=workspace-dropdown', control-openhands browser click 'testid=workspace-dropdown-menu >> role=option[name="qa-f03-folder"]' (value qa-f03-folder), then control-openhands browser click 'testid=close-open-workspace-dialog' (never Confirm or Launch): the preview count stays 0 and control-openhands browser storage --session --values shows oh:home-selected-workspace-path ending in /workspace/qa-f03-folder. Leave and come back with control-openhands browser goto /settings (lands on /settings/agents, browser count 'testid=home-screen' 0) and control-openhands browser goto /conversations, click open-workspace-button: browser value 'testid=workspace-dropdown' is qa-f03-folder (browser screenshot --feature F03.selection-after-reload --name unconfirmed-pick-restored). Close with the X, control-openhands browser reload, click the pill again: the value is still qa-f03-folder and browser enabled 'testid=workspace-launch-button' is true. Restore the state the next bullets start from with browser click 'testid=workspace-dropdown', control-openhands browser click 'testid=workspace-dropdown-menu >> role=option[name="qa-f03-repo"]' (value qa-f03-repo, the storage value ends in /workspace/qa-f03-repo) and control-openhands browser click 'testid=workspace-launch-button': the dialog closes and control-openhands browser text 'testid=home-git-control-bar-preview' is qa-f03-repo and Local Repo again.

Workspace modeF03.workspace-modeMapped behavior

Scenario F03--workspace-mode · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Workspace mode selector”.
  2. Do
    Choose “Workspace mode selector option new worktree”.
  3. Do
    Use browser storage as specified in the exact recipe.
  4. Do
    Reload the page.

Expect

the preview bar's mode menu switches Local Repo / New Worktree; the choice persists across reloads.

Exact CLI recipe & bug checks

With the preview bar showing, control-openhands browser click 'testid=workspace-mode-selector', control-openhands browser snapshot 'testid=workspace-mode-selector-menu' (menuitemradio "Local Repo" [checked], menuitemradio "New Worktree"), control-openhands browser click 'testid=workspace-mode-selector-option-new_worktree'. browser storage --values shows openhands-last-local-workspace-mode new_worktree; after browser reload and reconfirming the workspace, browser text 'testid=home-git-control-bar-preview' reads qa-f03-repo and New Worktree. Restore with testid=workspace-mode-selector-option-local_repo.

ManageF03.manage-workspacesKnown issueBlocked

Scenario F03--manage · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Workspace dropdown”.
  2. Do
    Choose “Manage workspaces”.
  3. Do
    Choose “Manage workspaces remove workspace”.
  4. Do
    Choose “Confirmation dialog” / “Cancel”.
  5. Do
    Choose “Confirmation dialog” / “Confirm”.
  6. Do
    Choose “Manage workspaces done”.
  7. Do
    Reload the page.
  8. Do
    Choose “Manage workspaces remove parent workspace”.
  9. Do
    Choose “Manage workspaces done”.

Expect

Manage Workspaces lists workspaces and parents (with children); every Remove asks for confirmation; Cancel keeps, Confirm removes for good and clears the selection; with nothing left it reads You don't have any workspaces yet.

Linked known issues

Known issue OpenHands/software-agent-sdk#5849 (F03.folder-browser, F03.manage-workspaces): re-adding a saved workspace or removing an already-removed stale row can return500 because the registry writes even for a no-op. Live prerequisite: an owned read-only workspace registry plus the already-saved or stale picker row; changes to registry mtime/inode alone are not a Canvas failure.

Exact CLI recipe & bug checks

With the parent and workspace saved: control-openhands browser click 'testid=workspace-dropdown', control-openhands browser click 'testid=manage-workspaces-button'; control-openhands browser testids 'testid=manage-workspaces-modal' shows manage-workspaces-row-workspace, manage-workspaces-parent-row-workspace, manage-workspaces-child-qa-f03-folder and manage-workspaces-child-qa-f03-repo. control-openhands browser click 'testid=manage-workspaces-remove-workspace'; control-openhands browser text 'testid=confirmation-modal' reads Remove "workspace" from your saved workspaces?. control-openhands browser click 'testid=confirmation-modal >> testid=cancel-button' keeps the row (browser count 'testid=manage-workspaces-row-workspace' is 1); repeat Remove and control-openhands browser click 'testid=confirmation-modal >> testid=confirm-button': the count is 0. Removing a workspace clears the dialog's selection only when it was the selected one: with qa-f03-repo selected, control-openhands browser click 'testid=manage-workspaces-done' leaves browser value 'testid=workspace-dropdown' at qa-f03-repo. After browser reload the dropdown lists only the two children, and control-openhands api GET /api/workspaces shows workspaces: [] plus the parent. Cleanup proves Remove parent: control-openhands browser click 'testid=manage-workspaces-remove-parent-workspace' reads Remove "workspace" and its 2 child workspaces?; Confirm leaves browser text 'testid=manage-workspaces-list' at You don't have any workspaces yet. and api GET /api/workspaces empty; because the selected qa-f03-repo belonged to that parent, after browser click 'testid=manage-workspaces-done' browser value 'testid=workspace-dropdown' is empty and browser enabled 'testid=workspace-launch-button' is false.

Automations on home (fixtures imported and turned on):

Responder choiceF03.recommended-responder-choiceMapped behavior

Scenario F03--responder-choice · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.
  2. Do
    Choose “Recommended automation rail card github agents md maintainer”.
  3. Do
    Choose “Responder deployment continue local”.
  4. Do
    Choose the dialog / “Cancel”.
  5. Do
    Open /settings/secrets.
  6. Do
    Choose “Secret row” / containing “OPENHANDS_URL” / “Delete secret”.
  7. Do
    Choose the dialog / “Confirm”.

Expect

GitHub/Slack responder cards on a local backend first ask Choose how your responder should run.

Exact CLI recipe & bug checks

From /conversations (control-openhands browser goto /conversations; the rail click left /automations/new/...), control-openhands browser click 'testid=recommended-automation-rail-card-github-agents-md-maintainer'; control-openhands browser snapshot 'testid=responder-deployment-modal' shows Choose how your responder should run, Continue with local setup and Open OpenHands Cloud integrations (slack-channel-monitor too). control-openhands browser click 'testid=responder-deployment-continue-local' saves an OPENHANDS_URL secret and opens the GitHub MCP install dialog (browser snapshot 'role=dialog': dialog "GitHub", Personal access token); control-openhands browser click 'role=dialog >> role=button[name="Cancel"]' closes it on /conversations. Delete OPENHANDS_URL afterwards in Settings → Secrets (F14): control-openhands browser goto /settings/secrets, control-openhands browser click 'testid=secret-item >> has-text=OPENHANDS_URL >> testid=delete-secret-button', then control-openhands browser click 'role=dialog >> role=button[name="Confirm"]'.

Cloud optionF03.responder-cloud-optionMapped behavior

Scenario F03--cloud-option · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /conversations.
  2. Do
    Choose “Recommended automation rail card slack channel monitor”.
  3. Do
    Choose “Responder deployment open openhands cloud”.
  4. Do
    Use browser tabs as specified in the exact recipe.
  5. Do
    Use browser close tab as specified in the exact recipe.
  6. Do
    Choose “Responder deployment modal close”.

Expect

in that dialog Open OpenHands Cloud integrations opens https://app.all-hands.dev/settings/integrations in a new tab, closes the dialog and saves no secret; X closes it without a choice.

Exact CLI recipe & bug checks

From /conversations (control-openhands browser goto /conversations), control-openhands browser click 'testid=recommended-automation-rail-card-slack-channel-monitor', then control-openhands browser click 'testid=responder-deployment-open-openhands-cloud': browser count 'testid=responder-deployment-modal' is 0, control-openhands browser tabs lists a second page https://app.all-hands.dev/settings/integrations (it can take a second to appear: rerun tabs before concluding) (close it with control-openhands browser close-tab 1), and api GET /api/settings/secrets has no OPENHANDS_URL. Reopen the card and control-openhands browser click 'testid=responder-deployment-modal-close': the dialog is gone and nothing else opens.

Missing integrationF03.recommended-missing-integrationMapped behavior

Scenario F03--missing-integration · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose “Recommended automation rail card research brief writer”.

Expect

a card whose required integration is missing opens that integration's install dialog first.

Exact CLI recipe & bug checks

control-openhands browser click 'testid=recommended-automation-rail-card-research-brief-writer' opens dialog "Tavily" (Command npx -y tavily-mcp, Tavily API key); Cancel closes it and no conversation is created.

Already addedF03.recommended-hides-addedMapped behavior

Scenario F03--already-added · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Wait
    Wait for “Recommended automation rail card custom automation” to appear.
  3. Do
    Open /automations.
  4. Do
    Open /.

Expect

a catalog automation that already exists (matched by name, enabled or not) drops off the rail; deleting it brings the card back.

Exact CLI recipe & bug checks

control-openhands browser count 'testid=recommended-automation-rail-card-news-digest' is 1. Import qa-f03-news.automation.json (same fixture recipe as Preconditions, with "name":"Daily news digest"; it stays disabled), browser goto /, browser wait 'testid=recommended-automation-rail-card-custom-automation': the news-digest count is 0. Delete it on /automations (control-openhands browser goto /automations, then the Cleanup recipe below with has-text=Daily news digest); back on / (control-openhands browser goto /) the count is 1 again.

Activity listF03.home-automations-list · F03.home-automation-linksMapped behavior

Scenario F03--activity-list · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Wait
    Wait for the element identified in the CLI recipe to appear.
  2. Do
    Choose the element identified in the CLI recipe.
  3. Do
    Open /.
  4. Do
    Choose “Home automations manage”.

Expect

Automations lists enabled automations with schedule, last run and status, a sparkline, + Add, and No automations yet. Add one to automate repetitive work. when empty.

a row opens /automations/<id>, a sparkline bar opens /automations/<id>?run=<runId>, + Add opens /automations.

Exact CLI recipe & bug checks

control-openhands browser wait '[data-testid^="running-automation-row-"]', control-openhands browser text 'testid=running-automations-list': both fixtures with 0 0 1 1 * and No activity yet (browser screenshot --feature F03.home-automations-list --name list); no row has a sparkline link yet (the run-bar link is checked after the first run, in the next bullet). control-openhands browser click '[data-testid^="running-automation-row-"] >> has-text=QA_F03 Beta >> role=link' --expect-url '/automations/[^/?]+' opens the detail page; after control-openhands browser goto /, control-openhands browser click 'testid=home-automations-manage' --expect-url '/automations$' opens the dashboard.

Row menu, Run now and CancelF03.home-row-menu · F03.cancel-in-flight-run · F03.home-automation-linksKnown failure

Scenario F03--row-menu-run-now-and-cancel · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Choose the element identified in the CLI recipe.
  3. Do
    Choose the element identified in the CLI recipe.
  4. Do
    Choose the element identified in the CLI recipe.
  5. Do
    Reload the page.
  6. Do
    Choose the element identified in the CLI recipe.
  7. Do
    Open /.
  8. Setup
    Arrange the prerequisite backend state through the API.
  9. Setup
    Arrange the prerequisite backend state through the API.
  10. Setup
    Arrange the prerequisite backend state through the API.

Expect

the row kebab offers Run now, View, Edit, Turn off and Pin to dashboard; Run now toasts Automation dispatched and is disabled while a run is in flight; Edit opens the automation setup page /automations/setup?automationId=<id> with the form prefilled (no modal), where Save toasts Automation updated.

Cancel run appears while a run is pending or running and cancels it (Automation run cancelled).

a row opens /automations/<id>, a sparkline bar opens /automations/<id>?run=<runId>, + Add opens /automations.

Known bug observations

Known failure (reproduced 2026-10-12, OpenHands/automation#514): a bounded script run cancelled from this Home menu shows Automation run cancelled and Cancelled in the row and Activity Log, but its launcher-owned python3 worker.py process remains running after cancellation. This was reproduced in backfill-18309-integrations-worker on fa1f724ab5737a17453ad6081129eb91c5a423c6, SDK 1.54.0 and automation 1.19.3: package a run-owned worker.py that prints one tick and sleeps 2 seconds for 90 iterations; upload its tarball with control-openhands api POST '/api/automation/v1/uploads?name=qa-backfill-sleep' --write --data-file <bounded-sleep-tarball> --content-type application/gzip, then create an active scripted automation through api POST /api/automation/v1 --write --data '@<fixture-json>' with entrypoint: python3 worker.py, the returned tarball_path, a UTC 0 0 1 1 * cron trigger and timeout 240. Open /automations/<sleep-id>, click role=button[name="Run now"], wait for the actual worker to start, return Home and click testid=running-automation-menu-<sleep-id> then testid=running-automation-cancel-<sleep-id>. Read-only process checks restricted to this launcher's descendants still found the worker after the cancellation UI settled. Evidence: F03.cancel-in-flight-run/local-worker-cancel-514.png, F03.cancel-in-flight-run/owned-worker-post-cancel.json and F23.activity-log/cancelled-514.aria.txt; the worker is bounded to exit without external calls. Let it exit, then delete the temporary automation with control-openhands api DELETE /api/automation/v1/<sleep-id> --write.

Exact CLI recipe & bug checks

Run control-openhands browser goto / (the Manage link left the dashboard), then control-openhands browser click '[data-testid^="running-automation-row-"] >> has-text=QA_F03 Pong >> [data-testid^="running-automation-menu-"]' and control-openhands browser snapshot '[data-testid^="running-automation-menu-panel-"]': Run now, View, Edit, Turn off, separator, Pin to dashboard. control-openhands browser click '[data-testid^="running-automation-run-"]' --observe 'role=status' observes Automation dispatched. Reopen the menu: Run now [disabled] and Cancel run. control-openhands browser click '[data-testid^="running-automation-cancel-"]' and control-openhands browser toasts reads Automation run cancelled; control-openhands api GET /api/automation/v1/<automation-id>/runs (id from browser testids --filter running-automation-row) shows CANCELLED, and after browser reload the row reads Just now · Cancelled. Pong now has a run: control-openhands browser click '[data-testid^="running-automation-activity-"] >> role=link' --expect-url '/automations/[^/?]+\?run=' opens it; return with control-openhands browser goto /. Known failure (reproduced 2026-10-12, OpenHands/automation#514): a bounded script run cancelled from this Home menu shows Automation run cancelled and Cancelled in the row and Activity Log, but its launcher-owned python3 worker.py process remains running after cancellation. This was reproduced in backfill-18309-integrations-worker on fa1f724ab5737a17453ad6081129eb91c5a423c6, SDK 1.54.0 and automation 1.19.3: package a run-owned worker.py that prints one tick and sleeps 2 seconds for 90 iterations; upload its tarball with control-openhands api POST '/api/automation/v1/uploads?name=qa-backfill-sleep' --write --data-file <bounded-sleep-tarball> --content-type application/gzip, then create an active scripted automation through api POST /api/automation/v1 --write --data '@<fixture-json>' with entrypoint: python3 worker.py, the returned tarball_path, a UTC 0 0 1 1 * cron trigger and timeout 240. Open /automations/<sleep-id>, click role=button[name="Run now"], wait for the actual worker to start, return Home and click testid=running-automation-menu-<sleep-id> then testid=running-automation-cancel-<sleep-id>. Read-only process checks restricted to this launcher's descendants still found the worker after the cancellation UI settled. Evidence: F03.cancel-in-flight-run/local-worker-cancel-514.png, F03.cancel-in-flight-run/owned-worker-post-cancel.json and F23.activity-log/cancelled-514.aria.txt; the worker is bounded to exit without external calls. Let it exit, then delete the temporary automation with control-openhands api DELETE /api/automation/v1/<sleep-id> --write.

TooltipF03.home-run-tooltipMapped behavior

Scenario F03--tooltip · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Use browser tooltip as specified in the exact recipe.

Expect

hovering a row shows its trigger, status, last run and task.

Exact CLI recipe & bug checks

control-openhands browser tooltip '[data-testid^="running-automation-row-"] >> has-text=QA_F03 Pong' returns QA_F03 Pong, Trigger 0 0 1 1 *, Status Cancelled, Last run Just now, Task Cancelled by user.

Run outcomesF03.home-run-outcome-healthKnown failureBlocked

Scenario F03--run-outcomes · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Reload the page.
  2. Do
    Use browser tooltip as specified in the exact recipe.
  3. Do
    Hover over “Message”.
  4. Wait
    Wait for the tooltip to disappear.
  5. Setup
    Use the phone viewport.

Expect

an automation whose latest Completed run reported a task outcome shows it on Home (#17682): blocked and partial_success read Blocked and Partial, unknown or an unrecognised status reads Needs review, each with an amber (bg-warning) health dot, in the row text, the row link's aria-label, the tooltip's Status line and the pinned card's strip. A finish response without a string status counts as success.

Known bug observations

Known failure (reproduced 2026-10-09, #18234): when the run has a conversation, the summary is 0 px wide at desktop and phone, so only the conversation title shows (the summary is still in browser text). Repeat at browser viewport phone. The status-less success case has no live producer (automation 1.19.0 with SDK 1.53.0 always sends a status), as F23.run-task-outcome records: blocked. Delete both automations afterwards.

Exact CLI recipe & bug checks

Arrange as F23.run-task-outcome does (API preset/prompt, yearly cron 0 0 1 1 *, enabled) QA_F03 Blocked, which finishes with status blocked, and QA_F03 Review, which finishes with status unknown, each prompt ending Do not run any tools. On /, for each row open '[data-testid^="running-automation-row-"] >> has-text=QA_F03 Blocked >> [data-testid^="running-automation-menu-"]' and click [data-testid^="running-automation-run-"] (Automation dispatched); poll control-openhands api GET /api/automation/v1/<id>/runs until the run is COMPLETED (about 35 s), then control-openhands browser reload. control-openhands browser text 'testid=running-automations-list' shows … · Blocked and … · Needs review; control-openhands browser eval "[...document.querySelectorAll('[data-testid^=running-automation-row-] a[aria-label]')].filter(a=>a.querySelector('.rounded-full')).map(a=>a.getAttribute('aria-label')+' | '+a.querySelector('.rounded-full').className.match(/bg-[a-z-]+/g)).join('; ')" lists QA_F03 Blocked Blocked | bg-warning and QA_F03 Review Needs review | bg-warning (in list order, which can vary). control-openhands browser tooltip on each row reads Status Blocked / Task <its summary> and Status Needs review / Task <its summary> (before each tooltip read, browser hover 'testid=chat-input' and browser wait 'role=tooltip' --state detached --timeout 3000, or the previous row's tooltip is returned). Pin both from their row menus ([data-testid^="running-automation-pin-"]): each card's strip shows the Blocked (!) (run-status-icon-warning) or Needs review (?) (run-status-icon-needs-review) icon, then the run's summary and its conversation title. Expected: the summary is visible (browser eval "[...document.querySelectorAll('[data-testid^=pinned-automation-card-] [data-testid=run-status-badge-icon]')].map(i=>Math.round(i.nextElementSibling.getBoundingClientRect().width))" is above 0). Known failure (reproduced 2026-10-09, #18234): when the run has a conversation, the summary is 0 px wide at desktop and phone, so only the conversation title shows (the summary is still in browser text). Repeat at browser viewport phone. The status-less success case has no live producer (automation 1.19.0 with SDK 1.53.0 always sends a status), as F23.run-task-outcome records: blocked. Delete both automations afterwards.

View and EditF03.home-row-menuMapped behavior

Scenario F03--view-and-edit · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose the element identified in the CLI recipe.
  2. Do
    Open /.
  3. Wait
    Wait for the element identified in the CLI recipe to appear.
  4. Do
    Enter “Reply with the single word: beta2. Do not run any tools.” in “Automation setup prompt”.
  5. Do
    Choose “Automation setup save”.

Expect

the row kebab offers Run now, View, Edit, Turn off and Pin to dashboard; Run now toasts Automation dispatched and is disabled while a run is in flight; Edit opens the automation setup page /automations/setup?automationId=<id> with the form prefilled (no modal), where Save toasts Automation updated.

Exact CLI recipe & bug checks

From the Beta row menu, control-openhands browser click '[data-testid^="running-automation-view-"]' --expect-url '/automations/[^/?]+$' opens the detail page. Back on / (control-openhands browser goto /), reopen the menu and click [data-testid^="running-automation-edit-"], then control-openhands browser wait-url 'automations/setup\?automationId=': the setup page opens prefilled (no modal; browser count 'text=Edit automation' is 0), browser value 'testid=automation-setup-name' is QA_F03 Beta and the prompt is the stored one (browser screenshot --feature F03.home-row-menu --name edit-opens-setup). control-openhands browser fill 'testid=automation-setup-prompt' 'Reply with the single word: beta2. Do not run any tools.' and control-openhands browser click 'testid=automation-setup-save' --observe 'role=status' (Automation updated); api GET /api/automation/v1/<automation-id> shows the new prompt. The page's own controls (Test, Close, the timeout limit) are F22's.

Turn offF03.turn-off-confirmationMapped behavior

Scenario F03--turn-off · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Choose the dialog / “Cancel”.
  2. Do
    Choose the dialog / “Turn off”.
  3. Do
    Reload the page.

Expect

Turn off asks Turn off "<name>"? It will stop running on its schedule until you turn it back on.; Cancel keeps it on, Turn off disables it and drops it from home.

Exact CLI recipe & bug checks

From the Beta row menu click [data-testid^="running-automation-turn-off-"]; control-openhands browser snapshot 'role=dialog' reads Turn off "QA_F03 Beta"? It will stop running on its schedule until you turn it back on. with Cancel and Turn off. control-openhands browser click 'role=dialog >> role=button[name="Cancel"]' keeps it enabled; repeat and control-openhands browser click 'role=dialog >> role=button[name="Turn off"]', browser reload: control-openhands browser count '[data-testid^="running-automation-row-"] >> has-text=QA_F03 Beta' is 0 and the API shows enabled: false. Turn it back on from /automations (Preconditions) for the pin checks.

PinF03.pinned-automations-gridMapped behavior

Scenario F03--pin · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Use browser storage as specified in the exact recipe.
  3. Do
    Choose the element identified in the CLI recipe.

Expect

Pin to dashboard adds a card to Pinned automations (prompt, pills, status strip, Runs); the title opens the detail page; a deleted automation's card disappears.

Exact CLI recipe & bug checks

Run control-openhands browser goto / (turning Beta back on left /automations); from Pong's row menu click [data-testid^="running-automation-pin-"]; control-openhands browser text 'testid=pinned-automations-dashboard' shows Pinned automations, QA_F03 Pong, the prompt, cron and the last status; browser storage --values holds the id under oh:home-pinned-automations:<backend>:-. Pin Beta too; control-openhands browser eval "[...document.querySelectorAll('[data-testid^=pinned-automation-card-]')].map(e=>e.innerText.split('\n')[0]).join(',')" is QA_F03 Pong,QA_F03 Beta. control-openhands browser click '[data-testid^="pinned-automation-card-"] >> role=link[name="QA_F03 Pong"]' --expect-url '/automations/[^/?]+$' opens the detail page.

Pinned menuF03.pinned-card-menuMapped behavior

Scenario F03--pinned-menu · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Choose the element identified in the CLI recipe.
  3. Do
    Reload the page.

Expect

a pinned card's kebab has the same actions with Unpin from dashboard.

Exact CLI recipe & bug checks

Run control-openhands browser goto / (the Pin bullet ends on Pong's detail page), then control-openhands browser click '[data-testid^="pinned-automation-card-"] >> has-text=QA_F03 Beta >> [data-testid^="pinned-automation-menu-"]' lists Run now, View, Edit, Turn off and Unpin from dashboard. [data-testid^="pinned-automation-run-"] toasts Automation dispatched; reopen and [data-testid^="pinned-automation-cancel-"] toasts Automation run cancelled (the run is CANCELLED). Reopen and click [data-testid^="unpin-automation-"]; after browser reload only QA_F03 Pong is pinned and Beta stays in the list.

ReorderF03.pinned-reorder-dragMapped behavior

Scenario F03--reorder · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /.
  2. Do
    Use browser drag as specified in the exact recipe.
  3. Do
    Reload the page.
  4. Do
    Use browser drag as specified in the exact recipe.

Expect

dragging a pinned card's title row (Reorder <name>) onto another card reorders the pins, and the order survives a reload.

Exact CLI recipe & bug checks

Run control-openhands browser goto / (Pinned links ends on Beta's detail page). With Pong and Beta pinned (order QA_F03 Pong,QA_F03 Beta, side by side at desktop), read the Beta handle and Pong card boxes with control-openhands browser bbox '[data-testid^="pinned-automation-card-"] >> has-text=QA_F03 Beta >> [data-testid^="pinned-automation-drag-"]' and control-openhands browser bbox '[data-testid^="pinned-automation-card-"] >> has-text=QA_F03 Pong', then drag the handle onto the left fifth of Pong's card: control-openhands browser drag '[data-testid^="pinned-automation-card-"] >> has-text=QA_F03 Beta >> [data-testid^="pinned-automation-drag-"]' --by -522,0 --steps 20 (at 1440×1000 the handle centre is x≈1065 and Pong's card spans x 486–864). The order eval from the Pin bullet reads QA_F03 Beta,QA_F03 Pong, oh:home-pinned-automations:<backend>:- lists Beta's id first, and the order survives browser reload. Drag Pong's handle the same way to restore. The target form browser drag <handle> <card> [--position before] does not reorder (the drop lands before the drag-over position is committed).

Backend downF03.automations-backend-downMapped behavior

Scenario F03--backend-down · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Setup
    Change the run-owned service state: stop automation.
  2. Do
    Reload the page.
  3. Do
    Restart the run-owned stack as specified.
  4. Do
    Reload the page.

Expect

with the automation service down, the installed list and pinned grid are hidden and the composer still works. The recommendation rail returns after loading from its static catalog; opening a setup card reaches its route and pre-setup dialog. The rail asks for the installed automations only once /api/automation/health answers ok (#17838), so home raises no error toast for the stopped service.

Exact CLI recipe & bug checks

Stop only this run's automation service with control-openhands service stop automation, then control-openhands browser reload. Once loading settles, browser count on testid=running-automations-list and testid=pinned-automations-dashboard is 0, while testid=recommended-automations-rail is 1: its cards come from the static catalog even when /api/automation/health and /v1 return 502. The composer remains enabled. control-openhands browser toasts --history is []. Click the Custom automation recommendation: it navigates to /automations/new/custom-automation and opens the Before you start dialog; the toast history is still [] (before #17838 a Request failed with status code 502 toast appeared here). Capture both Home and the pre-setup dialog, then control-openhands restart and browser reload; doctor should show the owned automation service healthy again.

Phone and cleanup:

PhoneF03.phoneMapped behavior

Scenario F03--phone · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Setup
    Use the phone viewport.
  2. Do
    Choose “Open workspace”.
  3. Setup
    Create the disposable folder fixture specified in the recipe.
  4. Do
    Choose “Workspace dropdown”.
  5. Do
    Choose “Add workspaces”.
  6. Do
    Choose “Folder browser up”.
  7. Do
    Choose “Folder browser entry workspace”.
  8. Do
    Choose “Folder browser cancel”.
  9. Do
    Choose “Close open workspace dialog”.
  10. Setup
    Use the desktop viewport.

Expect

at 390 px the banner, launcher, rail, pinned grid, list and the workspace dialogs fit without horizontal overflow, and folder names stay readable.

Exact CLI recipe & bug checks

control-openhands browser viewport phone, control-openhands browser bbox 'testid=pinned-automations-dashboard' and ... 'testid=running-automations-list' (358 px wide, pageHorizontalOverflow false), browser screenshot --feature F03.phone --name automations (the banner was checked at phone width in the No-LLM banner bullet). Open Workspace: control-openhands browser click 'testid=open-workspace-button', then browser bbox 'testid=open-workspace-dialog-body' is inside the viewport. Folder browser: arrange a long name first with control-openhands fixture folder --name qa-f03-folder-with-a-name-too-long-for-a-phone (it lands in <run>/workspace), then control-openhands browser click 'testid=workspace-dropdown' and control-openhands browser click 'testid=add-workspaces-button'; control-openhands browser eval "(()=>{const b=document.querySelector('[data-testid=folder-browser-entry-workspace] span span.truncate');return b.getBoundingClientRect().width})()" is greater than 0 (about 67). Run control-openhands browser click 'testid=folder-browser-up' twice (now <run>) and control-openhands browser click 'testid=folder-browser-entry-workspace', then control-openhands browser eval "(()=>{const b=document.querySelector('[data-testid=folder-browser-entry-qa-f03-folder-with-a-name-too-long-for-a-phone] span span.truncate');return [b.scrollWidth>b.clientWidth,getComputedStyle(b).textOverflow]})()": [true,"ellipsis"] (about 109 of 293 px shown). control-openhands browser screenshot --feature F03.phone --name folder-names shows each name beside Folder under separate Name and Kind headers, the long one cut to qa-f03-folder-w…. Close with control-openhands browser click 'testid=folder-browser-cancel' and control-openhands browser click 'testid=close-open-workspace-dialog', then return with control-openhands browser viewport desktop.

CleanupF03.pinned-automations-gridMapped behavior

Scenario F03--cleanup · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open /automations.
  2. Do
    Open /.

Expect

Pin to dashboard adds a card to Pinned automations (prompt, pills, status strip, Runs); the title opens the detail page; a deleted automation's card disappears.

Exact CLI recipe & bug checks

Delete both fixtures on /automations (control-openhands browser goto /automations; F21: kebab role=list >> has-text=Export >> role=button[name="Delete"], then role=heading[name="Delete automation"] >> xpath=.. >> role=button[name="Delete"]). On / (control-openhands browser goto /), browser count 'testid=pinned-automations-dashboard' is 0 and browser text 'testid=running-automations-empty-hint' is No automations yet. Add one to automate repetitive work.

Implicit-launch readinessF03.composer-blocked-without-llmKnown failure

Scenario F03--implicit-launch-readiness · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Arrange named OpenHands agent QA_PINNED with tools:[], concurrency7, and two LLM profiles on refused loopback http://127.0.0.1:1/v1: QA_READY has a disposable key and QA_EMPTY has no key. Use real /api/profiles/<name> and /api/agent-profiles/<name> writes, then activate the named agent by its ID. Pin it to QA_EMPTY and activate QA_READY; open Home and inspect the warning/pill. Invert the pinned/active profiles, reopen Home, fill testid=chat-input with a bounded no-tools prompt and read browser enabled testid=submit-button. Expected: readiness agrees with the effective LLM shown by the launch pill. Known failure (reproduced 2026-10-12, #16951): the readiness gate follows the named agent's pinned LLM, so a keyless pin can disable a key-present pill, and the inverse can permit a keyless pill. On current backends with per-launch LLM override, a launch uses the pill's LLM while preserving the named agent's identity, concurrency and tools (F13.llm-pill-precedence); that current behavior is separate from the readiness mismatch. Read only credential-presence booleans, without claiming provider authentication. Restore the default agent/active LLM and delete disposable profiles.

Expect

with no LLM, Send is disabled and Enter creates nothing (the text stays editable).

Known bug observations

Known failure (reproduced 2026-10-12, #16951): the readiness gate follows the named agent's pinned LLM, so a keyless pin can disable a key-present pill, and the inverse can permit a keyless pill. On current backends with per-launch LLM override, a launch uses the pill's LLM while preserving the named agent's identity, concurrency and tools (F13.llm-pill-precedence); that current behavior is separate from the readiness mismatch. Read only credential-presence booleans, without claiming provider authentication. Restore the default agent/active LLM and delete disposable profiles.

Exact CLI recipe & bug checks

Arrange named OpenHands agent QA_PINNED with tools:[], concurrency7, and two LLM profiles on refused loopback http://127.0.0.1:1/v1: QA_READY has a disposable key and QA_EMPTY has no key. Use real /api/profiles/<name> and /api/agent-profiles/<name> writes, then activate the named agent by its ID. Pin it to QA_EMPTY and activate QA_READY; open Home and inspect the warning/pill. Invert the pinned/active profiles, reopen Home, fill testid=chat-input with a bounded no-tools prompt and read browser enabled testid=submit-button. Expected: readiness agrees with the effective LLM shown by the launch pill. Known failure (reproduced 2026-10-12, #16951): the readiness gate follows the named agent's pinned LLM, so a keyless pin can disable a key-present pill, and the inverse can permit a keyless pill. On current backends with per-launch LLM override, a launch uses the pill's LLM while preserving the named agent's identity, concurrency and tools (F13.llm-pill-precedence); that current behavior is separate from the readiness mismatch. Read only credential-presence booleans, without claiming provider authentication. Restore the default agent/active LLM and delete disposable profiles.

Target across Local backendsF03.selection-after-reloadKnown failure

Scenario F03--target-across-local-backends · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open the URL in the recipe.

Expect

after a reload the preview bar is gone, but the dialog preselects the last workspace picked in its dropdown, confirmed or not: a pick closed with the X survives leaving for another page and coming back, and a reload.

Known bug observations

Known failure (reproduced 2026-10-12, #16950): QA_B_ONLY remains visible and its secondary-run path is submitted to Local. This is the Local variant; Cloud repository/organization recents still need an approved Cloud fixture.

Exact CLI recipe & bug checks

In two run-owned Local backends, save distinct QA_A_ONLY and QA_B_ONLY workspaces through real /api/workspaces writes. Register the second backend through Add Backend with its key read from its private key file. On QA_Secondary Home, open the workspace dialog, choose QA_B_ONLY and Confirm; switch to Local through backend-selector without reload or browser goto. Read the preview, submit a bounded no-tools prompt through the real composer, and read the new Local conversation workspace. Expected: an incompatible target is cleared before submission. Known failure (reproduced 2026-10-12, #16950): QA_B_ONLY remains visible and its secondary-run path is submitted to Local. This is the Local variant; Cloud repository/organization recents still need an approved Cloud fixture.

Saved workspaces across Local backendsF03.workspace-dropdown-searchKnown failure

Scenario F03--saved-workspaces-across-local-backends · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Warm the Local picker with QA_A_ONLY, close its dialog, switch through backend-selector >> role=option[name="Connected QA_Secondary"], then reopen the picker within60seconds, without reload or hard navigation. Expected: only QA_B_ONLY from the active server registry is offered. Known failure (reproduced 2026-10-12, #16844): the recorded2.7-second switch keeps QA_A_ONLY in the secondary picker while independent API readbacks show distinct registries. The same-absolute-parent directory variant requires isolated filesystems; two native runs share a host filesystem, so it and Windows remain unverified. These checks used frozen target fa1f724ab5737a17453ad6081129eb91c5a423c6, Agent Server/SDK1.54.0, automation1.19.3, run backfill-18309-coordinator-checks plus its owned backfill-18309-local-secondary. Retain evidence/F03.selection-after-reload/16950-submission-readback.json, evidence/F03.workspace-dropdown-search/16844-local-switch.mp4 and registry readback; remove the registered backend/workspaces and stop both runs afterward.

Expect

typing filters workspaces; with more than one group, workspaces are grouped by parent with an Other group; no match (or no workspaces) shows No workspaces yet.

Known bug observations

Known failure (reproduced 2026-10-12, #16844): the recorded2.7-second switch keeps QA_A_ONLY in the secondary picker while independent API readbacks show distinct registries. The same-absolute-parent directory variant requires isolated filesystems; two native runs share a host filesystem, so it and Windows remain unverified. These checks used frozen target fa1f724ab5737a17453ad6081129eb91c5a423c6, Agent Server/SDK1.54.0, automation1.19.3, run backfill-18309-coordinator-checks plus its owned backfill-18309-local-secondary. Retain evidence/F03.selection-after-reload/16950-submission-readback.json, evidence/F03.workspace-dropdown-search/16844-local-switch.mp4 and registry readback; remove the registered backend/workspaces and stop both runs afterward.

Exact CLI recipe & bug checks

Warm the Local picker with QA_A_ONLY, close its dialog, switch through backend-selector >> role=option[name="Connected QA_Secondary"], then reopen the picker within60seconds, without reload or hard navigation. Expected: only QA_B_ONLY from the active server registry is offered. Known failure (reproduced 2026-10-12, #16844): the recorded2.7-second switch keeps QA_A_ONLY in the secondary picker while independent API readbacks show distinct registries. The same-absolute-parent directory variant requires isolated filesystems; two native runs share a host filesystem, so it and Windows remain unverified. These checks used frozen target fa1f724ab5737a17453ad6081129eb91c5a423c6, Agent Server/SDK1.54.0, automation1.19.3, run backfill-18309-coordinator-checks plus its owned backfill-18309-local-secondary. Retain evidence/F03.selection-after-reload/16950-submission-readback.json, evidence/F03.workspace-dropdown-search/16844-local-switch.mp4 and registry readback; remove the registered backend/workspaces and stop both runs afterward.

Invalid project sub-agentF03.launch-in-workspaceKnown issueBlocked

Scenario F03--invalid-project-sub-agent · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do — reading outline

  1. Do
    Open the fixture workspace.

Expect

submitting with a workspace picked shows Creating conversation…, opens /conversations/<id>, and the agent runs in that folder.

Linked known issues

Known issue #15701 (F03.launch-in-workspace): Creating Conversation toast stuck visible. Live prerequisite: The original stuck creation request/outcome sequence; the report is intermittent and gives no deterministic trigger.

Exact CLI recipe & bug checks

In an owned workspace create .agents/agents/qa-bad-skill.md with YAML frontmatter name: qa-bad-skill, description: Bad skill, skills: qa-f27-missing-skill, then body Body, without installing that skill. Use an explicit dummy profile pointed at a refused loopback endpoint with autotitle off for this pre-inference check. On Home use control-openhands workspace open <owned-folder>, select testid=workspace-mode-selector-option-local_repo, fill testid=chat-input and click testid=home-chat-launcher >> testid=submit-button with --expect-url "/conversations/[^/]+$". The invalid sub-agent is skipped with a warning; creation returns201 and opens its conversation instead of500. A later refused-loopback model error is separate from creation. Read browser network --filter "api/conversations($|\?)", capture browser screenshot --feature F03.create-error-toast --name invalid-subagent, then remove only the owned bad-agent file.

Open repository dialogF03.open-repository-dialogKnown issueBlocked

Scenario F03--contract-f03-open-repository-dialog · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do

This behavior has no separately named recipe in this snapshot. Use the family’s entry points and the contract below; the page does not invent a replay.

Expect

on a Cloud backend, Open repository picks provider, repository and branch (blocked locally).

Linked known issues

Known issue #17108 (F03.open-repository-dialog): The repository picker lists a search result for input the user has already cleared. Live prerequisite: An authenticated Cloud Git provider and a real repository search response that remains pending after clearing the input.

Known issue #18480 (F03.open-repository-dialog): an Azure DevOps Enterprise user belonging to several organizations can see only one organization's repositories. Live prerequisite: a real Cloud/Enterprise sign-in with two organizations and distinct repositories; the report's mocked two-organization capture is not a real-backend reproduction.

Isolated workspace noticeF03.isolated-workspace-noticeBehavior contract

Scenario F03--contract-f03-isolated-workspace-notice · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do

This behavior has no separately named recipe in this snapshot. Use the family’s entry points and the contract below; the page does not invent a replay.

Expect

on an isolated-runtime backend a status line explains the new isolated workspace and offers Clear host workspace (blocked locally).

Workspaces unsupportedF03.workspaces-unsupportedBehavior contract

Scenario F03--contract-f03-workspaces-unsupported · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do

This behavior has no separately named recipe in this snapshot. Use the family’s entry points and the contract below; the page does not invent a replay.

Expect

on an Agent Server without workspace APIs the pill is disabled with a tooltip (blocked locally). Automations on home:

Home automations view moreF03.home-automations-view-moreBehavior contract

Scenario F03--contract-f03-home-automations-view-more · Permalink · Source

Given

Use F03’s prerequisites and the common setup. Follow the family’s order when a script uses an earlier fixture or says “as above”.

Do

This behavior has no separately named recipe in this snapshot. Use the family’s entry points and the contract below; the page does not invent a replay.

Expect

past 10 rows View more/View all, past 6 pins View more/View less (not arranged).

Family notes, prerequisites for known issues & limits Known issueBlocked
  • Once a workspace is confirmed, open-workspace-button is not rendered (the preview bar replaces it): a click on it waits the full 30 s. Reopen through home-git-control-bar-preview, or reload.
  • A pick in the workspace dropdown is stored in sessionStorage at once, before Confirm or Launch, and closing the dialog with the X keeps it: a bullet that needs the earlier workspace selected must pick it again instead of relying on the last confirmation.
  • control-openhands workspace open and conversation start --workspace save that folder as a standalone workspace (api GET /api/workspaces lists it under workspaces). When another family used them first on the same stack, Add all subdirectories leaves those folders out of the workspace parent and the dropdown is grouped: options read workspace, qa-f03-repo and Other, qa-f18-repo. role=option[name="qa-f03-repo"] still matches (substring), but the menu text and the workspace-group-header count 2 in the Search bullet assume F03's own fixtures only.
  • Folder rows navigate on a single click; there is no path field. The browser starts at the server home, <run>/private/home, two levels below <run>. After any conversation without a workspace, <run>/private/home/workspace exists: it shows as a workspace row and, after the next page load, a workspace favorite (folder-browser-sidebar-workspace), which is not <run>/workspace.
  • A workspace and its parent can share a name (workspace); their test ids differ only by prefix (manage-workspaces-row- vs manage-workspaces-parent-row-).
  • chat-input is a contenteditable div: it stays editable when the composer is "disabled"; assert the Send button and the absence of a new conversation instead.
  • conversation start without --stay navigates home and loses a picked workspace and plugins; drive the submit button as above.
  • Responder Continue with local setup writes an OPENHANDS_URL secret; delete it so F14 counts stay clean.
  • The rail lists about 15 cards (proven ones, then conversation launchers such as research-brief-writer); browser testids reports only the first few, so check a card with browser count 'testid=recommended-automation-rail-card-<id>'. Any automation whose name matches a card (Daily news digest) hides that card, so avoid catalog names in fixtures.
  • The home draft (oh:home-prompt-draft) survives the no-LLM bullets; browser type appends to it, so browser fill 'testid=chat-input' '' before typing a slash command.
  • Imported automations arrive disabled and home lists only enabled ones; turn them on before looking for rows. A run dispatched from home and then cancelled still leaves a QA_F03 Pong — <date> conversation in the sidebar.
  • With the Agent Server stopped, a reload does not render home at all; trigger the error path before reloading, then restart.
  • Deleting the last automation leaves its id in the pinned localStorage key (pruning skips an empty list); the grid still hides it.
  • Pinned cards reorder only by mouse drag; there is no keyboard or menu alternative. Drive it with browser drag <handle> --by DX,DY --steps 20; browser drag <handle> <target> reports ok but leaves the order unchanged.
  • VITE_HOME_AUTOMATIONS_DEMO=true (build-time) swaps the home automation sections for demo data; never verify against such a build.
  • The Code / Automate choice is component state, not stored: every page load and every return to home starts in Code. A toggle check after a navigation must click Automate again.
  • When the Agent Server is stopped, background refetches can add a generic An error occurred toast (#18051). For F03.create-error-toast, retain the complete video and toast history and report any extra toast with its timing; do not waive it from the count.
  • The workspace combobox uses one message for an empty list and for a search with no match: both read No workspaces yet (workspace-dropdown-empty), with + Add Workspace still below it (#18037).
  • Known issue #17108 (F03.open-repository-dialog): The repository picker lists a search result for input the user has already cleared. Live prerequisite: An authenticated Cloud Git provider and a real repository search response that remains pending after clearing the input.
  • Known issue #16801 (F03.launch-without-workspace): Agent starts by looking in workspace, even when started with "no workspace". Live prerequisite: A working Claude Opus agent and the original task/prompt that makes it explore the default workspace; the prompt is absent.
  • Known issue #16210 (F03.plugin-picker): [Cloud Backends] Plugins not available when starting a new conversation. Live prerequisite: An authenticated Cloud organization with configured account plugins before opening New Chat > Plugins.
  • Known issue #15701 (F03.launch-in-workspace): Creating Conversation toast stuck visible. Live prerequisite: The original stuck creation request/outcome sequence; the report is intermittent and gives no deterministic trigger.
  • Known issue #18480 (F03.open-repository-dialog): an Azure DevOps Enterprise user belonging to several organizations can see only one organization's repositories. Live prerequisite: a real Cloud/Enterprise sign-in with two organizations and distinct repositories; the report's mocked two-organization capture is not a real-backend reproduction.
  • Known issue #18418 (F03.create-error-toast, F03.launch-with-plugin): hosted runtime 1.50.1 can fail during skills/plugins setup because its packaged plugin-schema resource is missing. Live prerequisite: the affected Cloud runtime/PyInstaller image and original plugin setup plus its account. A Local 1.55.0 launch does not verify that deployment.
  • Known issue OpenHands/software-agent-sdk#5837 (F03.folder-browser): case-only directory names at a page boundary can repeat the server cursor; Canvas detects the repeated cursor and the directory listing fails instead of showing all choices. Live prerequisite: a case-sensitive filesystem with enough directories to cross the real picker page boundary, including two distinct case-only names. A case-insensitive Mac volume cannot hold that fixture.
  • Known issue OpenHands/software-agent-sdk#5849 (F03.folder-browser, F03.manage-workspaces): re-adding a saved workspace or removing an already-removed stale row can return500 because the registry writes even for a no-op. Live prerequisite: an owned read-only workspace registry plus the already-saved or stale picker row; changes to registry mtime/inode alone are not a Canvas failure.

Before you start

Use an OpenHands checkout at the source revision, with Node 24+, installed npm dependencies, uv / uvx, and a supported Chromium browser. The verification skill is the complete setup contract.

export PATH="$PWD/.agents/skills/verify-openhands/scripts:$PATH"
export OH_VERIFY_RUN=$(control-openhands launch --new --print-run)
control-openhands doctor
control-openhands onboard --skip
# Configure a model only for a scenario that needs one:
control-openhands llm preset deepseek
# When the run is complete:
control-openhands stop

F01 walks onboarding instead of skipping it. No-model checks run before model configuration. Keep OH_VERIFY_RUN set so commands address your own run. Desktop is 1440 × 1000; phone is 390 × 844. Model-backed checks need the configured provider key and budget.

Recipes run in source order within each family and can share fixtures. The page preserves that order; “as above” is a dependency on an earlier case. Setup commands and API writes arrange state. They do not prove a UI path. Follow the family cleanup steps.

A known failure preserves the intended expectation beside the observed defect. Executable known-bug blocks use xfail for a reproduced symptom and xpass when it stops reproducing. Cloud accounts, enterprise capabilities and other unavailable prerequisites remain explicit. “Not run” is different from “blocked”.

The maintained map describes application behavior at its pinned revision. Once a fix is verified in the application version under test, remove the obsolete failure note and keep the normal expectation. Dated evidence belongs in the backfill ledger.

Read the full map index and coverage boundaries, the CLI guide, or the earlier illustrated edition. The verification approach adapts Lauren Tan’s (@poteto) pstack verification-skill generators; attribution and adaptation.