{"record":{"id":"06cde5d0ed5fd519","repo":"JuliusBrussee/caveman","slug":"native-runtime-unknown-policy-mode-q","errorCode":null,"errorMessage":"native runtime: unknown policy mode %q","messagePattern":"native runtime: unknown policy mode %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/internal/nativeruntime/runtime.go","lineNumber":225,"sourceCode":"\tsessionLock := r.sessionLock(request.Session.ID)\n\tsessionLock.Lock()\n\tdefer sessionLock.Unlock()\n\n\tif request.ProtocolVersion != ProtocolVersion {\n\t\treturn Response{}, fmt.Errorf(\"native runtime: unsupported protocol version %d\", request.ProtocolVersion)\n\t}\n\tif _, ok := eventTypes[request.Event.Type]; !ok {\n\t\treturn Response{}, fmt.Errorf(\"native runtime: unknown event %q\", request.Event.Type)\n\t}\n\tif strings.TrimSpace(request.Session.ID) == \"\" {\n\t\treturn Response{}, errors.New(\"native runtime: session id is required\")\n\t}\n\tpolicyMode := request.PolicyMode\n\tif policyMode == \"\" {\n\t\tpolicyMode = \"safe\"\n\t}\n\tif policyMode != \"record\" && policyMode != \"safe\" && policyMode != \"max\" {\n\t\treturn Response{}, fmt.Errorf(\"native runtime: unknown policy mode %q\", policyMode)\n\t}\n\trequest.PolicyMode = policyMode\n\tprofile, features, err := resolveProfile(request.Profile, policyMode)\n\tif err != nil {\n\t\treturn Response{}, err\n\t}\n\trequest.Profile = profile\n\tr.mu.Lock()\n\tr.lastActivity = time.Now()\n\t// Listener lifetime is independent of session bookkeeping. Prune abandoned\n\t// correlation entries lazily so a persistent proxy does not retain them\n\t// forever when a host disappears without session.end.\n\tfor sessionID, activity := range r.activeSessions {\n\t\tif r.lastActivity.Sub(activity.At) >= 30*time.Minute {\n\t\t\tdelete(r.activeSessions, sessionID)\n\t\t}\n\t}\n\tif request.Event.Type == \"session.end\" {","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/proxy/internal/nativeruntime/runtime.go#L207-L243","documentation":"Handle validates request.PolicyMode after defaulting an empty value to \"safe\". Only \"record\", \"safe\", and \"max\" are accepted; any other string is rejected with this error. This keeps policy selection restricted to the supported profiles.","triggerScenarios":"Calling Handle with PolicyMode set to anything other than \"\", \"record\", \"safe\", or \"max\" (e.g. \"strict\", \"SAFE\", \"paranoid\" from config or env).","commonSituations":"Config file or environment variable carrying a policy name from a different tool; case mismatches; user edits to policy settings.","solutions":["Set PolicyMode to one of exactly \"record\", \"safe\", or \"max\"","Fix the config/env value casing and spelling (values are case-sensitive, lowercase)","Leave PolicyMode empty (\"\") to get the default \"safe\" mode"],"exampleFix":"// before\nreq.PolicyMode = \"Strict\"\n// after\nreq.PolicyMode = \"max\" // or \"record\" / \"safe\"","handlingStrategy":"validation","validationCode":"var validModes = map[string]bool{\"\": true, \"record\": true, \"safe\": true, \"max\": true}\nif !validModes[req.PolicyMode] {\n\treturn fmt.Errorf(\"invalid policy mode %q\", req.PolicyMode)\n}","typeGuard":"func validPolicyMode(m string) bool { return m == \"\" || m == \"record\" || m == \"safe\" || m == \"max\" }","tryCatchPattern":null,"preventionTips":["Define policy modes as typed constants, never raw strings from config","Trim and lowercase policy values read from config before sending","Leave PolicyMode unset to rely on the \"safe\" default"],"tags":["validation","config","policy-mode"],"backgroundTag":"invalid-enum-value","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}