{"record":{"id":"32d0bb0a7dff4da4","repo":"Hmbown/CodeWhale","slug":"fleet-task-must-name-one-member-from-the-explicitly-selected","errorCode":null,"errorMessage":"Fleet task {} must name one member from the explicitly selected Fleet","messagePattern":"Fleet task (.+?) must name one member from the explicitly selected Fleet","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/fleet/worker_runtime.rs","lineNumber":150,"sourceCode":"\n/// Resolve and freeze every deterministic member selection before persistence.\n///\n/// Author-facing selectors may be ids, names, semantic roles, model labels, or\n/// exact routes. The durable task stores the selected member's canonical id and\n/// the identity/route inputs used for launch. Legacy `worker.role` remains a\n/// posture when it does not name exactly one member; explicit\n/// `worker.agent_profile` selectors fail closed when unknown or ambiguous, and\n/// when the task's `worker.role` names a posture other than the selected\n/// member's role.\npub(crate) fn freeze_fleet_task_members(\n    tasks: &mut [FleetTaskSpec],\n    agent_profiles: &[AgentProfile],\n    require_exact_member: bool,\n) -> Result<()> {\n    for task in tasks {\n        let Some(worker) = task.worker.as_ref() else {\n            if require_exact_member {\n                bail!(\n                    \"Fleet task {} must name one member from the explicitly selected Fleet\",\n                    task.id\n                );\n            }\n            continue;\n        };\n        let explicit_selector = worker\n            .agent_profile\n            .as_deref()\n            .map(str::trim)\n            .filter(|selector| !selector.is_empty())\n            .map(str::to_string);\n        let legacy_role_selector = worker\n            .role\n            .as_deref()\n            .map(str::trim)\n            .filter(|selector| !selector.is_empty())\n            .map(str::to_string);","sourceCodeStart":132,"sourceCodeEnd":168,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/fleet/worker_runtime.rs#L132-L168","documentation":"In exact-roster mode, every Fleet task must explicitly name one member of the selected Fleet via its worker member selector. freeze_fleet_task_members found a task with no worker selection at all, which cannot be frozen to a concrete member, so it bails.","triggerScenarios":"Calling freeze_fleet_task_members with require_exact_member=true and a task whose worker field is None — i.e. the task relies on legacy role-label posture instead of naming a member.","commonSituations":"Old task specs written before member-selection became required; a user clearing the member field in the Fleet editor while the fleet enforces an exact roster; migrating legacy role-based tasks into an exact-roster fleet.","solutions":["Set task.worker to name one member that exists in the selected Fleet.","Disable exact-roster mode if anonymous/role-posture tasks are intended.","Remove or delete the task if it is no longer needed."],"exampleFix":"// before\n{\"id\": \"t1\"}  // no worker\n// after\n{\"id\": \"t1\", \"worker\": {\"member\": \"agent-42\"}}","handlingStrategy":"validation","validationCode":"if require_exact_member { assert!(task.worker.as_ref().map_or(false, |w| w.member.is_some()), \"task {} missing member\", task.id); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enforce member selection in the Fleet editor when exact roster is on","Migrate legacy role-only tasks to member selection","Validate tasks against roster mode before freezing"],"tags":["fleet","roster","validation"],"backgroundTag":"missing-required-argument","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"}