{"record":{"id":"a2b0c4e04c9a8046","repo":"JuliusBrussee/caveman","slug":"session-value-promotion-artifact-has-no-actions","errorCode":null,"errorMessage":"session-value promotion artifact has no actions","messagePattern":"session-value promotion artifact has no actions","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/routing/session_value.go","lineNumber":29,"sourceCode":"\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tSessionValueArtifactSchema               = \"caveman.router.session-value-policy.v1\"\n\tSessionValueStateSchema                  = \"router-state-metadata-v1\"\n\tSessionValueRouterVersion                = \"session-value-v1\"\n\tSessionValuePromotionMinEffectiveSamples = 100\n\tSessionValuePromotionMaxCalibrationError = 0.10\n\tSessionValuePromotionMaxBrierScore       = 0.25\n)\n\n// ValidateSessionValuePromotionEvidence applies evidence floors beyond\n// structural artifact validity. Runtime may evaluate a structurally valid\n// shadow artifact; traffic promotion requires calibrated sample floors.\nfunc ValidateSessionValuePromotionEvidence(artifact SessionValuePolicyArtifact) error {\n\tif len(artifact.Actions) == 0 {\n\t\treturn errors.New(\"session-value promotion artifact has no actions\")\n\t}\n\tfor _, action := range artifact.Actions {\n\t\tif action.RewardEffectiveSampleSize < SessionValuePromotionMinEffectiveSamples ||\n\t\t\taction.CostEffectiveSampleSize < SessionValuePromotionMinEffectiveSamples ||\n\t\t\taction.QualityCalibrationError > SessionValuePromotionMaxCalibrationError ||\n\t\t\taction.RewardBrierScore > SessionValuePromotionMaxBrierScore {\n\t\t\treturn fmt.Errorf(\"session-value action %s lacks promotion evidence\", action.ActionID)\n\t\t}\n\t}\n\treturn nil\n}\n\nvar sessionValueFeatureVocabulary = map[string]struct{}{\n\t\"turn_index\": {}, \"user_turns\": {}, \"subagent_turns\": {}, \"tool_calls\": {},\n\t\"corrective_turns\": {}, \"input_tokens_estimate\": {}, \"tools_count\": {},\n\t\"stream\": {}, \"json_mode\": {}, \"vision\": {}, \"audio\": {},\n\t\"cache_read_tokens\": {}, \"cache_write_tokens\": {}, \"uncached_tokens\": {},\n\t\"cache_age_ms\": {}, \"spent_session_usd\": {}, \"budget_remaining_usd\": {},","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/proxy/routing/session_value.go#L11-L47","documentation":"Error \"session-value promotion artifact has no actions\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at proxy/routing/session_value.go:29 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include at least one action in the session-value promotion artifact."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}