{"record":{"id":"8c900d8f882f4ee5","repo":"Hmbown/CodeWhale","slug":"fleet-task-requests-thinking-tier-effort","errorCode":null,"errorMessage":"Fleet task `{}` requests thinking tier `{effort}` for `{}` / `{}`, but that exact model route does not support thinking; choose inherit, auto, or off, or select a reasoning-capable model","messagePattern":"Fleet task `(.+?)` requests thinking tier `(.+?)` for `(.+?)` / `(.+?)`, but that exact model route does not support thinking; choose inherit, auto, or off, or select a reasoning-capable model","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/fleet/worker_runtime.rs","lineNumber":160,"sourceCode":"        effective_fleet_reasoning_effort_for_role(task.worker.as_ref(), agent_profile)\n    else {\n        return Ok(());\n    };\n    if matches!(effort.as_str(), \"inherit\" | \"auto\" | \"off\") {\n        return Ok(());\n    }\n    let Some(route) = resolve_fleet_route_with_config(task, agent_profiles, session_model, config)\n    else {\n        // The model-route validator owns unresolved-route errors and produces\n        // the more useful provider/model diagnosis.\n        return Ok(());\n    };\n    let provider = ApiProvider::parse(&route.provider_kind).unwrap_or(ApiProvider::Custom);\n    let capability = crate::config::provider_capability(provider, &route.wire_model_id);\n    if capability.thinking_supported {\n        return Ok(());\n    }\n    bail!(\n        \"Fleet task `{}` requests thinking tier `{effort}` for `{}` / `{}`, but that exact model route does not support thinking; choose inherit, auto, or off, or select a reasoning-capable model\",\n        task.id,\n        route.provider_id,\n        route.wire_model_id,\n    );\n}\n\n/// Build a sub-agent worker spec after resolving workspace Fleet profile input.\n///\n/// This keeps Fleet and sub-agents on the same runtime substrate: profile files\n/// and task-level role/loadout intent are composed into the existing\n/// `AgentWorkerSpec` / `WorkerRuntimeProfile` pair, then optionally intersected\n/// with a parent profile when the caller has one.\n/// A worker workspace is isolated when it is a linked git worktree that sits\n/// outside the coordinating manager's workspace (and does not contain it):\n/// its mutations cannot overlap the shared checkout, so its launch manifest\n/// must not claim the shared-workspace coordination scope (#5036).\nfn worker_workspace_is_isolated(","sourceCodeStart":142,"sourceCodeEnd":178,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/fleet/worker_runtime.rs#L142-L178","documentation":"The task or its agent profile requests an explicit thinking tier (reasoning_effort such as low/medium/high/max), but the exact resolved route — this provider plus this wire model id — reports thinking_supported = false via `provider_capability`. The check is per exact model route, not per provider, and it only runs when the route resolves; unresolved-route errors belong to the model-route validator. The launch is refused instead of silently sending a thinking flag the model ignores.","triggerScenarios":"An agent profile with `reasoning_effort = \"high\"` (alias `thinking`/`reasoning` in TOML) while the resolved route is a non-reasoning model; changing a profile's model but keeping its saved thinking tier; custom/self-hosted model ids with no capability mapping.","commonSituations":"Switching from a reasoning model to a fast chat variant for cost and forgetting the tier; profiles shared across providers where only some variants support reasoning; new model ids the capability table classifies as non-thinking.","solutions":["Set the profile's reasoning_effort to `inherit`, `auto`, or `off` so no unsupported tier is requested.","Select a reasoning-capable model for that profile if you really need the tier.","For custom model ids, check that your capability/provider mapping classifies the model correctly instead of defaulting to non-thinking."],"exampleFix":"# before (agent profile TOML)\nid = \"implementer\"\nmodel = \"fast-chat-model\"\nthinking = \"high\"\n\n# after\nid = \"implementer\"\nmodel = \"fast-chat-model\"\nthinking = \"off\"","handlingStrategy":"validation","validationCode":"// Before submitting, confirm the requested tier is compatible with the exact route.\nfn tier_is_compatible(effort: Option<&str>, provider: ApiProvider, wire_model: &str) -> bool {\n    match effort {\n        None | Some(\"inherit\") | Some(\"auto\") | Some(\"off\") => true,\n        Some(_) => crate::config::provider_capability(provider, wire_model).thinking_supported,\n    }\n}","typeGuard":"fn route_supports_thinking(provider: &str, wire_model_id: &str) -> bool {\n    let provider = ApiProvider::parse(provider).unwrap_or(ApiProvider::Custom);\n    crate::config::provider_capability(provider, wire_model_id).thinking_supported\n}","tryCatchPattern":null,"preventionTips":["Default profiles to `thinking = \"inherit\"` and pin tiers only per task that needs reasoning.","When swapping a profile's model, re-check its saved reasoning_effort against the new route.","Maintain a note of which model ids are reasoning-capable per provider you use."],"tags":["fleet","reasoning","model-capability","validation","rust"],"backgroundTag":"unsupported-model-capability","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}