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

  1. Restore/repair the marker metadata (re-register the mount via the grove tooling) so lookup_from_markers resolves it
  2. Unmount the mount first (plain_umount / umount <path>), then remove the backing directory explicitly
  3. 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

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


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