Hmbown/CodeWhale · error

invalid frozen Fleet member snapshot

Error message

invalid frozen Fleet member snapshot

What it means

A frozen Fleet member snapshot failed deserialization validation: it must have schema_version 1 and non-empty id and role. This snapshot is persisted with the run and thawed to reconstruct the AgentProfile; an unrecognized schema or blank identity means the frozen data cannot be trusted to dispatch the worker.

Solutions

  1. Recreate the run or re-freeze the member from a valid AgentProfile.
  2. Check the Codewhale version that wrote the frozen state; migrate or regenerate the snapshot.
  3. Ensure the member profile has non-empty id and role before freezing.
Defensive patterns

Strategy: type-guard

Validate before calling

fn snapshot_thawable(s: &FrozenMember) -> bool { s.schema_version == 1 && !s.id.trim().is_empty() && !s.role.trim().is_empty() }

Type guard

fn is_valid_snapshot(s: &FrozenMember) -> bool { s.schema_version == 1 && !s.id.trim().is_empty() && !s.role.trim().is_empty() }

Try / catch

match resolve_task_agent_profile(...) { Ok(p) => p, Err(e) => { log::error("frozen snapshot invalid: {e}"); re_freeze_or_fail_run() } }

Prevention

When it happens

Trigger: Calling into_profile (via resolve_task_agent_profile) on a frozen member snapshot whose schema_version is not 1, or whose id or role is empty/whitespace after a round-trip through storage.

Common situations: Run state written by an older/newer Codewhale version with a different snapshot schema; corrupted or hand-edited run state files; a member profile created without an id or role then frozen.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/fba367c7105ad07a. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/fleet/worker_runtime.rs:86

            display_name: profile.display_name.clone(),
            description: profile.description.clone(),
            requires: profile.requires.clone(),
            slot: profile.profile.slot.as_str().to_string(),
            role: canonical_public_role_name(&profile.profile.role.name),
            role_description: profile.profile.role.description.clone(),
            role_instructions: profile.profile.role.instructions.clone(),
            loadout: profile.profile.loadout.as_str().to_string(),
            provider: profile.profile.provider.clone(),
            model: profile.profile.model.clone(),
            reasoning_effort: profile.profile.reasoning_effort.clone(),
            max_spawn_depth: profile.profile.delegation.max_spawn_depth,
            origin: profile.origin,
        }
    }

    fn into_profile(self) -> Result<AgentProfile> {
        if self.schema_version != 1 || self.id.trim().is_empty() || self.role.trim().is_empty() {
            bail!("invalid frozen Fleet member snapshot");
        }
        Ok(AgentProfile {
            id: self.id,
            display_name: self.display_name,
            description: self.description,
            requires: self.requires,
            profile: FleetProfile {
                slot: FleetSlot::from_name(&self.slot),
                role: FleetProfileRole {
                    name: self.role,
                    description: self.role_description,
                    instructions: self.role_instructions,
                },
                loadout: FleetLoadout::from_name(&self.loadout),
                model: self.model,
                provider: self.provider,
                reasoning_effort: self.reasoning_effort,
                // Authority is always derived from live Runtime policy. A

View on GitHub (pinned to 73e0f67d83)