xai-org/grok-build · critical
{} is a live grove mount without a backing marker; refusing
Error message
{} is a live grove mount without a backing marker; refusing rm -rf What it means
When the dest is detected as a projected grove mount, removal requires a backing marker (recorded in the mount's markers). If lookup_from_markers finds no marker, the library cannot prove which backing directory this mount belongs to, so it refuses to rm -rf to protect against deleting an unrelated victim directory.
Source
Thrown at crates/codegen/xai-fast-worktree/src/nfs/remove.rs:25
use super::liveness::{BACKING_MARKER_FILE, BackingMarker};
use super::mount_table::{dest_is_mountpoint, dest_is_projected_mount};
use crate::RemoveReport;
use anyhow::Context;
use anyhow::{Result, bail};
use std::io::Read;
use std::path::{Path, PathBuf};
use std::process::Stdio;
pub fn try_nfs_remove(worktree_path: &Path) -> Result<Option<RemoveReport>> {
if !dest_is_mountpoint(worktree_path) && !super::dest_is_known_unmounted(worktree_path) {
bail!(
"mount table inconclusive for {}; refusing remove",
worktree_path.display()
);
}
let is_projected = dest_is_projected_mount(worktree_path);
if is_projected {
if lookup_from_markers(worktree_path).is_none() {
bail!(
"{} is a live grove mount without a backing marker; refusing rm -rf",
worktree_path.display()
);
}
} 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}");
}View on GitHub (pinned to bc7f02eddd)
Solutions
- Restore/repair the marker metadata (re-register the mount via the grove tooling) so lookup_from_markers resolves it
- Unmount the mount first (plain_umount / umount <path>), then remove the backing directory explicitly
- Verify the mount actually belongs to you before removing, then delete backing manually if the tool refuses
Example fix
// before
try_nfs_remove(&live_mount_path)?;
// after
let _ = std::process::Command::new("umount").arg(&live_mount_path).status()?;
std::fs::remove_dir_all(&live_mount_path)?; // only if you verified ownership Defensive patterns
Strategy: validation
Validate before calling
if dest_is_projected_mount(&path) && lookup_from_markers(&path).is_none() {
eprintln!("live mount without marker; umount manually after verifying ownership");
} else {
try_nfs_remove(&path)?;
} Prevention
- Never delete marker metadata while a mount is live
- Create mounts only through the grove tooling so markers are registered
- Before rm on a live mount, verify marker presence or umount first
When it happens
Trigger: Calling try_nfs_remove on a live projected mount whose marker lookup fails: markers were deleted/corrupted, the mount was created by an older version with a different marker layout, or the mount was planted outside the grove flow.
Common situations: Manually mounting a grove export without going through the tool; cleaning /tmp state that held marker metadata while the mount is still active; version upgrade changing the marker file format.
Related errors
- {} is still a mountpoint without a grove marker; refusing um
- 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/f12b464f4da52e41.
Report an issue: GitHub.