{"record":{"id":"c81d1495bb886e4e","repo":"xai-org/grok-build","slug":"is-still-a-mountpoint-without-a-grove-marker-r","errorCode":null,"errorMessage":"{} is still a mountpoint without a grove marker; refusing umount/rm","messagePattern":"(.+?) is still a mountpoint without a grove marker; refusing umount/rm","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codegen/xai-fast-worktree/src/nfs/remove.rs","lineNumber":48,"sourceCode":"    } else if dest_is_mountpoint(worktree_path) || lookup_nfs_meta(worktree_path).is_none() {\n        return Ok(None);\n    }\n    remove_nfs_worktree(worktree_path)\n}\nfn remove_nfs_worktree(worktree_path: &Path) -> Result<Option<RemoveReport>> {\n    let opts = nfs_opts_from_env_and_meta(None);\n    let client = NfsWorktreeClient::from_opts(&opts);\n    if client.ping() {\n        match client.remove_worktree(worktree_path, false) {\n            Ok(()) => return report_after_daemon_unmount(worktree_path),\n            Err(e) => {\n                bail!(\"daemon RemoveWorktree failed: {e}\");\n            }\n        }\n    }\n    if dest_is_mountpoint(worktree_path) {\n        if lookup_from_markers(worktree_path).is_none() {\n            bail!(\n                \"{} is still a mountpoint without a grove marker; refusing umount/rm\",\n                worktree_path.display()\n            );\n        }\n        plain_umount(worktree_path)?;\n    }\n    if !super::dest_is_known_unmounted(worktree_path) {\n        bail!(\n            \"unmount of {} could not be verified (still mounted or mount table \\\n             inconclusive); retaining backing and pin\",\n            worktree_path.display()\n        );\n    }\n    let meta = lookup_nfs_meta(worktree_path);\n    if let Some(m) = meta.as_ref() {\n        let Some(id) = m.worktree_id.as_deref() else {\n            bail!(\n                \"unmounted dest {} has grove metadata without a worktree id; \\","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/xai-org/grok-build/blob/bc7f02eddd3d84085849dc19ed216f11c23b0571/crates/codegen/xai-fast-worktree/src/nfs/remove.rs#L30-L66","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\ntry_nfs_remove(&path)?; // fails: daemon down, no marker\n// after\nCommand::new(\"umount\").arg(&path).status()?; // after verifying mount ownership\nstd::fs::remove_dir_all(&path)?;","handlingStrategy":"validation","validationCode":"if dest_is_mountpoint(&path) && lookup_from_markers(&path).is_none() {\n    eprintln!(\"refusing: mountpoint has no grove marker; verify ownership and umount manually\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["safety-guard","mount","marker","fallback"],"backgroundTag":"mount-table-inconclusive","analyzedSha":"bc7f02eddd3d84085849dc19ed216f11c23b0571","analyzedAt":"2026-08-31T04:59:42.031Z","schemaVersion":2},"datasetVersion":"2026-08-31T09:17:48.483Z"}