EN / field notes OpenHands feature map

OpenHands / F15

Condenser, agent context and verification settings

Three settings pages are generated from the Agent Server's settings schemas: Condenser (summarize long chats), Agent Context (persistent agent memory) and Verification (confirmation mode, security analyzer and the critic). Each page shows the schema's fields in Basic/Advanced/All tiers (only the tiers that have fields), hides fields whose parent switch is off, and saves through one Save Changes button that stays disabled until a value differs from the stored one.

23 mapped behaviors · 24 recipes and supporting checks · source snapshot 9 October 2026
From upstream main at 8793c111. Read the maintained source.

How to get to it

  • Sidebar settings gear (backend-selector-settings-link, lands on /settings/agents), then Condenser, Agent Context or Verification in the settings navigation (sidebar-settings-/settings/condenser, sidebar-settings-/settings/agent-context, sidebar-settings-/settings/verification).
  • Direct URLs /settings/condenser, /settings/agent-context, /settings/verification.
  • Command menu (Control+k or Meta+k, or command-menu-trigger in the sidebar): Condenser settings, Agent Context and Verification settings; "memory" finds both Condenser settings and Agent Context.
  • The effects show up in new conversations only: the confirmation prompt in the chat, and the memory instructions in the conversation's system prompt.

Before you start

Start with the common launch and health checks, then follow this family’s preconditions in order. Recipes share the fixtures and state named below.

Preconditions:

  • Baseline state (launched, doctored, onboard --skip done). No LLM is needed for the settings pages.
  • F15.confirmation-mode-effect and F15.agent-context-effect need an active LLM profile (control-openhands llm preset deepseek).
  • F15.schema-unavailable needs an agent server that serves /api/settings but answers 404 for /api/settings/agent-schema (an older release via launch --new --sdk-ref <old>); not available in this checkout's pinned stack.
  • Stored values are the defaults: control-openhands api GET /api/settings shows agent_settings.condenser.enabled true, max_size 240, condenser_kind llm_summarizing; agent_context.load_memory false; verification.critic_enabled false; conversation_settings.confirmation_mode false.

Behavior inventory

23 stable behavior IDs and their expected behavior

Readable recipes

Read each script from top to bottom. Code is copied from the map; prose gives the action, expected observation, and conditions. <id>, <run> and similar placeholders stand for values from your own run. Short forms such as browser count continue the same control-openhands invocation; they are kept as documented.

Expected observations describe the recipe’s contract. Captures below selected recipes show representative real states from this snapshot; they do not mark every mapped behavior as passed. Follow cleanup before moving to another family.

Open Condenser from the sidebar #

  1. Check
    control-openhands browser click 'testid=backend-selector-settings-link' --expect-url '/settings/agents(\?|$)'
  2. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/condenser' --expect-url '/settings/condenser(\?|$)'
  3. Check
    control-openhands browser text 'testid=settings-page-subtitle'

    (Summarize long chats to stay within context limits.) and

  4. Check
    control-openhands browser snapshot 'testid=condenser-settings-screen'
  5. Expect
    The snapshot shows tabs Basic [selected] and All, the text Enable Memory Condensation and button "Save Changes" [disabled];
  6. Check
    control-openhands browser count 'testid=sdk-section-advanced-toggle'

    is 0.

  7. Note
    Read the switch with
  8. Check
    control-openhands browser eval "document.querySelector('[data-testid=\"sdk-settings-condenser.enabled\"]').checked"

    (true).

Condenser settings with Basic and All views and Enable Memory Condensation enabled.
The Condenser page controls how long chats are summarized to stay within the model context. CLI capture · 1440 × 1000 · 9 October 2026 · Canvas 8793c111

Condenser settings with Basic and All views and Enable Memory Condensation enabled.

Representative documentation capture, not a complete run of this recipe or family. Captured on an isolated local backend at desktop viewport using the current main checkout.

How this screenshot was taken

canvas: 1.26.0 · agent server: 1.53.0 · sdk: 1.53.0 · automation: 1.19.0

OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser goto /settings/condenser
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser wait testid=condenser-settings-screen
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser snapshot testid=condenser-settings-screen
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser screenshot --feature F15.condenser-page --name condenser

