xai-org/grok-build · error

worktree creation task failed: {e}

Error message

worktree creation task failed: {e}

What it means

rehydrate_session_in_worktree spawns worktree creation (possibly with a btrfs delegate) on a blocking/async builder inside an async block; if the spawned task returns Err it is wrapped with this message. The `??` then propagates the inner worktree error. Root cause is inside the worktree creation task (git operation, filesystem, btrfs delegate failure).

Source

Thrown at crates/codegen/xai-grok-shell/src/session/worktree.rs:514

        let session_id = req.session_id.clone();
        let btrfs_delegate = btrfs_delegate_from_env();
        tokio::task::spawn_blocking(move || {
            use xai_fast_worktree::{
                CreationMode, IgnoredFilesMode, WorkingTreeMode, WorktreeBuilder,
            };
            let mut builder = WorktreeBuilder::new(&source, &dest)
                .working_tree_mode(WorkingTreeMode::CleanAll)
                .ignored_files_mode(IgnoredFilesMode::Skip)
                .creation_mode(CreationMode::Linked)
                .worktree_kind(xai_fast_worktree::WorktreeKind::Fork)
                .session_id(session_id);
            if let Some(delegate) = btrfs_delegate {
                builder = builder.btrfs_delegate(delegate);
            }
            builder.create()
        })
        .await
        .map_err(|e| anyhow::anyhow!("worktree creation task failed: {e}"))??;
    }
    let client = registry_client.ok_or_else(|| {
        anyhow::anyhow!(
            "Session registry client is required for rehydration \
             (auth may be missing or registry is disabled)"
        )
    })?;
    let record = client
        .get_session(&req.session_id)
        .await
        .context("fetching session record for rehydration")?;
    let turn = crate::session::restore::resolve_restore_turn(&record, None);
    let memory_dl_future = crate::session::restore::download_to_tempfile(
        client,
        &req.session_id,
        "memory.tar.gz",
        turn,
    );

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Inspect the inner error chained after this message (the `??` preserves the source) and fix the underlying git/filesystem issue.
  2. Remove any stale worktree at the target path (git worktree prune / delete leftover directory) and retry.
  3. Check disk space and mount health for the worktree parent directory.
  4. If using btrfs_delegate, verify the btrfs filesystem and delegate are functional, or run without the delegate.

Example fix

// before
builder.create()
// after — fail fast with a clearer cause and clean stale path
if Path::new(&wt_path).exists() {
    tokio::fs::remove_dir_all(&wt_path).await.ok();
}
builder.create().await.map_err(|e| anyhow!("worktree creation task failed: {e:#}"))?
Defensive patterns

Strategy: retry

Validate before calling

let wt = std::path::Path::new(&wt_path);
if wt.exists() {
    return Err(anyhow!("worktree path {} already exists; clean up first", wt.display()));
}
// also check free space
let stat = nix::sys::statvfs::statvfs(wt.parent().unwrap())?;
if stat.blocks_available() < MIN_FREE_BLOCKS { return Err(anyhow!("insufficient disk space")); }

Try / catch

match rehydrate_session_in_worktree(req).await {
    Err(e) if e.to_string().contains("worktree creation task failed") => {
        cleanup_stale_worktree(&req.worktree_path).await;
        rehydrate_session_in_worktree(req).await // one retry after cleanup
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling rehydrate_session_in_worktree when the spawned `builder.create()` future/task returns an error (git worktree add failure, path already exists, filesystem error, btrfs delegate failure).

Common situations: Rehydrating a session onto a disk with insufficient space, a stale worktree path left by a previous crashed run, or a broken btrfs setup.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/ba473dbe24e32cce. Report an issue: GitHub.