Skip to content

Commit b0633a9

Browse files
cailmdaleyclaude
andcommitted
feat(ui): capture defaults to claude-opus at xhigh (was claude-fable)
The Capture/Stash dialog seeded a background crystallize session to claude-fable. A captured yap is usually real thinking worth crystallizing, so default the worker to the strong model: claude-opus at xhigh reasoning. Scoped to the capture form — the effort is seeded in the form, not taken from opus's registry default_effort, so the global opus default (kanban/CLI dispatch) is unchanged. Switching the agent in the dialog still re-derives effort from that agent's own default_effort. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bu7hkSqWLKjpnBkQCBNaGr
1 parent 0756a4c commit b0633a9

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

ui/src/forms/CaptureForm.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,21 @@ import { shuttleOrigin } from './projectModel'
3131
* effort/chrome stay disabled on the fallback (no metadata to gate them).
3232
*/
3333
const FALLBACK_AGENTS: AgentEntry[] = [
34-
{ id: 'claude-fable', default: true },
35-
{ id: 'claude-opus', default: false },
34+
{ id: 'claude-opus', default: true },
3635
{ id: 'claude-sonnet', default: false },
36+
{ id: 'claude-fable', default: false },
3737
{ id: 'codex', default: false },
3838
]
3939

40+
// Capture's default worker: claude-opus at xhigh reasoning. A captured yap is
41+
// often a real piece of thinking to crystallize, not throwaway — worth the
42+
// strong model. Effort is seeded here rather than taking opus's registry
43+
// default_effort so the global opus default (used by kanban/CLI dispatch) is
44+
// untouched; switching the agent in the form falls back to that agent's own
45+
// default_effort.
46+
const CAPTURE_DEFAULT_AGENT = 'claude-opus'
47+
const CAPTURE_DEFAULT_EFFORT = 'xhigh'
48+
4049
export interface CaptureFormProps {
4150
/** Default destination: a project path (matched against `availableCities` by
4251
* path). Null = fall through to activity ranking. */
@@ -76,15 +85,14 @@ export function CaptureForm({
7685
shuttleBase = '',
7786
}: CaptureFormProps): JSX.Element {
7887
const [prompt, setPrompt] = useState('')
79-
// Capture's default is claude-fable (the daemon's capture default), not the
80-
// registry's dispatch default — a background crystallize session is fable
81-
// territory regardless of what ordinary dispatch defaults to.
82-
const [agent, setAgent] = useState<string>('claude-fable')
88+
const [agent, setAgent] = useState<string>(CAPTURE_DEFAULT_AGENT)
8389
const [agents, setAgents] = useState<AgentEntry[]>(FALLBACK_AGENTS)
8490
// Axes come from the selected agent's registry constraint metadata — no
8591
// hardcoded lists. The effective effort is always a concrete token when
86-
// the selected agent supports reasoning levels.
87-
const [effort, setEffort] = useState<string>('')
92+
// the selected agent supports reasoning levels. Seeded to the capture default
93+
// (xhigh) for the initial opus selection; `handleAgentChange` re-derives from
94+
// the chosen agent's own default_effort thereafter.
95+
const [effort, setEffort] = useState<string>(CAPTURE_DEFAULT_EFFORT)
8896
const [chrome, setChrome] = useState<boolean>(false)
8997
const [submitting, setSubmitting] = useState(false)
9098
const [error, setError] = useState<string | null>(null)
@@ -254,7 +262,7 @@ export function CaptureForm({
254262
>
255263
{agents.map((a) => (
256264
<option key={a.id} value={a.id}>
257-
{a.id}{a.id === 'claude-fable' ? ' (default)' : ''}
265+
{a.id}{a.id === CAPTURE_DEFAULT_AGENT ? ' (default)' : ''}
258266
</option>
259267
))}
260268
</select>

0 commit comments

Comments
 (0)