JuliusBrussee/caveman · error

unknown session-value feature %q

Error message

unknown session-value feature %q

What it means

sessionValueVector encountered a feature name in the runtime state map that is not in sessionValueFeatureVocabulary — the fixed vocabulary of known session-value features. The state carries a feature the loaded artifact generation does not know about, signaling a version skew between the feature producer and the policy artifact.

Source

Thrown at proxy/routing/session_value.go:410

	costUCBResidual = math.Max(residualCost, costUCBResidual)
	prediction := SessionValuePrediction{
		ActionID: model.ActionID, RewardProbability: reward, QualityLCB: lcb,
		ExpectedResidualCostUSD: residualCost, ExpectedCostUSD: immediate + transition + residualCost,
		CostUCBUSD: immediate + transition + costUCBResidual, ExpectedCorrectiveTurns: corrections,
		EscalationProbability: escalation, QualityUncertainty: qualityError,
	}
	for _, value := range []float64{prediction.RewardProbability, prediction.QualityLCB, prediction.ExpectedResidualCostUSD, prediction.ExpectedCostUSD, prediction.CostUCBUSD, prediction.ExpectedCorrectiveTurns, prediction.EscalationProbability, prediction.QualityUncertainty} {
		if !finite(value) || value < 0 {
			return SessionValuePrediction{}, errors.New("session-value prediction non-finite")
		}
	}
	return prediction, nil
}

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
	}

View on GitHub (pinned to 766dce6b13)

Solutions

  1. Align the feature-producer version with the artifact version so the state map only emits vocabulary features
  2. Deploy an artifact whose vocabulary includes the new feature before enabling the producer that emits it
Defensive patterns

Strategy: validation

When it happens

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