JuliusBrussee/caveman · error

cachebench: trace request %q has invalid prefix

Error message

cachebench: trace request %q has invalid prefix

What it means

A trace record's prefix metadata is inconsistent: StableSegmentCount is negative or exceeds len(Prefix), or the Prefix array itself fails validPrefix. Prefix and StableSegmentCount drive cache-reuse math, so an impossible combination is rejected before evaluation.

Source

Thrown at cacheengine/cachebench/observed.go:52

	if err := validateObservationRecords(records); err != nil {
		return Report{}, err
	}
	if len(records) != len(trace) {
		return Report{}, fmt.Errorf("cachebench: observation population %d does not match trace population %d", len(records), len(trace))
	}
	byID := make(map[string]TraceRecord, len(trace))
	for index, request := range trace {
		if request.Schema != TraceSchema && request.Schema != TraceSchemaV2 || strings.TrimSpace(request.RequestID) == "" {
			return Report{}, fmt.Errorf("cachebench: trace request %d has invalid schema or request_id", index)
		}
		if _, exists := byID[request.RequestID]; exists {
			return Report{}, fmt.Errorf("cachebench: duplicate trace request %q", request.RequestID)
		}
		if strings.TrimSpace(request.Provider) == "" || strings.TrimSpace(request.Epoch) == "" || !validUniqueJSONObject(request.Body) || request.BodySHA256 == "" || request.BodySHA256 != bodyDigest(request.Body) {
			return Report{}, fmt.Errorf("cachebench: trace request %q has invalid identity, body, or digest", request.RequestID)
		}
		if request.StableSegmentCount < 0 || request.StableSegmentCount > len(request.Prefix) || !validPrefix(request.Prefix) {
			return Report{}, fmt.Errorf("cachebench: trace request %q has invalid prefix", request.RequestID)
		}
		byID[request.RequestID] = request
	}
	for _, record := range records {
		request, exists := byID[record.RequestID]
		if !exists {
			return Report{}, fmt.Errorf("cachebench: observation request %q absent from trace", record.RequestID)
		}
		if record.Provider != request.Provider || record.Epoch != request.Epoch {
			return Report{}, fmt.Errorf("cachebench: observation request %q provider/epoch mismatch", record.RequestID)
		}
		if record.RequestBodySHA256 == "" || record.RequestBodySHA256 != request.BodySHA256 {
			return Report{}, fmt.Errorf("cachebench: observation request %q body digest mismatch", record.RequestID)
		}
	}
	report, err := EvaluateObserved(records, target)
	if err != nil {
		return Report{}, err

View on GitHub (pinned to 27d5a3981a)

Solutions

  1. Set stable_segment_count to a value in [0, len(prefix)] — typically the number of leading stable segments.
  2. Regenerate the trace with the current version so prefix segments match validPrefix's expected shape.
  3. Validate prefix arrays with the package's own helpers in a pre-flight pass before evaluation.
Defensive patterns

Strategy: validation

Validate before calling

func validTracePrefix(r TraceRecord) error {
	if r.StableSegmentCount < 0 || r.StableSegmentCount > len(r.Prefix) || !validPrefix(r.Prefix) {
		return fmt.Errorf("request %q has invalid prefix", r.RequestID)
	}
	return nil
}

Type guard

func prefixInRange(count, prefixLen int) bool {
	return count >= 0 && count <= prefixLen
}

Prevention

When it happens

Trigger: EvaluateObservedAgainstTrace on a trace record where StableSegmentCount < 0, StableSegmentCount > len(request.Prefix), or the prefix segments are malformed (bad segment shape/content per validPrefix).

Common situations: Trace records written by an older tool version with a different prefix segment schema; hand-adjusted stable_segment_count; prefix arrays truncated during file edits.

Related errors


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