JuliusBrussee/caveman · error

cachebench: corpus has no sessions

Error message

cachebench: corpus has no sessions

What it means

analyzeCorpus groups corpus rows by SessionID and errors if no sessions result. In practice this only happens when the corpus rows are empty at this stage, since every row creates or joins a session — so it signals an empty corpus reaching analysis.

Source

Thrown at cacheengine/cachebench/corpus.go:530

	count := c.Count(raw)
	c.counts[digest] = count
	return digest, count
}

func analyzeCorpus(corpus AgentCorpus, counter *corpusTokenCounter) (CorpusSummary, error) {
	sessions := map[string]*corpusSession{}
	order := make([]string, 0)
	for _, row := range corpus.Rows {
		session := sessions[row.SessionID]
		if session == nil {
			session = &corpusSession{ID: row.SessionID}
			sessions[row.SessionID] = session
			order = append(order, row.SessionID)
		}
		session.Rows = append(session.Rows, row)
	}
	if len(sessions) == 0 {
		return CorpusSummary{}, errors.New("cachebench: corpus has no sessions")
	}
	summary := CorpusSummary{
		Name: corpus.Metadata.Name, License: corpus.Metadata.License, Revision: corpus.Metadata.Revision,
		SHA256: corpus.SHA256, Sessions: len(sessions), Requests: len(corpus.Rows), Sources: map[string]int{},
		RetainedBytes: corpus.Bytes,
		TokenBasis:    counter.Name() + " estimate over canonical message JSON",
	}
	if summary.RetainedBytes == 0 {
		summary.RetainedBytes = corpusRetainedBytes(corpus.Rows)
	}
	turns := make([]int, 0, len(sessions))
	for _, id := range order {
		session := sessions[id]
		turns = append(turns, len(session.Rows))
		summary.Sources[corpusSource(id)]++
		var previous []PrefixSegment
		for index, row := range session.Rows {
			prefix, err := corpusPrefix(row.Input, counter)

View on GitHub (pinned to 27d5a3981a)

Solutions

  1. Check len(corpus.Rows) before analysis and report which filter emptied it
  2. Fix the upstream RunCorpus/BuildCorpusTrace 'invalid corpus' guard ordering so empty corpora never reach analysis
  3. Log per-filter row counts in your corpus preparation pipeline

Example fix

// before
summary, err := analyzeCorpus(corpus, counter) // empty rows

// after
if len(corpus.Rows) == 0 {
    return CorpusSummary{}, fmt.Errorf("corpus empty after filters; check session/date filters")
}
summary, err := analyzeCorpus(corpus, counter)
Defensive patterns

Strategy: validation

Validate before calling

if len(corpus.Rows) == 0 {
    return errors.New("corpus has no rows; cannot analyze sessions")
}
summary, err := analyzeCorpus(corpus, counter)

Type guard

func hasRows(c AgentCorpus) bool { return len(c.Rows) > 0 }

Prevention

When it happens

Trigger: An AgentCorpus with zero Rows reaching analyzeCorpus (called from RunCorpus after its own guard, or directly in tests/internal paths). Any rows at all would produce at least one session, so the map ends empty only with no input.

Common situations: Corpus filtering step removed all rows (date range, session filter, provider filter); upstream empty-rows guard bypassed by calling internal analysis directly; test fixture with an empty rows array.

Related errors


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/57e50fc231a9e263. Report an issue: GitHub.