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
- Inspect the CSV around the failing row for quoting or delimiter problems
- Re-export the usage CSV from the provider
- 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.