--- id: "2b2ffbed-f138-4e55-81c6-dc783a21e1e6" name: "Extra High Programmatic Selection" micro_summary: "Verified keyboard-controlled power slider: Extra High is effort max at index 3; Pro is a separate index 4. Open the picker, focus Power, move with arrow keys, and verify the trigger." status: "not_examined" see_also: [] scope: "Set and verify ChatGPT's thinking effort through the current UI using target-scoped CDP keyboard events, without visually dragging the power dial or selecting Pro." --- ## Verified 2026-10-09 Current composer uses `[role="textbox"][contenteditable="true"]` (ProseMirror), not necessarily `#prompt-textarea`. The model picker trigger is `button[aria-label="Select ChatGPT model"][data-selected-reasoning-effort]`. With the menu closed, Extra High displays `Extra High` and `data-selected-reasoning-effort="max"`. The menu's `[role="slider"]` has `aria-valuemin="0"`, `aria-valuemax="4"`; Extra High is index 3, not the maximum index 4 (Pro). Never set the slider to its maximum merely because the user requested Extra High. ### Target-scoped recipe Attach `s = switch_tab(t, activate=False)`; use `target_id=t` for every JS call and `session_id=s` for CDP input. Focus emulation (`Emulation.setFocusEmulationEnabled`, enabled=True) permits background UI work; clear it when finished. 1. Read the closed trigger. If its label is exactly `Extra High` and effort is `max`, no change is necessary. 2. Open the trigger with targeted DOM `.click()` (verified for this picker; the unrelated plus-menu has different limitations). 3. Focus `[data-reasoning-slider]`, the menuitem with aria-label `Power`. 4. Read `[role="slider"].getAttribute('aria-valuenow')`. Send paired `Input.dispatchKeyEvent` keyDown/keyUp for `ArrowLeft` or `ArrowRight` until index 3. Re-read after each event and abort if the value does not advance; bound to four steps. Do not use End (would select Pro). 5. Send Escape to close the menu; verify the closed trigger label is `Extra High` and effort is `max`. Actual check: ArrowLeft from index 3 produced index 2 / effort `high`; ArrowRight restored index 3 / effort `max`. Escape restored the visible `Extra High` label. This is programmatic UI automation, not a stable private API or storage setter. Rediscover if markup changes; do not presume historical model names. No chat identifiers, tokens, or task transcript content belong in this shared recipe.