JuliusBrussee/caveman · error · Error

sync import failed (${response.status})

Error message

sync import failed (${response.status})

What it means

The post-login sync that imports local spans into the dashboard got a non-2xx from the /imports endpoint. The login itself succeeded; only the one-time backfill of already-measured spans failed, with the HTTP status included.

Source

Thrown at packages/cli/src/index.ts:10011

    const ts = typeof r.ts === "string" ? r.ts : "";
    // The proxy writes ClickHouse-layout UTC timestamps ("YYYY-MM-DD HH:MM:SS.mmm").
    const ms = Date.parse(ts.includes("T") ? ts : ts.replace(" ", "T") + "Z");
    if (!Number.isFinite(ms)) return [];
    return directiveInstalls.filter((d) => ms >= d.installedAtMs).map((d) => d.id);
  };
  const body = rows.map((r) => syncRequestSpan(r, rowDirectives(r))).join("\n") + "\n";
  const response = await fetch(`${cfg.baseURL}/api/v1/imports?format=caveman-jsonl`, {
    method: "POST",
    headers: {
      authorization: `Bearer ${cfg.token}`,
      "content-type": "application/octet-stream",
      "x-cave-csrf": "cli",
    },
    body,
  });
  const result = (await response.json().catch(() => ({}))) as { status?: string; error?: { message?: string } };
  if (!response.ok || result.status !== "completed") {
    throw new Error(result.error?.message ?? `sync import failed (${response.status})`);
  }

  const num = (v: unknown) => (typeof v === "bigint" ? Number(v) : typeof v === "number" && Number.isFinite(v) ? v : 0);
  const maxId = rows.reduce((m, r) => Math.max(m, num(r.id)), since);
  writeSyncWatermark(key, maxId);
  const tokensSaved = rows.reduce((sum, r) => sum + Math.max(0, num(r.compression_tokens_before) - num(r.compression_tokens_after)), 0);
  const tokenBases = new Set(rows.map((r) => (typeof r.compression_token_count_basis === "string" ? r.compression_token_count_basis : "")).filter(Boolean));
  const tokenCountBasis = tokenBases.size === 0 ? "unavailable" : tokenBases.size === 1 ? [...tokenBases][0] ?? "unavailable" : "mixed";
  const cachedInputTokens = rows.reduce((sum, r) => sum + Math.max(0, num(r.cached_input_tokens)), 0);
  const cacheCreationInputTokens = rows.reduce((sum, r) => sum + Math.max(0, num(r.cache_creation_input_tokens)), 0);
  const headlineCompressionRefused = cacheCreationInputTokens > cachedInputTokens;
  const savingsUSD = rows.reduce((sum, r) => sum + num(r.savings_usd), 0);
  return {
    kind: "synced",
    spans: rows.length,
    tokensSaved,
    tokenCountBasis,
    cachedInputTokens,

View on GitHub (pinned to 5184b3d11a)

Solutions

  1. Retry `caveman sync` — the pass is idempotent via the watermark
  2. Check auth token and server health if the status persists (401/5xx)
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at packages/cli/src/index.ts:9166 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@5184b3d11a (2026-08-18). Data as JSON: /api/errors/705c7820bcf4cb08. Report an issue: GitHub.