xai-org/grok-build · error
{} is still a mountpoint without a grove marker; refusing um
Error message
{} is still a mountpoint without a grove marker; refusing umount/rm What it means
If the daemon is unreachable, remove_nfs_worktree falls back to manual unmounting. It will only umount a dest that currently is a mountpoint AND has a grove marker tying it to a known worktree. A mountpoint without a marker cannot be proven to be a grove worktree, so umount/rm is refused to avoid unmounting or deleting unrelated filesystems.
Source
Thrown at crates/codegen/xai-fast-worktree/src/nfs/remove.rs:48
} else if dest_is_mountpoint(worktree_path) || lookup_nfs_meta(worktree_path).is_none() {
return Ok(None);
}
remove_nfs_worktree(worktree_path)
}
fn remove_nfs_worktree(worktree_path: &Path) -> Result<Option<RemoveReport>> {
let opts = nfs_opts_from_env_and_meta(None);
let client = NfsWorktreeClient::from_opts(&opts);
if client.ping() {
match client.remove_worktree(worktree_path, false) {
Ok(()) => return report_after_daemon_unmount(worktree_path),
Err(e) => {
bail!("daemon RemoveWorktree failed: {e}");
}
}
}
if dest_is_mountpoint(worktree_path) {
if lookup_from_markers(worktree_path).is_none() {
bail!(
"{} is still a mountpoint without a grove marker; refusing umount/rm",
worktree_path.display()
);
}
plain_umount(worktree_path)?;
}
if !super::dest_is_known_unmounted(worktree_path) {
bail!(
"unmount of {} could not be verified (still mounted or mount table \
inconclusive); retaining backing and pin",
worktree_path.display()
);
}
let meta = lookup_nfs_meta(worktree_path);
if let Some(m) = meta.as_ref() {
let Some(id) = m.worktree_id.as_deref() else {
bail!(
"unmounted dest {} has grove metadata without a worktree id; \View on GitHub (pinned to bc7f02eddd)
Solutions
- Restart the grove daemon so the primary RemoveWorktree path (which knows the mapping) can run
- Manually verify the mount is yours (compare source/target in `mount` output) and umount by hand, then remove the backing dir
- Regenerate/repair marker metadata via grove tooling before retrying
Example fix
// before
try_nfs_remove(&path)?; // fails: daemon down, no marker
// after
Command::new("umount").arg(&path).status()?; // after verifying mount ownership
std::fs::remove_dir_all(&path)?; Defensive patterns
Strategy: validation
Validate before calling
if dest_is_mountpoint(&path) && lookup_from_markers(&path).is_none() {
eprintln!("refusing: mountpoint has no grove marker; verify ownership and umount manually");
} Prevention
- Keep the daemon running so the primary remove path is used
- Never mount foreign filesystems at grove dest paths
- Repair markers via grove tooling instead of forcing removal
When it happens
Trigger: Daemon is down and try_nfs_remove hits the fallback: the path is a mountpoint but lookup_from_markers returns None — mount created outside the tool, markers deleted, or the dest is someone else's mount (e.g. NFS export or loop mount not owned by grove).
Common situations: Daemon crashed mid-lifecycle leaving a mount whose marker was never written; user manually mounted something at the worktree path; stale markers cleaned from disk while the mount remained.
Related errors
- {} is a live grove mount without a backing marker; refusing
- mount table inconclusive for {}; refusing remove
- unmount of {} could not be verified (still mounted or mount
- refusing to delete pre-existing snapshot {}: outside grok-ma
- refusing to delete pre-existing snapshot {}: its metadata ta
AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31).
Data as JSON: /api/errors/c81d1495bb886e4e.
Report an issue: GitHub.