JuliusBrussee/caveman · error

session-value feature %q bounds invalid

Error message

session-value feature %q bounds invalid

What it means

ValidateSessionValueArtifact found a feature whose declared bounds in the artifact are not a valid finite interval (min must be finite and <= max). The feature spec is structurally malformed, so the artifact cannot be trusted for prediction because feature clamping and missing-value synthesis depend on those bounds.

Source

Thrown at proxy/routing/session_value.go:202

		return errors.New("session-value artifact rollback lineage invalid")
	}
	if !finite(artifact.QualityUncertaintyZ) || artifact.QualityUncertaintyZ <= 0 || artifact.QualityUncertaintyZ > 5 ||
		!finite(artifact.MaxInversePropensity) || artifact.MaxInversePropensity < 1 || artifact.MaxInversePropensity > 100 {
		return errors.New("session-value artifact confidence policy invalid")
	}
	featureNames := SessionValueFeatureNames()
	if len(artifact.FeatureSpecs) != len(featureNames) || len(artifact.Actions) == 0 {
		return errors.New("session-value artifact has no features or actions")
	}
	for i, spec := range artifact.FeatureSpecs {
		if spec.Name != featureNames[i] || (i > 0 && artifact.FeatureSpecs[i-1].Name >= spec.Name) {
			return errors.New("session-value artifact feature vocabulary or order invalid")
		}
		if spec.Name == "turn_index" && !spec.Required {
			return errors.New("session-value artifact must require turn_index")
		}
		if !finite(spec.Mean) || !finite(spec.Scale) || spec.Scale <= 0 || !finite(spec.Min) || !finite(spec.Max) || spec.Min < 0 || spec.Max < spec.Min {
			return fmt.Errorf("session-value feature %q bounds invalid", spec.Name)
		}
	}
	seenActions := map[string]struct{}{}
	artifactPool := make([]Candidate, 0, len(artifact.Actions))
	for i, action := range artifact.Actions {
		wantID := CandidateActionID(Candidate{Provider: action.Provider, Model: action.Model, Effort: action.Effort})
		if wantID == "" || action.ActionID != wantID || (i > 0 && artifact.Actions[i-1].ActionID >= action.ActionID) {
			return errors.New("session-value artifact action identity or order invalid")
		}
		if _, duplicate := seenActions[action.ActionID]; duplicate {
			return errors.New("session-value artifact duplicate action")
		}
		seenActions[action.ActionID] = struct{}{}
		artifactPool = append(artifactPool, Candidate{Provider: action.Provider, Model: action.Model, Effort: action.Effort})
		if !finite(action.RewardEffectiveSampleSize) || action.RewardEffectiveSampleSize <= 0 ||
			!finite(action.CostEffectiveSampleSize) || action.CostEffectiveSampleSize <= 0 ||
			!probabilityMetric(action.QualityCalibrationError) || !probabilityMetric(action.RewardBrierScore) ||
			!finite(action.RewardCalibrationIntercept) || !finite(action.RewardCalibrationSlope) || action.RewardCalibrationSlope <= 0 || action.RewardCalibrationSlope > 10 {

View on GitHub (pinned to 766dce6b13)

Solutions

  1. Regenerate the artifact with correct finite [min,max] bounds for every feature
  2. Reject the artifact and fall back to the previous known-good one
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at proxy/routing/session_value.go:202 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/65c5b77fb4246451. Report an issue: GitHub.