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
- Align the feature-producer version with the artifact version so the state map only emits vocabulary features
- 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.