All tier #

  1. Do
    control-openhands browser click 'testid=sdk-section-all-toggle'
  2. Check
    control-openhands browser count 'testid=condenser-settings-screen >> input'

    (8) and

  3. Check
    control-openhands browser value 'testid=sdk-settings-condenser.max_size'

    (240).

  4. Check
    control-openhands browser snapshot 'testid=condenser-settings-screen'
  5. Note
    labels the fields Enable Memory Condensation, Max Size, Condenser Kind (combobox value LLM Summarizer), Max Tokens, Keep First Events, Minimum Progress, Hard Reset Retries and Hard Reset Scaling, each with a plain-language paragraph and all but the switch marked Optional (Condenser Kind: How the condenser shortens long conversations. LLM Summarizer replaces older events with a summary written by the LLM; None keeps the full history.).

Dirty state #

  1. Note
    On the All tier:
  2. Check
    control-openhands browser enabled 'testid=save-button'

    is false;

  3. Do
    control-openhands browser fill 'testid=sdk-settings-condenser.max_size' 120
  4. Note
    makes it true;
  5. Do
    control-openhands browser fill 'testid=sdk-settings-condenser.max_size' 240
  6. Note
    makes it false again.

Save and reload #

  1. Note
    Fill Max Size with 120, then
  2. Do
    control-openhands browser click 'testid=save-button' --observe 'testid=save-button' --observe-ms 3000

    (observed states Save Changes → Saving... → Save Changes) and

  3. Check
    control-openhands browser toasts

    (Settings saved. For old conversations, you will need to stop and restart the conversation to see the changes.).

  4. Check
    control-openhands browser enabled 'testid=save-button'

    is false.

  5. Do
    control-openhands browser reload
  6. Check
    control-openhands browser snapshot 'role=tablist'

    (All [selected]: the page opens on the tier that shows the overridden field) and

  7. Check
    control-openhands browser value 'testid=sdk-settings-condenser.max_size'

    (120).

  8. Check
    control-openhands api GET /api/settings

    shows max_size 120.

  9. Note
    Keep it for the next bullet.

Dependent fields #

  1. Note
    On the All tier run
  2. Do
    control-openhands browser click 'testid=condenser-settings-screen >> text=Enable Memory Condensation'
  3. Note
    the switch reads false and
  4. Check
    control-openhands browser count 'testid=condenser-settings-screen >> input'

    is 2 (the switch and Condenser Kind).

  5. Note
    Click the label again: the count is 8 and browser enabled 'testid=save-button' is false.

