JuliusBrussee/caveman · error

usage export row: %w

Error message

usage export row: %w

What it means

parseUsageExport hit a CSV-level read error (other than EOF) while iterating rows of the usage export file — malformed quoting, inconsistent field counts, or mid-file corruption. The wrapped error carries csv.Reader's detail identifying the offending row.

Source

Thrown at proxy/internal/store/learn_reconcile.go:157

	defer file.Close()
	reader := csv.NewReader(file)
	reader.FieldsPerRecord = -1
	header, err := reader.Read()
	if err != nil {
		return nil, fmt.Errorf("usage export has no header row: %w", err)
	}
	columns, err := mapReconcileHeader(header)
	if err != nil {
		return nil, err
	}
	billed := map[string]int64{}
	for {
		record, err := reader.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			return nil, fmt.Errorf("usage export row: %w", err)
		}
		modelIndex := columns["model"]
		if modelIndex >= len(record) {
			continue
		}
		model := strings.TrimSpace(record[modelIndex])
		if model == "" {
			continue
		}
		total := reconcileCell(record, columns, "input") +
			reconcileCell(record, columns, "output") +
			reconcileCell(record, columns, "cache_read") +
			reconcileCell(record, columns, "cache_write")
		if total <= 0 {
			continue
		}
		billed[model] += total
	}

View on GitHub (pinned to 81536f57b3)

Solutions

  1. Inspect the CSV around the failing row for quoting or delimiter problems
  2. Re-export the usage CSV from the provider
  3. Fix the specific row indicated by the wrapped csv error's line number
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at proxy/internal/store/learn_reconcile.go:157 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@81536f57b3 (2026-08-27). Data as JSON: /api/errors/2f5def527a6d676a. Report an issue: GitHub.