JuliusBrussee/caveman · error

session-value feature %q outside artifact bounds

Error message

session-value feature %q outside artifact bounds

What it means

A feature value in the runtime state falls outside the [min,max] bounds declared for it in the artifact's FeatureSpecs. Because clamping assumptions baked into the model would silently distort such inputs, sessionValueVector fails closed instead of clamping, indicating extractor drift or an artifact trained on a different value distribution.

Source

Thrown at proxy/routing/session_value.go:425

func sessionValueVector(specs []SessionValueFeatureSpec, state map[string]SessionValueFeatureValue) ([]float64, []float64, error) {
	for name := range state {
		if _, known := sessionValueFeatureVocabulary[name]; !known {
			return nil, nil, fmt.Errorf("unknown session-value feature %q", name)
		}
	}
	values := make([]float64, len(specs))
	missing := make([]float64, len(specs))
	for i, spec := range specs {
		feature, present := state[spec.Name]
		if !present || !feature.Available {
			if spec.Required {
				return nil, nil, fmt.Errorf("required session-value feature %q unavailable", spec.Name)
			}
			missing[i] = 1
			continue
		}
		if !finite(feature.Value) || feature.Value < spec.Min || feature.Value > spec.Max {
			return nil, nil, fmt.Errorf("session-value feature %q outside artifact bounds", spec.Name)
		}
		values[i] = (feature.Value - spec.Mean) / spec.Scale
	}
	return values, missing, nil
}

func sessionValueEligibilityReason(features Features, candidate Candidate, baselineUnit float64, policy FrontierPolicy) string {
	if candidate.Provider == "" || candidate.Model == "" || unitPrice(candidate.Price) <= 0 {
		return "unpriced_or_invalid_candidate"
	}
	if !policy.AllowCrossProvider && candidate.Provider != features.Provider {
		return "cross_provider_disabled"
	}
	if !candidateSupports(candidate, features) {
		return "capability_or_context_mismatch"
	}
	return policyRejectReason(features, candidate, baselineUnit, policy)
}

View on GitHub (pinned to 766dce6b13)

Solutions

  1. Regenerate the artifact with bounds covering the current feature distribution
  2. Fix the feature extractor if it is emitting values outside its intended range
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at proxy/routing/session_value.go:425 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@766dce6b13 (2026-08-18). Data as JSON: /api/errors/73eea94d6e704c80. Report an issue: GitHub.