Basic save keeps hidden fields #

  1. Note
    With Max Size stored as 120, run
  2. Do
    control-openhands browser click 'testid=sdk-section-basic-toggle'
  3. Do
    control-openhands browser click 'testid=condenser-settings-screen >> text=Enable Memory Condensation'
  4. Do
    control-openhands browser click 'testid=save-button'
  5. Check
    control-openhands api GET /api/settings
  6. Note
    now shows enabled false and max_size 120.
  7. Note
    Known failure (reproduced 2026-10-06): max_size is 240, because the save sends defaults for every field Basic does not show (#18049).
  8. Expect
    After browser reload the page opens on Basic with the switch off.
  9. Note
    Restore: click the label again, browser click 'testid=save-button', browser reload; the switch reads true and the API shows enabled true (with max_size 240 today, from the reset above).

Invalid values #

  1. Note
    On the All tier run
  2. Do
    control-openhands browser fill 'testid=sdk-settings-condenser.max_size' 1.5
  3. Do
    control-openhands browser click 'testid=save-button'
  4. Check
    control-openhands browser toasts

    (Expected an integer value, received: 1.5; no request is sent).

  5. Note
    Then wait for the toast to close, fill -5,
  6. Check
    control-openhands browser network --clear
  7. Do
    control-openhands browser click 'testid=save-button' --observe 'testid=save-button' --observe-ms 2500

    (Saving... for about 1.5 s),

  8. Check
    control-openhands browser toasts

    (HTTP request failed (422 Unprocessable Entity): {"detail":"Settings validation failed"}) and

  9. Check
    control-openhands browser network

    (three PATCH /api/settings).

  10. Expect
    The API still shows max_size 240; browser reload drops the bad draft.

Condenser Kind #

  1. Note
    On the All tier run
  2. Do
    control-openhands browser click 'testid=sdk-settings-condenser.condenser_kind'
  3. Check
    control-openhands browser snapshot 'role=listbox'

    (options LLM Summarizer [selected] and None),

  4. Do
    control-openhands browser click 'role=listbox >> role=option[name="None"]'
  5. Do
    control-openhands browser click 'testid=save-button'
  6. Expect
    After browser reload the page opens on All, browser value 'testid=sdk-settings-condenser.condenser_kind' is None, and
  7. Check
    control-openhands api GET /api/settings --pick agent_settings.condenser

    is just {"enabled": true, "condenser_kind": "no_op"} (the labels are Canvas copy; the stored values are unchanged).

  8. Expect
    The summarizer fields should hide while None is selected.
  9. Note
    Known failure (reproduced 2026-10-06): Max Size, Max Tokens, Keep First Events, Minimum Progress, Hard Reset Retries and Hard Reset Scaling stay with their defaults, and browser fill 'testid=sdk-settings-condenser.max_size' 100 then Save gives Settings saved while the API still shows only enabled and condenser_kind and a reload shows 240 again (#18049; browser screenshot --feature F15.condenser-kind --name none-shows-summarizer-fields).
  10. Note
    Restore by choosing LLM Summarizer the same way and saving: after reload the page opens on Basic and the API shows all eight defaults again (condenser_kind llm_summarizing).

Agent Context #

  1. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/agent-context' --expect-url '/settings/agent-context(\?|$)'
  2. Check
    control-openhands browser text 'testid=settings-page-subtitle'

    (Let the agent keep notes and recall them in new conversations.),

  3. Check
    control-openhands browser count 'role=tablist'

    (0) and

  4. Check
    control-openhands browser snapshot 'testid=agent-context-settings-screen'

    (text Persistent Agent Memory, the paragraph about .openhands/memory/, button "Save Changes" [disabled]).

Persistent memory persists #

  1. Do
    control-openhands browser click 'testid=agent-context-settings-screen >> text=Persistent Agent Memory'
  2. Do
    control-openhands browser click 'testid=save-button'
  3. Do
    control-openhands browser reload
  4. Do
    control-openhands browser eval "document.querySelector('[data-testid=\"sdk-settings-agent_context.load_memory\"]').checked"

    (true; API agent_context.load_memory true).

  5. Note
    Restore: click the label, save, reload; the value is false.

Verification #

  1. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/verification' --expect-url '/settings/verification(\?|$)'
  2. Check
    control-openhands browser text 'testid=settings-page-subtitle'

    (Confirmation prompts and security checks on actions.) and

  3. Check
    control-openhands browser snapshot 'testid=verification-settings-screen'
  4. Note
    : tabs Basic [selected], Advanced, All; texts Confirmation Mode and Enable Critic.
  5. Check
    control-openhands browser count 'testid=verification-settings-screen >> input'

    is 2 on Advanced and on All too.

Verification settings offers Confirmation Mode and Enable Critic switches, with Save Changes disabled.
Confirmation mode asks for approval before agent actions; the critic has separate configuration. CLI capture · 1440 × 1000 · 9 October 2026 · Canvas 8793c111

Verification settings offers Confirmation Mode and Enable Critic switches, with Save Changes disabled.

Representative documentation capture, not a complete run of this recipe or family. Captured on an isolated local backend at desktop viewport using the current main checkout.

How this screenshot was taken

canvas: 1.26.0 · agent server: 1.53.0 · sdk: 1.53.0 · automation: 1.19.0

OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser goto /settings/verification
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser wait testid=verification-settings-screen
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser snapshot testid=verification-settings-screen
OH_VERIFY_RUN="$OH_VERIFY_RUN" control-openhands browser screenshot --feature F15.verification-page --name verification

Critic and analyzer fields #

  1. Note
    On All run
  2. Do
    control-openhands browser click 'testid=verification-settings-screen >> text=Confirmation Mode'
  3. Do
    control-openhands browser click 'testid=verification-settings-screen >> text="Enable Critic"'
  4. Do
    control-openhands browser click 'testid=verification-settings-screen >> text="Enable Iterative Refinement"'
  5. Check
    control-openhands browser testids 'testid=verification-settings-screen' --hidden
  6. Note
    now lists sdk-settings-security_analyzer, sdk-settings-verification.critic_mode, sdk-settings-verification.critic_threshold (0.6), sdk-settings-verification.max_refinement_iterations (3), sdk-settings-verification.critic_server_url, sdk-settings-verification.critic_model_name, sdk-settings-verification.critic_api_key and help-link-verification.critic_api_key.
  7. Check
    control-openhands browser attr 'testid=sdk-settings-verification.critic_api_key' type

    is password;

  8. Do
    control-openhands browser eval "document.querySelector('[data-testid=\"help-link-verification.critic_api_key\"] a')?.href"

    is https://app.all-hands.dev/settings/api-keys.

  9. Do
    control-openhands browser screenshot --feature F15.verification-critic-fields --name all-critic-on

    shows the API key spanning both columns.

  10. Note
    Basic (sdk-section-basic-toggle) keeps confirmation_mode, critic_enabled, enable_iterative_refinement and critic_api_key; Advanced adds security_analyzer.
  11. Expect
    The three switches are an unsaved draft that survives tab switches: run
  12. Do
    control-openhands browser reload
  13. Note
    before the next bullet, otherwise its Confirmation Mode click turns the switch off again and the save stores the critic draft.

Confirmation mode persists #

  1. Note
    On /settings/verification (Basic) run
  2. Do
    control-openhands browser click 'testid=verification-settings-screen >> text=Confirmation Mode'
  3. Do
    control-openhands browser click 'testid=save-button'
  4. Do
    control-openhands browser reload
  5. Do
    control-openhands browser eval "document.querySelector('[data-testid=\"sdk-settings-confirmation_mode\"]').checked"

    (true).

  6. Do
    control-openhands browser click 'testid=sdk-section-advanced-toggle'
  7. Do
    control-openhands browser click 'testid=sdk-settings-security_analyzer'
  8. Check
    control-openhands browser snapshot 'role=listbox'

    (options LLM [selected], None),

  9. Do
    control-openhands browser click 'role=listbox >> role=option[name="None"]'
  10. Do
    control-openhands browser click 'testid=save-button'
  11. Do
    control-openhands browser reload
  12. Note
    : the tab bar shows Advanced [selected] and
  13. Check
    control-openhands browser value 'testid=sdk-settings-security_analyzer'

    is None.

  14. Check
    control-openhands api GET /api/settings

    shows conversation_settings.confirmation_mode true, security_analyzer none.

  15. Note
    Keep both for the next bullet.

Confirmation stops the agent #

  1. Wait
    control-openhands conversation start --prompt "Run this shell command: echo qa-f15-confirm" --wait --until waiting_for_confirmation,finished,idle,error --timeout 180
  2. Note
    the status is waiting_for_confirmation.
  3. Wait
    control-openhands browser wait-text 'Do you want to continue with this action?' --timeout 15000
  4. Note
    succeeds and
  5. Do
    control-openhands browser screenshot --feature F15.confirmation-mode-effect --name awaiting

    shows Cancel ⇧⌘⌫ and Continue ⌘↩ under the pending command.

  6. Do
    control-openhands browser click 'testid=action-confirm-button'
  7. Wait
    control-openhands conversation wait <id> --until finished,idle,error --timeout 120

    (<id> from the start output) and

  8. Check
    control-openhands conversation events <id> --kinds ObservationEvent
  9. Note
    : the terminal observation is qa-f15-confirm.
  10. Note
    If the status is still waiting_for_confirmation the agent asked again (see Gotchas): confirm again.
  11. Note
    Restore on /settings/verification (control-openhands browser goto /settings/verification; the browser is on the conversation): browser click 'testid=sdk-section-basic-toggle', click the Confirmation Mode label, browser click 'testid=save-button'; the Basic save also resets Security Analyzer to llm (API confirmation_mode false, security_analyzer llm).

Critic values persist #

  1. Note
    On the All tier click testid=verification-settings-screen >> text="Enable Critic", run
  2. Do
    control-openhands browser fill 'testid=sdk-settings-verification.critic_model_name' qa-critic-model
  3. Do
    control-openhands browser fill 'testid=sdk-settings-verification.critic_api_key' qa-dummy-critic-key
  4. Do
    control-openhands browser click 'testid=save-button'
  5. Do
    control-openhands browser reload
  6. Expect
    The page opens on All; browser value 'testid=sdk-settings-verification.critic_model_name' is qa-critic-model and browser value 'testid=sdk-settings-verification.critic_api_key' is **********.
  7. Note
    Restore on All: fill both fields with '', click text="Enable Critic" again, save, reload: the page opens on Basic and the API shows critic_enabled false, critic_model_name and critic_api_key null.

Critic mode, threshold and iterations #

  1. Note
    On /settings/verification run
  2. Do
    control-openhands browser click 'testid=sdk-section-all-toggle'
  3. Do
    control-openhands browser click 'testid=verification-settings-screen >> text="Enable Critic"'
  4. Do
    control-openhands browser click 'testid=sdk-settings-verification.critic_mode'
  5. Check
    control-openhands browser snapshot 'role=listbox'

    (options Finish and Message [selected], All Actions).

  6. Do
    control-openhands browser click 'role=listbox >> role=option[name="All Actions"]'
  7. Do
    control-openhands browser click 'testid=verification-settings-screen >> text="Enable Iterative Refinement"'
  8. Do
    control-openhands browser fill 'testid=sdk-settings-verification.critic_threshold' 0.75
  9. Do
    control-openhands browser fill 'testid=sdk-settings-verification.max_refinement_iterations' 5
  10. Do
    control-openhands browser click 'testid=save-button'
  11. Do
    control-openhands browser reload
  12. Note
    : the page opens on All, browser value reads All Actions, 0.75 and 5, and
  13. Check
    control-openhands api GET /api/settings --pick agent_settings.verification

    shows critic_mode all_actions, critic_threshold 0.75, max_refinement_iterations 5.

  14. Note
    Then browser fill 'testid=sdk-settings-verification.critic_threshold' 1.5, browser network --clear, browser click 'testid=save-button', browser toasts (HTTP request failed (422 Unprocessable Entity): {"detail":"Settings validation failed"}, three PATCH /api/settings with 422 in browser network); the API still shows 0.75.
  15. Note
    Restore: browser reload, browser click 'testid=sdk-section-basic-toggle', click text="Enable Iterative Refinement" and text="Enable Critic" off, browser click 'testid=save-button': the Basic save resets mode, threshold and iterations, and the API shows the verification defaults.

Tier follows the stored values after a save #

  1. Note
    On /settings/condenser (control-openhands browser goto /settings/condenser; the previous bullet is on /settings/verification) run
  2. Do
    control-openhands browser click 'testid=sdk-section-all-toggle'
  3. Do
    control-openhands browser fill 'testid=sdk-settings-condenser.keep_first' 3
  4. Do
    control-openhands browser click 'testid=save-button'
  5. Wait
    control-openhands browser wait-text 'Settings saved' --timeout 5000
  6. Check
    control-openhands browser snapshot 'role=tablist'

    (All [selected]).

  7. Note
    Then browser fill 'testid=sdk-settings-condenser.keep_first' 2, browser click 'testid=save-button',
  8. Wait
    control-openhands browser wait 'testid=sdk-settings-condenser.keep_first' --state detached --timeout 5000

    (detached) and browser snapshot 'role=tablist': Basic [selected] without any reload; the API shows keep_first 2 (restored).

Memory reaches the agent #

  1. Do
    control-openhands browser goto /settings/agent-context
  2. Note
    turn Persistent Agent Memory on and save as in F15.agent-context-save, then run
  3. Wait
    control-openhands conversation start --prompt "Reply with only: ok" --wait --timeout 180
  4. Check
    control-openhands api GET '/api/conversations/<id>/events/search?limit=1'
  5. Expect
    The first event is the SystemPromptEvent; its text contains Project memory: followed by `.openhands/memory/` under the workspace root.
  6. Expect
    The same call for a conversation started with memory off (for example the one from F15.confirmation-mode-effect) has no .openhands/memory.
  7. Note
    Restore memory off through the page (control-openhands browser goto /settings/agent-context first: conversation start left the browser on the conversation).

Leaving discards edits #

  1. Note
    Arrange an unsaved draft:
  2. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/verification' --expect-url '/settings/verification(\?|$)'
  3. Do
    control-openhands browser click 'testid=sdk-section-all-toggle'
  4. Note
    then click testid=verification-settings-screen >> text=Confirmation Mode, >> text="Enable Critic" and >> text="Enable Iterative Refinement" (do not save); browser enabled 'testid=save-button' is true.
  5. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/condenser' --expect-url '/settings/condenser(\?|$)'
  6. Do
    control-openhands browser dialogs

    (none),

  7. Check
    control-openhands browser click 'testid=sidebar-settings-/settings/verification' --expect-url '/settings/verification(\?|$)'
  8. Do
    control-openhands browser eval "[document.querySelector('[data-testid=\"sdk-settings-confirmation_mode\"]').checked, document.querySelector('[data-testid=\"sdk-settings-verification.critic_enabled\"]').checked]"

    ([false, false]) and browser enabled 'testid=save-button' (false).

Command menu #

  1. Do
    control-openhands browser goto /
  2. Do
    control-openhands browser press Control+k
  3. Do
    control-openhands browser type 'testid=command-menu >> role=combobox' Condenser
  4. Check
    control-openhands browser snapshot 'testid=command-menu'

    (option Condenser settings Tune context condensation behavior. Go [selected]),

  5. Do
    control-openhands browser press Enter
  6. Wait
    control-openhands browser wait-url '/settings/condenser(\?|$)'
  7. Note
    Repeat with Verification (option Verification settings Adjust risk and confirmation controls. Go, URL /settings/verification) and with Agent Context (option Agent Context Let the agent keep notes and recall them in new conversations. Go [selected], URL /settings/agent-context, subtitle Let the agent keep notes and recall them in new conversations.).
  8. Do
    control-openhands browser press Control+k
  9. Do
    control-openhands browser type 'testid=command-menu >> role=combobox' memory
  10. Check
    control-openhands browser snapshot 'testid=command-menu'
  11. Note
    : two options, Condenser settings … and Agent Context … (hovering selects an option, so click the one you want rather than pressing Enter); close with
  12. Do
    control-openhands browser press Escape

    (browser count 'testid=command-menu' is 0).

Direct URLs #

  1. Do
    control-openhands browser goto /settings/condenser
  2. Wait
    control-openhands browser wait 'testid=condenser-settings-screen'
  3. Note
    likewise /settings/agent-context with testid=agent-context-settings-screen and /settings/verification with testid=verification-settings-screen.
  4. Note
    Each wait returns visible.

Phone #

  1. Do
    control-openhands browser viewport phone
  2. Do
    control-openhands browser goto /settings/verification
  3. Do
    control-openhands browser click 'testid=sdk-section-all-toggle'
  4. Do
    control-openhands browser click 'testid=verification-settings-screen >> text="Enable Critic"'

    (unsaved),

  5. Check
    control-openhands browser bbox 'testid=verification-settings-screen'

    (width 348, pageHorizontalOverflow false) and

  6. Do
    control-openhands browser screenshot --feature F15.phone --name verification-all

    (one column; the settings nav is replaced by a back chevron).

  7. Note
    Do the same for /settings/condenser All.
  8. Note
    Return with
  9. Do
    control-openhands browser viewport desktop
  10. Note
    and browser reload to drop the draft.

Schema unavailable (F15.schema-unavailable, blocked) #

  1. Do
    control-openhands service stop agent-server
  2. Note
    does not reach this state: after browser reload the whole app is replaced by the Manage backends dialog (Disconnected, 502).
  3. Note
    Bring the stack back with
  4. Do
    control-openhands restart
  5. Expect
    The state needs a backend whose schema endpoints 404 (see Preconditions); there browser text 'testid=sdk-schema-unavailable' should start with SDK settings schema unavailable.

Errors sweep #

  1. Check
    control-openhands browser errors --clear
  2. Note
    open the three pages and their All tabs, then
  3. Check
    control-openhands browser errors --app-only
  4. Note
    : no page errors and no warnings (the condenser fields are translated since #18035).

Gotchas and known limits

  • Switches are hidden <input>s (#17900): browser testids lists them only with --hidden. Toggle by clicking the label text scoped to the page, read .checked with browser eval.
  • text=Enable Critic is a case-insensitive substring match and hits the help paragraph Enable critic evaluation for the agent. first, so the click does nothing. Quote it: text="Enable Critic" (same for text="Enable Iterative Refinement").
  • The conversation-owned fields have no verification. prefix: sdk-settings-confirmation_mode, sdk-settings-security_analyzer. Critic fields keep it (sdk-settings-verification.critic_enabled).
  • Saving is tier-scoped: Basic or Advanced saves reset every field the tier hides to its schema default (F15.view-scoped-save). Make all edits on All when other non-default values must survive.
  • The page opens on the least detailed tier that shows every stored override (any minor override → All). Do not assume Basic after a reload.
  • Condenser Kind None (no_op) still shows the summarizer fields with defaults, although the stored condenser no longer has them, and edits to them are accepted (Settings saved) but dropped while None is stored. #18049 covers hiding fields that do not apply to the selected kind.
  • A server-side validation error is retried three times (about 1.5 s of Saving...) before the toast, and the toast only says Settings validation failed without naming the field (#17932).
  • Condenser Kind is served by the Agent Server's settings schema as a user field. Since #18035 (closed #17939) Canvas shows its own choice labels and help text instead of the raw llm_summarizing/no_op values and the schema's reStructuredText description. It stays a user field on purpose: software-agent-sdk#5531, which dropped it from the schema, was closed because more condenser kinds may come, so the dropdown (and F15.condenser-kind) is expected behavior and its presentation is Canvas's job. OpenHands/software-agent-sdk#5495 (the schema's developer-facing description) is still open.
  • Toasts close after a few seconds; read them right after the click, or assert the stored value with api GET /api/settings.
  • Under confirmation mode the first confirmed command sometimes returned The terminal session was reset because the underlying tmux server/session disappeared... while several runs shared one tmux server (OpenHands/OpenHands#17946); launch now isolates them, so treat a reset as a finding. The agent then asks to run it again; a confirmed command took up to two minutes to produce its observation. Confirm again and wait with conversation wait, not a fixed sleep.
  • The confirmation buttons have test ids (action-confirm-button, action-reject-button) but their accessible names are Confirm action / Reject action, not the visible Continue / Cancel: role=button[name*="Continue"] finds nothing.
  • Basic-tier saves on Verification reset Security Analyzer to llm (it is an Advanced field). That is a convenient restore, and a trap if you meant to keep None.
  • The memory instructions are only visible through the conversation's first event; conversation events truncates text, so read api GET /api/conversations/<id>/events/search?limit=1 and search the JSON.
  • A checkout without #18035 shows the condenser minor fields with the schema's English text (Max tokens, Keep first, raw choice values) and logs 14 [i18n] Missing translation warnings on the All tab.
  • The dropdowns' clear (×) button has no accessible name and, in this build, clicking it through role=button >> nth=2 left the value unchanged.
  • After every successful save the selected tab is recomputed from the stored values (F15.tier-after-save), so a follow-up fill on an All-only field can time out because the page silently moved to Basic. Re-click sdk-section-all-toggle before each further edit.
  • Pressing Enter in a field does not save (no toast, API unchanged, Save stays enabled); only the Save Changes button submits.
  • Fields revealed by a parent switch do not exist while the switch is off: fill on critic_threshold with Iterative Refinement off waits for a missing element.
  • Rejecting a pending action (Cancel), the lock chip above the composer and the ⌘↩ / ⇧⌘⌫ shortcuts belong to F06.confirmation-mode and F06.confirmation-shortcuts; this family only proves that the settings turn the prompt on.
  • browser count 'role=status' also counts the backend status dot (backend-status-dot); use browser toasts for toast texts.

Source paths: src/routes/condenser-settings.tsx, src/routes/agent-context-settings.tsx, src/routes/verification-settings.tsx, src/components/features/settings/sdk-settings/, src/utils/sdk-settings-schema.ts.