xai-org/grok-build · error

worktree creation task failed

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).

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.

Appendix: 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)