This week's changes are about checks that answered a slightly different question from the one they were meant to answer. We read the pull requests and commits and ran none of the code.
Gemini CLI v0.69.0-preview.0
Published on November 10, 2026 as a prerelease, this version carries several path fixes.
- A prefix is not a parent. Pull request #30160 replaces
canonicalPath.startsWith(homeDir)in the custom theme loader, which is meant to accept only theme files inside the home directory. With home at/home/al, a file at/home/albert/theme.jsonpassed, because the string starts the same way. The opposite also failed: on Windows and macOS, valid paths with different letter case were rejected. The fix uses the existingisSubpath()helper, which compares path segments. - The same mistake in display. Pull request #30124 fixes
tildeifyPath(), which turned/Users/albert/projinto~bert/projwhen the home directory was/Users/al. It now replaces the home prefix only at a path-separator boundary, and leaves filesystem roots alone. - Trust and the sandbox. Pull request #30164 notes that the macOS Seatbelt profiles deny the sandboxed process access to
~/.gemini/trustedFolders.json, so the trust dialog "could neither see existing trust decisions nor save new ones". Every launch asked again and any answer failed with exit code 52. Trust is now decided in the parent process before the sandbox starts and passed in, while the sandbox still cannot read or write the file. The pull request says Docker and Podman may need a similar change. - Empty is not unset. Pull request #30250, merged on November 11 after the prerelease, makes
${VAR:-default}use the default when a variable is set but empty, as in a CI file withAPI_BASE=, matching shell behaviour.
ADK Python: no score beats a partial score
A November 11 commit to ADK Python changes the hallucinations_v1 evaluator. When the sentence validator's reply does not give exactly one usable label per sentence, in order, "the response now gets no score". Before, "it got a score over the labelled subset". An invocation or eval case with any unscored response is now NOT_EVALUATED instead of passing on its remaining responses. The change is after the v2.14.0 release, so it is not yet released.
What remains uncertain. None of the pull requests describe real-world misuse, and the theme check guards a low-risk feature. Prerelease and unreleased changes may change before a stable release.
Analysis: Search your own code for startsWith on paths, especially in allow checks, and use a segment-aware comparison that handles case on Windows and macOS. If Dinky's evaluation suite at Belgavi's Book Store grades refund answers sentence by sentence, treat a judge that skipped sentences as a failed measurement, not a smaller passing sample, and count those cases separately so they are not hidden in the average.
Sources and evidence
- Gemini CLI v0.69.0-preview.0 release notes (GitHub, November 10)
- fix(cli): use isSubpath for theme file home-directory check (gemini-cli #30160)
- fix(core): require path-separator boundary in tildeifyPath (gemini-cli #30124)
- fix(cli): resolve folder trust before entering the macOS Seatbelt sandbox (gemini-cli #30164)
- fix(cli): apply default in ${VAR:-default} when variable is set but empty (gemini-cli #30250)
- fix: do not score hallucinations_v1 responses with unlabelled sentences (ADK Python)
Gemini CLI v0.69.0-preview.0 replaces a startsWith home-directory check that a sibling folder like /home/albert could pass, fixes the same prefix bug in path display, and decides folder trust before the macOS sandbox starts. An unreleased ADK Python change marks half-labelled hallucination checks as NOT_EVALUATED. Compare paths by segment and treat incomplete judgments as failures.