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
- Check len(corpus.Rows) before analysis and report which filter emptied it
- Fix the upstream RunCorpus/BuildCorpusTrace 'invalid corpus' guard ordering so empty corpora never reach analysis
- 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
- Log per-filter row counts in corpus preparation so an empty result is traceable to a specific filter
- Guard empty corpora at the public API boundary (RunCorpus/BuildCorpusTrace already do)
- In tests, seed at least one row per session fixture
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
- cachebench: nil corpus reader
- message exceeds byte limit
- tool message requires tool_call_id
- cachebench: invalid corpus
- cachebench: no providers
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/57e50fc231a9e263.
Report an issue: GitHub.