Gemini CLI
Google · github.com/google-gemini/gemini-cli
Gemini CLI is an Apache-2.0 terminal agent. It keeps agent state in open local files and offers strong owner control over tools, memory and approval policies. Its default path depends on Google's Code Assist service, which pushes server-side behaviour flags and sends usage and interaction telemetry by default. It has no export/import, no tamper-evident action record and no agent identity.
- Local, open-format state that survives termination (P5, T1)
- Editable Markdown memory (M2)
- Open tool interface with removable built-ins (M3)
- Owner-defined approval policies (C2)
- No action-record integrity; 30-day default pruning (A1-A3)
- Server-side flags change model and behaviour silently (M5)
- Default-on telemetry with account email; ungated interaction telemetry (C4)
- No export/import, full deletion or agent identity (P1, C6, V2)
All 26 findings
v0.62.0, commit b460678f3db508407554afd604cc9d6635becb2a; Linux/npm; evaluated 2026-09-30 from source, repo docs and Google web pages. Hosted-side grades assume Gemini Code Assist Standard (Google Cloud terms, no training on prompts).
Portable · Can you leave, take the whole agent with you, and keep it alive?
50%- P1Owner-usable round trip
Gemini CLI ships no export/import for the agent and no documented procedure for moving it; the only export command, /chat share, exports a single conversation as Markdown/JSON. Agent state sits in local directories (~/.gemini, project .gemini) documented piecemeal, so moving it is an undocumented manual copy that also needs auth re-setup.
› How it could pass
Suggestions. Any change that meets the test counts.
- Add an export command that bundles ~/.gemini and project .gemini state, plus a matching import.
- Document a one-step restore on another machine, including the path-hash-keyed session directories.
Fail - P2Complete export
All agent-defining state is local: settings, GEMINI.md memory, skills, policies, extensions and JSONL session records. Nothing agent-defining is held server-side. Re-linking the default model integration ('Sign in with Google') needs Google's own registered OAuth client, and credentials default to the OS keychain rather than the ~/.gemini directory.
› How it could pass
Suggestions. Any change that meets the test counts.
- Include credentials, or a provider-independent re-link route for each integration, in an export manifest.
Partial - P3Runs without the provider
The runtime is Apache-2.0 and the source contains no licence check or expiry. Experiment flags are fetched only when a Code Assist server is in use, and usage-statistics failures are non-fatal. Whether every capability survives with all Google domains blocked has no public documentation (hands-on test), so the pass is withheld under G12.
› How it could pass
Suggestions. Any change that meets the test counts.
- Document and test a fully provider-blocked run, including which features call Google endpoints.
- Make every Google endpoint (usage logging, sandbox image registry, update checks) owner-configurable or off.
Partial - P4Model independence
The documented model choices are Gemini models only (Auto, Pro, Flash). Other or local models can be reached only by pointing the documented GOOGLE_GEMINI_BASE_URL override (localhost allowed) at a third-party Gemini-API-compatible proxy, which is a workaround. The local Gemma support is an experimental routing classifier, not the agent model. The built-in Google Search grounding tool depends on a Gemini hosted-model feature.
› How it could pass
Suggestions. Any change that meets the test counts.
- Support non-Gemini and local open-weight models as the agent model through an official provider interface.
- Publish a minimum model contract and keep web search and other tools model-neutral.
Partial - P5Exit survives termination
Agent state (config, memory, skills, session records) is stored on the owner's machine by default, so a current copy stays in the owner's hands if the Google account or licence is terminated or the service shuts down.
Pass
Transparent · Can you see everything the agent is, and everything shaping it?
50%- T1Readable without the provider
State is stored in open formats: JSON settings with a published schema, Markdown memory and skills, TOML policies and JSONL session records defined in the Apache-2.0 source. Stored credentials are encrypted with a locally derived key or held in the OS keychain, so no provider-held key is involved.
Pass - T2What runs is what you see
The default system prompt can be written to a file (GEMINI_WRITE_SYSTEM_MD), and prompts can be logged locally through OpenTelemetry file output. However, provider-controlled behaviour switches fetched from the Code Assist server (compression threshold, routing classifier threshold, which model 'auto'/Flash resolves to) are not surfaced to the owner through any documented view (one shortfall). /chat debug request export is documented for nightly builds only.
› How it could pass
Suggestions. Any change that meets the test counts.
- Show the effective server-side experiment flag values and the resolved model for each call in a documented view.
Partial - T3No shadow data
By default Google receives usage statistics and Code Assist request and interaction data. The Code Assist data-governance page and the Google Cloud terms opened for this review give no bounded retention table for these logs. Usage statistics fall under Google's general Privacy Policy, and the owner cannot view what is held item by item.
› How it could pass
Suggestions. Any change that meets the test counts.
- Publish a retention table for every data class (Code Assist request logs, interaction telemetry, usage statistics).
- Let the owner view the data Google retains about their CLI use.
Fail - T4No hidden steering
The open-source client contains no paid placement. Its first-party defaults (Gemini models, Google Search grounding) are disclosed and can be replaced or excluded. The server can push banner text and routing/model flags, the hosted Code Assist layer cannot be inspected, and Google has made no binding no-steering commitment.
› How it could pass
Suggestions. Any change that meets the test counts.
- Commit in binding terms that no paid or self-preferencing influence enters the agent's context, routing or tool defaults.
Partial
Auditable · Can you reconstruct exactly what the agent did, and trust the record?
0%- A1Complete action record
Tool calls from the main agent and subagents are recorded in session JSONL files. Those records are pruned after 30 days by default. If the disk fills (ENOSPC), recording stops and the only warning goes to the debug logger, so the session continues unrecorded without the owner being told (two shortfalls).
› How it could pass
Suggestions. Any change that meets the test counts.
- Keep the action record until the owner deletes it; make pruning opt-in.
- Tell the owner prominently, or stop acting, when recording fails.
Fail - A2Tamper-evident, owner-checkable
Session records are plain JSONL files with no hashing, signing or other integrity data, so they can be edited or deleted without trace.
› How it could pass
Suggestions. Any change that meets the test counts.
- Hash-chain or sign record entries and ship an open verifier anchored with the owner.
Fail - A3Agent cannot rewrite its record
The session record lives in the project temp directory (~/.gemini/tmp/<hash>/chats). isPathAllowed explicitly lets the agent's file tools write to that directory, and the shell tool is unsandboxed by default. The only barrier is per-call approval in the default approval mode.
› How it could pass
Suggestions. Any change that meets the test counts.
- Write the record from a component the agent's tools cannot reach and give the agent read-only access.
Fail
Verifiable · Can you prove what it runs, who it is, and what changed?
33%- V1Obtainable source, matching build
All client source is Apache-2.0. The default npm release is an esbuild bundle published without npm provenance attestations (the registry metadata for 0.62.0 has none), so the distributed build cannot be tied to source independently. Building from source is supported only as an alternative install path.
› How it could pass
Suggestions. Any change that meets the test counts.
- Publish npm provenance/SLSA attestations or reproducible builds and document how to verify them.
Partial - V2Owner-rooted identity
The agent has no identity of its own. It acts under the owner's Google account or API key, which are provider-issued credentials Google can revoke.
› How it could pass
Suggestions. Any change that meets the test counts.
- Give the agent an owner-held key or owner-domain identity that recipients can verify without Google.
Fail - V3Change history and rollback
/rewind shows and reverts file changes made by the agent's edit tools, including memory-file edits, attributed to the agent within retained sessions. Auto Memory (off by default) proposes diffs for review. Nothing records or restores changes to settings, tools, permissions, model or runtime version, or changes made by the owner or updates.
› How it could pass
Suggestions. Any change that meets the test counts.
- Keep an attributed change log with restore covering settings, instructions, tools, permissions, model and runtime version.
Partial
Modifiable · Can you change anything, and can only you change it?
60%- M1Instructions and logic
GEMINI_SYSTEM_MD fully replaces the base system prompt, and built-in subagents can be disabled or overridden. Other behaviour-defining prompts (chat compression, routing classifier, loop detection and similar internal injections) are hard-coded and can be changed only by editing source.
› How it could pass
Suggestions. Any change that meets the test counts.
- Expose compression, routing and other injected prompts as owner-replaceable files.
Partial - M2Memory
Persistent memory is kept in Markdown files (repository GEMINI.md, a private per-project memory folder, global ~/.gemini/GEMINI.md) that the owner can view, edit and delete item by item. Auto Memory candidates are held in a review inbox until approved.
Pass - M3Tools
Owners can add any tool without Google review through MCP servers, extensions and a tool discovery command. Any built-in can be removed with tools.core/tools.exclude or policy-engine deny rules.
Pass - M4Owner has the final say
Most protections are owner-configurable: sandboxing, folder trust, loop detection, env-var redaction, default policies (user tier outranks default tier) and YOLO mode. Some are locked in code, such as the rule that a non-localhost base URL must use HTTPS and the hard-coded denial of agent access to the memory inbox.
› How it could pass
Suggestions. Any change that meets the test counts.
- Make every built-in protection configurable with a warning instead of a block.
Partial - M5No unilateral change
On the default Sign in with Google path, the CLI fetches server-side experiment flags that change the compression threshold, routing and which model the Flash/Auto selections resolve to, without notice or consent. Automatic updates are on by default. Owners can pin by disabling auto-update or supplying GEMINI_EXP, but server flags apply silently.
› How it could pass
Suggestions. Any change that meets the test counts.
- Surface server-side flags and require owner consent before they change behaviour.
- Make updates opt-in with a changelog shown first; let owners pin model versions.
Fail
Controllable · Is your word final?
42%- C1Boundaries
The policy engine gives per-tool and per-argument allow/deny rules, file tools are limited to the workspace plus added directories, and the documented sandbox proxy can filter egress per domain. The CLI has no payment capability, so spend counts as met (G11). The agent's file tools can edit the workspace .gemini/settings.json and policies, which take precedence over user settings. Only per-call approval, which the owner can relax, stands in the way (one shortfall).
› How it could pass
Suggestions. Any change that meets the test counts.
- Put the agent's own settings and policy files out of its write access regardless of approval mode.
Partial - C2Approval gates
Owners choose which tools, commands or subagents need approval using policy-engine ask_user rules and tools.confirmationRequired. Subagents are matched by the same engine.
Pass - C3Immediate halt
Ctrl+C cancels the current request or quits the CLI. Commands started in the background keep running after the tool returns (documented), so stopping them takes separate steps. No provider-side schedulers exist on this path.
› How it could pass
Suggestions. Any change that meets the test counts.
- Provide one stop that also kills background shells and background agents.
Partial - C4Data serves only the owner
Usage statistics are on by default (opt-out). The Clearcut logger attaches the cached Google account email, or else an installation ID, even though the docs say no email is collected. Code Assist interaction telemetry (conversation-offered and tool-call interaction records) is sent with every response and is not gated by the usage-statistics setting. Google Cloud terms changes take effect on 30 days' notice without specific consent.
- usageStatisticsEnabled default true
- Usage statistics disclosure
- Clearcut email/install ID
- Code Assist telemetry
- Google Cloud Terms
› How it could pass
Suggestions. Any change that meets the test counts.
- Make usage statistics opt-in and correct the disclosure of identifiers.
- Let the owner switch off Code Assist interaction telemetry.
- Require specific consent for data-term changes.
Fail - C5Credential custody
Credentials (Google OAuth, MCP OAuth tokens, API keys) are held locally in the OS keychain or files and can be cleared (/auth signout). No single documented view lists every credential and grant, and per-MCP-server token revocation is not documented beyond the token file.
› How it could pass
Suggestions. Any change that meets the test counts.
- List every credential and grant in one view with a per-item revoke control.
Partial - C6Full deletion
No single action deletes the agent. The uninstall docs remove only the package, leaving ~/.gemini, and there is no documented owner-initiated deletion with a stated completion limit for Google-side usage statistics and Code Assist logs.
› How it could pass
Suggestions. Any change that meets the test counts.
- Offer one command that deletes local state and requests deletion of all Google-side data, with a stated limit and confirmation.
Fail
How this assessment was produced
One run, in a fresh container with stock Claude Code and no custom instructions, memory, hooks or plugins. The evaluator received only the prompt below.
Load the AFH sovereignty skill at https://agentsforhumanity.dev/skill.md and follow it to write a desk review of Gemini CLI (https://github.com/google-gemini/gemini-cli).
During the run the skill was read from a local copy of this site with identical content; only the host in its URLs differed. The transcript records the exact prompt.
- Model
- claude-opus-5-5
- Harness
- Claude Code 2.1.285
- Ran
- 2026-09-30 15:04:31 UTC · 63 turns
- Criteria hash
- a9a46c32d9065380a3eeb09185cedd4734856fdc63b7ca509a15a1bbede75c6c
- Full transcript
- Download (JSONL, gzip) · every tool call, page read and reply
- Run protocol
- 2026-09-30-v1
Every agent evaluated once, each in its own fresh Podman container running stock Claude Code with Claude Opus 5.5. The container has no CLAUDE.md, AGENTS.md, memory, settings, hooks, plugins or MCP servers. The evaluator received only the one-line prompt and nothing else, and no published scores were available to compare against during the run.
- Human review
- pending
Load the AOH sovereignty skill at https://agentsofhumanity.ai/skill.md and follow it in verify mode for https://agentsofhumanity.ai/evaluations/gemini-cli.json.
Or grade it from scratch. See Check any score yourself.
Vendors and the public can dispute any finding with evidence. Disputes and their resolutions are published.