Files
roboco/docs/ux_ui/design/03-model-selector-ux.md
T
d5cbbf49ee [50e80c55] Prompter interaction design and confirmation flow spec (#74) (#75)
* [50e80c55] docs(design): create Prompter interaction design directory and main spec

* [50e80c55] docs(design): add confirmation interstitial spec with un-bypassable guardrails

* [50e80c55] docs(design): add model-selector drawer UX with Recommended default and complexity mapping

* [50e80c55] docs(design): add naming and navigation spec with sidebar placement and Task Assistant recommendation

---------

Co-authored-by: UX/UI Developer 1 <ux-dev-1@agents.roboco.dev>
2026-06-07 04:50:38 +02:00

142 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Prompter — Model Selector UX Specification
## Principle
Most users do not know which model drafts better tasks. The model selector should be available for power users but invisible for everyone else. The default must be safe, fast, and context-aware.
---
## Placement
**Inside the Advanced Options drawer** of the confirmation interstitial.
- `Collapsible` trigger label: "Advanced Options"
- When expanded, the first item in the drawer is the model selector.
This follows the existing `CreateTaskDialog` pattern where advanced fields (parent task, assignee, git config) are tucked behind a `Collapsible` with `ChevronRight` / `ChevronDown` icons.
Rationale:
- Reduces cognitive load on the primary review screen.
- Prevents choice paralysis for users who dont care about the model.
- Aligns with the Head of Marketing directive: "most users dont know which model drafts better tasks."
---
## Component
`Select` from `panel/src/components/ui/select.tsx`:
```tsx
<Select value={model} onValueChange={setModel}>
<SelectTrigger className="w-full">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="recommended">
Recommended {dynamicLabel}
</SelectItem>
<SelectItem value="claude-sonnet-4">
Claude Sonnet 4 Balanced
</SelectItem>
<SelectItem value="gpt-4o">
GPT-4o Fast
</SelectItem>
<SelectItem value="claude-opus-4">
Claude Opus 4 Deep reasoning
</SelectItem>
</SelectContent>
</Select>
```
---
## Defaults
### Default Selection: "Recommended"
The `recommended` value is not a real model ID; it is a frontend alias that resolves to a model based on the draft's estimated complexity:
| Draft Complexity | Resolved Model | Rationale |
|----------------|----------------|-----------|
| `LOW` | `gpt-4o` or lightweight equivalent | Fast, cheap, good enough for simple tasks |
| `MEDIUM` | `claude-sonnet-4` | Balanced quality and speed |
| `HIGH` | `claude-opus-4` | Deep reasoning for complex specs |
**Dynamic label**: the Select trigger should display the resolved model name in the description:
> ⭐ Recommended — Claude Sonnet 4
This gives transparency without requiring the user to make a manual choice.
### How Complexity Is Determined
1. **LLM suggestion**: the drafting LLM outputs an `estimated_complexity` field as part of the structured draft.
2. **User override**: if the user changes the Complexity `Select` in the review modal, the recommended model re-evaluates automatically.
3. **No user model preference persistence in Phase 1** — each session starts fresh with `recommended`.
---
## Option Descriptions
Each `SelectItem` should have a one-line subtitle explaining when to choose it:
```
⭐ Recommended — Claude Sonnet 4
(Best balance for this task's complexity)
Claude Sonnet 4 — Balanced
(Good for most tasks)
GPT-4o — Fast
(Quick drafts, simpler specs)
Claude Opus 4 — Deep reasoning
(Complex architecture or security tasks)
```
Implementation note: if `SelectItem` does not natively support subtitles, append the subtitle as muted text inside the item using a nested `span` with `text-muted-foreground text-xs`.
---
## Visual Hierarchy
```
┌─ Advanced Options ──────────────────────┐
│ │
│ Model │
│ [⭐ Recommended — Claude Sonnet 4 ▼] │
│ ├─ ⭐ Recommended — Claude Sonnet 4 │
│ ├─ Claude Sonnet 4 — Balanced │
│ ├─ GPT-4o — Fast │
│ └─ Claude Opus 4 — Deep reasoning │
│ │
│ Assign To … │
│ Parent Task … │
│ … │
└─────────────────────────────────────────┘
```
---
## Accessibility
- `Label` with `htmlFor` tied to the `SelectTrigger` id.
- `aria-describedby` on the trigger pointing to a helper paragraph: "The model used to draft this task. 'Recommended' picks the best fit automatically."
- `SelectContent` should trap focus while open; `Esc` closes the dropdown.
---
## Out of Scope (Phase 2)
- Model comparison side-by-side
- User-level default model preference
- Cost/usage indicators per model
- Temperature / max-tokens sliders
- Custom system prompt editing
---
## Cross-Cell Note
The frontend sends the resolved model ID (not the alias) to the backend chat endpoint. The backend endpoint in `roboco/services/llm.py` already handles multi-provider routing; the frontend only needs to pass the model string in the payload.