{"record":{"id":"73f7ee528bc4c80e","repo":"chenhg5/cc-connect","slug":"antigravity-invalid-permission-behavior-q","errorCode":null,"errorMessage":"antigravity: invalid permission behavior %q","messagePattern":"antigravity: invalid permission behavior %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent/antigravity/permission_bridge.go","lineNumber":310,"sourceCode":"func formatAgyToolInput(input map[string]any) string {\n\tif command, _ := input[\"CommandLine\"].(string); strings.TrimSpace(command) != \"\" {\n\t\treturn command\n\t}\n\tdata, err := json.MarshalIndent(input, \"\", \"  \")\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"%v\", input)\n\t}\n\treturn string(data)\n}\n\nfunc (b *agyPermissionBridge) writeResponse(conn net.Conn, response antigravityhook.BridgeResponse) {\n\t_ = json.NewEncoder(conn).Encode(response)\n}\n\nfunc (b *agyPermissionBridge) RespondPermission(requestID string, result core.PermissionResult) error {\n\tbehavior := strings.ToLower(strings.TrimSpace(result.Behavior))\n\tif behavior != \"allow\" && behavior != \"deny\" {\n\t\treturn fmt.Errorf(\"antigravity: invalid permission behavior %q\", result.Behavior)\n\t}\n\tresult.Behavior = behavior\n\n\tb.pendingMu.Lock()\n\tch := b.pending[requestID]\n\tb.pendingMu.Unlock()\n\tif ch == nil {\n\t\treturn fmt.Errorf(\"antigravity: unknown permission request %q\", requestID)\n\t}\n\tselect {\n\tcase ch <- result:\n\t\treturn nil\n\tdefault:\n\t\treturn fmt.Errorf(\"antigravity: permission request %q is already resolved\", requestID)\n\t}\n}\n\nfunc (b *agyPermissionBridge) Close() {","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/agent/antigravity/permission_bridge.go#L292-L328","documentation":"RespondPermission validates that the PermissionResult.Behavior is exactly 'allow' or 'deny' (case-insensitive, trimmed) and rejects anything else. This guards the bridge from forwarding malformed decisions to the agy CLI, which would produce undefined behavior downstream.","triggerScenarios":"Calling RespondPermission(requestID, core.PermissionResult{Behavior: \"allowed\"/\"yes\"/\"\"/...}) — any string other than allow/deny after ToLower+TrimSpace.","commonSituations":"Platform adapters mapping button labels to behaviors incorrectly; UI code passing 'Allow' with trailing whitespace (handled) or synonyms like 'yes'/'approve' (not handled); empty Behavior field left unset.","solutions":["Set result.Behavior to exactly \"allow\" or \"deny\" before calling RespondPermission.","Normalize your platform-side button values through strings.ToLower(strings.TrimSpace(...)) before constructing PermissionResult.","Map alternative labels (yes/approve → allow; no/reject → deny) at the call site.","If Behavior comes from config, validate allowed values at startup."],"exampleFix":"// before\nresult := core.PermissionResult{Behavior: \"yes\"}\n// after\nbehavior := \"yes\"\nif behavior == \"yes\" || behavior == \"approve\" { behavior = \"allow\" }\nresult := core.PermissionResult{Behavior: behavior}","handlingStrategy":"validation","validationCode":"func validBehavior(b string) bool {\n    switch strings.ToLower(strings.TrimSpace(b)) {\n    case \"allow\", \"deny\":\n        return true\n    }\n    return false\n}","typeGuard":null,"tryCatchPattern":"if err := bridge.RespondPermission(id, result); err != nil && strings.Contains(err.Error(), \"invalid permission behavior\") {\n    slog.Error(\"bad permission behavior\", \"behavior\", result.Behavior, \"err\", err)\n}","preventionTips":["Constrain platform button values to allow/deny at the adapter layer.","Normalize synonyms (yes/approve→allow, no/reject→deny) before constructing PermissionResult.","Never construct PermissionResult from raw user text without mapping."],"tags":["go","validation","permission","antigravity"],"backgroundTag":"invalid-enum-value","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}