JuliusBrussee/caveman · error · Error
${markerPath} is not a valid Caveman ownership journal; refu
Error message
${markerPath} is not a valid Caveman ownership journal; refusing overwrite What it means
Validation of the pre-existing ownership journal (marker file) under cavemanHome()/mcp before an MCP transaction writes it: the file exists but does not parse as a Caveman ownership journal. Overwriting it would destroy an unknown owner record, so the transaction refuses to proceed.
Source
Thrown at packages/cli/src/index.ts:12515
function transactOwnedMcpConfig(
agent: "kilo" | "qwen",
serverName: string,
action: "install" | "uninstall",
mcp?: { command: string; args: string[] },
lockedConfigPath?: string,
): boolean {
const plan = action === "install"
? agent === "kilo" ? planMcpKiloJson(mcp!, serverName) : planMcpQwenJson(mcp!, serverName)
: agent === "kilo" ? planRemoveMcpKiloJson(serverName) : planRemoveMcpQwenJson(serverName);
if (!plan) return false;
if (lockedConfigPath && plan.path !== canonicalMcpConfigPath(lockedConfigPath)) {
throw new Error(`${agent} ${serverName} MCP config target changed while acquiring lock; refusing mutation`);
}
const markerPath = canonicalOwnedMcpMarkerPath(agent, serverName);
const markerBefore = fileBytes(markerPath);
if (markerBefore !== null && !validMcpMarkerBytes(markerBefore, agent, serverName)) {
throw new Error(`${markerPath} is not a valid Caveman ownership journal; refusing overwrite`);
}
const markerBeforeMode = markerBefore === null ? 0o600 : statSync(markerPath).mode & 0o777;
if (!optionalBytesEqual(fileBytes(markerPath), markerBefore)) {
throw new Error(`${markerPath} changed while planning MCP update; refusing overwrite`);
}
const markerAfter = action === "install" ? mcpMarkerBytes(mcp!, mcpServerToolName(serverName)!, plan.path) : null;
if (!plan.changed && optionalBytesEqual(markerBefore, markerAfter)) return true;
const journal: OwnedMcpPendingJournal = {
schema_version: 1,
transaction_id: randomUUID(),
agent,
server_name: serverName,
action,
config_path: plan.path,
marker_path: markerPath,
config_before_base64: plan.before?.toString("base64") ?? null,
config_before_mode: plan.beforeMode,View on GitHub (pinned to 5184b3d11a)
Solutions
- Inspect the marker file named in the message; if it is stale or hand-edited, back it up and remove it, then re-run the install
- If another tool created the file, reconcile ownership manually before using Caveman-managed MCP
- Ensure the Caveman version writing journals matches the one reading them (no cross-version format drift)
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at packages/cli/src/index.ts:12515 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of JuliusBrussee/caveman@5184b3d11a (2026-09-06).
Data as JSON: /api/errors/29cc3dfd03c226dc.
Report an issue: GitHub.