{"record":{"id":"d12c9cdabaa72faf","repo":"chenhg5/cc-connect","slug":"geminisession-start-w","errorCode":null,"errorMessage":"geminiSession: start: %w","messagePattern":"geminiSession: start: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent/gemini/session.go","lineNumber":194,"sourceCode":"\tcmd.WaitDelay = 1 * time.Second\n\tcmd.Dir = gs.workDir\n\tenv := os.Environ()\n\tif len(gs.extraEnv) > 0 {\n\t\tenv = core.MergeEnv(env, gs.extraEnv)\n\t}\n\tcmd.Env = env\n\tcmd.Stdin = strings.NewReader(fullPrompt)\n\n\tstdout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"geminiSession: stdout pipe: %w\", err)\n\t}\n\n\tvar stderrBuf bytes.Buffer\n\tcmd.Stderr = &stderrBuf\n\n\tif err := cmd.Start(); err != nil {\n\t\treturn fmt.Errorf(\"geminiSession: start: %w\", err)\n\t}\n\n\tstarted = true\n\tgs.wg.Add(1)\n\tgo func() {\n\t\tdefer cancel()\n\t\tgs.readLoop(ctx, cmd, stdout, &stderrBuf, append(imageRefs, fileRefs...))\n\t}()\n\n\treturn nil\n}\n\nfunc (gs *geminiSession) readLoop(ctx context.Context, cmd *exec.Cmd, stdout io.ReadCloser, stderrBuf *bytes.Buffer, tempImages []string) {\n\tdefer gs.wg.Done()\n\tdefer func() {\n\t\t// Clean up temp image files\n\t\tfor _, f := range tempImages {\n\t\t\tos.Remove(f)","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/agent/gemini/session.go#L176-L212","documentation":"After wiring stdin/stdout/stderr, Send calls cmd.Start() to launch the gemini CLI; failure is wrapped as `geminiSession: start: %w`. Unlike New()'s LookPath check, this fires when the binary was found but could not actually be executed.","triggerScenarios":"cmd.Start() returns an error: binary removed from PATH after construction, exec format error (wrong architecture/corrupt install), missing interpreter shebang, noexec mount, or fork/exec resource limits.","commonSituations":"nvm/version-manager switched node versions so the gemini shim is broken; npm global update replaced the binary mid-flight; binary installed for another OS/arch; /usr mounted noexec; EAGAIN from fork limits under heavy load.","solutions":["Run the wrapped inner error down: test `gemini --version` as the same user","Reinstall the CLI (`npm i -g @google/gemini-cli`) if the binary is corrupt or arch-mismatched","Fix shebang/interpreter issues (ensure `node` is on PATH for the shim script)","Check mount flags (noexec) and process/fork limits if the errno is EACCES/EAGAIN"],"exampleFix":"// before\n$ file $(which gemini)\ngemini: ELF 64-bit ... (aarch64)   # on x86_64 host\n// after\n$ npm i -g @google/gemini-cli\n$ gemini --version","handlingStrategy":"try-catch","validationCode":"// deeper than LookPath: verify the binary actually executes\nout, err := exec.Command(\"gemini\", \"--version\").CombinedOutput()\nif err != nil { return fmt.Errorf(\"gemini CLI broken (%v): %s\", err, out) }","typeGuard":null,"tryCatchPattern":"if err := sess.Send(prompt, id, nil, nil); err != nil && strings.Contains(err.Error(), \"start:\") {\n  var ee *exec.Error\n  if errors.As(err, &ee) { log.Printf(\"exec failed for %q: %v\", ee.Name, ee.Err) }\n}","preventionTips":["Pin and verify the CLI version at daemon startup (doctor check)","Avoid version-manager shims on the daemon's PATH; use absolute node/npm paths","Ensure mounts hosting the binary are not noexec and match the host architecture"],"tags":["process","exec","cli","gemini-agent"],"backgroundTag":"command-not-found","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"}