{"record":{"id":"11e2854b489d1ce1","repo":"Hmbown/CodeWhale","slug":"fleet-task-has-invalid-worker-role-member-selector-selector","errorCode":null,"errorMessage":"Fleet task {} has invalid worker.role member selector {selector:?}: {error}","messagePattern":"Fleet task (.+?) has invalid worker\\.role member selector (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/fleet/worker_runtime.rs","lineNumber":189,"sourceCode":"            let selected = resolve_member_in_profiles(agent_profiles, selector).map_err(|error| {\n                anyhow::anyhow!(\n                    \"Fleet task {} has invalid worker.agent_profile selector {selector:?}: {error}\",\n                    task.id\n                )\n            })?;\n            Some(selected.ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Fleet task {} references unknown agent profile selector {selector:?}\",\n                    task.id\n                )\n            })?)\n        } else if let Some(selector) = legacy_role_selector.as_deref() {\n            // `role` was historically only a posture. Preserve that contract\n            // when no exact Fleet is selected and a roster lookup is absent.\n            // Ambiguity is never a posture: silently dropping it would make a\n            // selected team launch an anonymous session-route worker.\n            match resolve_member_in_profiles(agent_profiles, selector).map_err(|error| {\n                anyhow::anyhow!(\n                    \"Fleet task {} has invalid worker.role member selector {selector:?}: {error}\",\n                    task.id\n                )\n            })? {\n                Some(profile) => Some(profile),\n                None if require_exact_member => {\n                    bail!(\n                        \"Fleet task {} worker.role selector {selector:?} does not name a member in the explicitly selected Fleet\",\n                        task.id\n                    )\n                }\n                None => None,\n            }\n        } else if require_exact_member {\n            bail!(\n                \"Fleet task {} must name one member from the explicitly selected Fleet\",\n                task.id\n            );","sourceCodeStart":171,"sourceCodeEnd":207,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/fleet/worker_runtime.rs#L171-L207","documentation":"Thrown by freeze_fleet_task_members when a legacy worker.role value is being resolved as a member selector (because an exact Fleet/roster is in play) and resolve_member_in_profiles errors on it. The code path preserves the historical 'role is a posture' contract but treats ambiguity as fatal when a roster is selected, wrapping the resolver error with the task id.","triggerScenarios":"Freezing a task that sets worker.role to a non-posture string while an exact roster is required: resolve_member_in_profiles rejects the string's structure, e.g. role = \"senior reviewer\" with selector syntax the resolver cannot parse.","commonSituations":"Older configs using free-text role labels now interpreted as member selectors after the roster feature landed; role containing characters the selector grammar forbids; mixing role and member naming schemes after migration.","solutions":["Rename the value into a valid worker.agent_profile selector, or change worker.role to a valid posture label (e.g. consultant/advisory).","Fix the selector per the wrapped resolver error's concrete complaint.","Add a matching member profile for the intended role so resolution succeeds.","Update legacy configs to the member-selector scheme after the roster migration."],"exampleFix":"// before\nrole = \"senior-reviewer\"\n// after\nagent_profile = \"senior-reviewer\" # or role = \"consultant\" for a posture","handlingStrategy":"validation","validationCode":"// Rust\nconst POSTURES: [&str; 2] = [\"consultant\", \"advisory\"];\nif let Some(role) = task.worker.role.as_deref() {\n    if !POSTURES.contains(&role) && resolve_member_in_profiles(&profiles, role).is_err() {\n        eprintln!(\"role {role:?} is neither a posture nor a valid member selector\");\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Migrate legacy role labels to worker.agent_profile when exact rosters are used.","Reserve worker.role strictly for posture values.","Audit old task configs after upgrading to the roster feature."],"tags":["fleet","selector","validation","legacy-migration"],"backgroundTag":"invalid-argument-value","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}