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
- Inspect the inner error chained after this message (the `??` preserves the source) and fix the underlying git/filesystem issue.
- Remove any stale worktree at the target path (git worktree prune / delete leftover directory) and retry.
- Check disk space and mount health for the worktree parent directory.
- 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
- Prune stale git worktrees (git worktree prune) before rehydration
- Monitor disk space on the worktree parent volume
- Verify btrfs delegate health or disable it when flaky
- Use unique per-attempt worktree paths to avoid collisions
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
- no .git file or directory found at {}
- git worktree add failed: {}
- overlay mount delegation not supported by this delegate
- overlay unmount delegation not supported by this delegate
- git reset --hard {} failed: {}
AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31).
Data as JSON: /api/errors/ba473dbe24e32cce.
Report an issue: GitHub.