Hmbown/CodeWhale · error

write-capable Fleet worker '{}' has no launch manifest

Error message

write-capable Fleet worker '{}' has no launch manifest

What it means

`authority_envelope_for_worker` builds the tool-authority envelope for a Fleet worker (fleet/executor.rs:148). When `spec.runtime_profile.permissions.write` is true, the spec must carry a `launch_manifest` supplying `writable_files` and `coordination_contracts`; None is an invariant violation. The standard builder in worker_runtime always attaches a manifest for write-capable specs (worker_runtime.rs:247-292), so this fires when a spec was constructed outside that path.

Source

Thrown at crates/tui/src/fleet/executor.rs:149

    Ok(build_worker_exec_command_from_prompt(
        codewhale_binary,
        launch_spec.objective.clone(),
        exec_config,
        Some(worker_model.as_str()),
        worker_provider.as_deref(),
        worker_reasoning_effort.as_deref(),
        Some(&authority),
    ))
}

pub(crate) fn authority_envelope_for_worker(
    spec: &AgentWorkerSpec,
    task_spec: &FleetTaskSpec,
) -> Result<ToolAuthorityEnvelope> {
    let (authority, writable_roots, writable_files, coordination_contracts) =
        if spec.runtime_profile.permissions.write {
            let manifest = spec.launch_manifest.as_ref().ok_or_else(|| {
                anyhow::anyhow!(
                    "write-capable Fleet worker '{}' has no launch manifest",
                    spec.worker_id
                )
            })?;
            (
                ToolMutationAuthority::ScopedWrite,
                super::worker_runtime::fleet_runtime_write_roots(task_spec)?,
                manifest.writable_files.clone(),
                manifest.coordination_contracts.clone(),
            )
        } else {
            (
                ToolMutationAuthority::ReadOnly,
                Vec::new(),
                Vec::new(),
                Vec::new(),
            )
        };

View on GitHub (pinned to 8880682c63)

Solutions

  1. Attach a launch manifest (writable roots/files plus coordination contracts) whenever write permission is granted — reuse the worker_runtime builder that constructs it
  2. Or run the worker read-only (`permissions.write = false`)
  3. Centralize AgentWorkerSpec construction so manifests cannot be skipped

Example fix

// before
let spec = AgentWorkerSpec { /* ... */, launch_manifest: None };
// with permissions.write == true this fails; after either
let spec = AgentWorkerSpec { /* ... */, launch_manifest: Some(manifest) };
// or keep it read-only
let mut runtime_profile = runtime_profile.clone();
runtime_profile.permissions.write = false;
Defensive patterns

Strategy: type-guard

Type guard

fn write_spec_has_manifest(spec: &AgentWorkerSpec) -> bool {
    !spec.runtime_profile.permissions.write || spec.launch_manifest.is_some()
}
assert!(write_spec_has_manifest(&spec));

Try / catch

match authority_envelope_for_worker(&spec, &task) {
    Err(err) if err.to_string().contains("no launch manifest") => {
        // rebuild the spec via the standard worker_runtime builder,
        // or downgrade the worker to read-only permissions
    }
    other => other?,
}

Prevention

When it happens

Trigger: A hand-constructed `AgentWorkerSpec` grants write permission with `launch_manifest: None`; a read-only spec's permissions are flipped to write without adding a manifest; a refactor bypasses the standard spec builder.

Common situations: Custom fleet schedulers/executors; tests assembling minimal specs by hand; partially migrated code paths.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/6bfa0c645714a2c7. Report an issue: GitHub.