Aider
Aider-AI (Paul Gauthier) · github.com/Aider-AI/aider
Aider is an Apache-2.0, local-first terminal coding agent that keeps all state in local plain-text files and git and works with any LiteLLM-supported model, including local ones. The main gaps are the absence of an agent identity, limited tamper evidence and state history, fixed base prompts and approval classes, and opt-in analytics that are preselected 'Yes' for a sampled subset with no disclosed retention.
- Local-first state in readable Markdown/YAML/git with nothing held by the provider (P2, P5, T1)
- Apache-2.0 runtime with no account or licence check (P3)
- Full context logging and effective-settings view (T2)
- No provider-side steering or remote flags (T4, M5)
- No agent identity; attribution is an unauthenticated git label (V2)
- Analytics retention undisclosed and prompt preselects Yes for sampled users (T3, C4)
- Chat-history record has no integrity data and no state versioning/rollback (A2, V3)
- Base prompts, approval classes and shell-command confirmation not owner-changeable (M1, C2, M4)
All 26 findings
aider-chat v0.86.2 (latest PyPI release, 2026-02-12), commit 253f0368b873ba30d8ee26e463718f0c03614ddf; Python CLI on Linux/macOS/Windows; default configuration; browser GUI, Docker image and optional extras not separately graded. Evaluated 2026-09-30.
Portable · Can you leave, take the whole agent with you, and keep it alive?
80%- P1Owner-usable round trip
All agent state is local files (repo-level .aider.* files, ~/.aider/, .aider.conf.yml, .env) whose locations are documented, so it can be copied immediately with no provider approval. There is no export/import feature or documented 'copy this and run it elsewhere' procedure; restoring means reinstalling aider, copying files from several locations (repo and home directory) and re-supplying API keys by hand.
› How it could pass
Suggestions. Any change that meets the test counts.
- Document a single export/restore procedure (or ship an export/import command) covering every aider file in the repo and home directory.
Partial - P2Complete export
Nothing defining the agent is held by the provider: configuration, conventions/instruction files, chat and input history, model settings/metadata overrides, OAuth-obtained OpenRouter key (~/.aider/oauth-keys.env) and git history are all local files. Model API keys are the owner's own and are re-linked by setting environment variables; the OpenRouter onboarding uses OpenRouter's PKCE flow with a localhost callback, and keys can also be set directly. No schedules or identity exist (G11).
Pass - P3Runs without the provider
Runtime is Apache-2.0 with no licence check, account or activation. The only provider-related network calls (PostHog analytics, PyPI version check) are optional and failures are caught; core editing works against any owner-configured model endpoint. Hands-on provider-blocked run not performed (desk review).
Pass - P4Model independence
Any LiteLLM-supported model, including local Ollama/LM Studio open-weight models, can be used, and code editing uses text-based edit formats rather than vendor tool calling. However, /voice is hard-wired to OpenAI's hosted whisper-1 and refuses to start without OPENAI_API_KEY, so voice input is lost off that vendor.
› How it could pass
Suggestions. Any change that meets the test counts.
- Let the owner configure the transcription model/endpoint (including a local Whisper) for /voice.
Partial - P5Exit survives termination
Aider is local-first software with no provider account; all agent state lives on the owner's machine and is unaffected by any provider action or shutdown.
Pass
Transparent · Can you see everything the agent is, and everything shaping it?
75%- T1Readable without the provider
State is Markdown (.aider.chat.history.md), plain-text input history, YAML/JSON config and model settings, dotenv files and git; base prompts and logic are Python source shipped in the package. The repo-map tag cache is derived from source files that remain in the repo. No encryption is used.
Pass - T2What runs is what you see
--llm-history-file logs every message list sent to the LLM (including system prompts and history summaries), --show-prompts prints system prompts, and /settings or --verbose prints effective merged settings plus main/editor/weak model identities. Model aliases resolve through bundled, readable tables; there is no provider-operated context layer.
Pass - T3No shadow data
Aider AI LLC receives analytics events (feature/command use, model names, token counts, errors, with PostHog exception autocapture) tied to a random UUID when analytics is enabled. On a fresh install 10% of users are asked with 'Yes' preselected (G10). The privacy policy and analytics page disclose no retention period for this data. Local item-by-item visibility exists only if the owner sets --analytics-log. Installs that are never asked send nothing.
- analytics.py (10% sample, PostHog)
- main.py (opt-in prompt)
- io.py confirm_ask default='y'
- Aider privacy policy (live, last updated April 12, 2025)
- Aider analytics documentation
› How it could pass
Suggestions. Any change that meets the test counts.
- Publish a bounded retention period for analytics events.
- Or make analytics prompt default to No so the default path holds nothing.
Fail - T4No hidden steering
Source shows no paid placement or sponsored tools. Default model selection is a disclosed, source-visible mapping from the API keys present, and the OpenRouter OAuth offer when no keys exist is disclosed at the prompt and can be declined or replaced by any --model. Aider sets OR_SITE_URL/OR_APP_NAME headers for OpenRouter app attribution, which does not steer the agent's choices.
Pass
Auditable · Can you reconstruct exactly what the agent did, and trust the record?
67%- A1Complete action record
Every user input, assistant reply, tool message (including 'Running <command>', applied edits, confirmations) is appended to .aider.chat.history.md, which is not pruned. LLM file edits are auto-committed to git with full diffs by default. A write failure prints a warning to the owner. There are no schedules or provider-side actions (G11).
Pass - A2Tamper-evident, owner-checkable
Git commits of aider's file edits are hash-chained, so edits to past commits are detectable with open tools, but the chat-history record (commands run, confirmations, conversation) has no integrity data, and nothing anchors the git chain outside the machine that holds it, so a full rewrite is undetectable by default.
› How it could pass
Suggestions. Any change that meets the test counts.
- Hash-chain or sign the chat/action log.
- Let the owner anchor checkpoints outside the record holder (e.g., an owner-held or witnessed digest).
Partial - A3Agent cannot rewrite its record
The model cannot directly write the history file: edits to files not in chat, new-file creation and every shell command need owner confirmation, and shell commands cannot be auto-approved even with --yes-always. But the record is an ordinary writable file in the same user context, so an owner-approved shell command or edit can alter or delete it; protection rests on the approval prompt, not on separation.
› How it could pass
Suggestions. Any change that meets the test counts.
- Write the action record from a component the agent's file edits and shell commands cannot reach, or make it append-only.
Partial
Verifiable · Can you prove what it runs, who it is, and what changed?
33%- V1Obtainable source, matching build
All of aider's source is available under Apache-2.0 and the default PyPI wheel is pure Python that can be diffed against the tag. But releases are uploaded with a token via twine with no provenance attestation (PyPI provenance endpoint returns 404), no documented verification procedure exists, and compiled dependency wheels are not tied to source by the project.
› How it could pass
Suggestions. Any change that meets the test counts.
- Publish via PyPI Trusted Publishing with attestations, or reproducible builds.
- Document how an owner verifies the installed package against the tagged source.
Partial - V2Owner-rooted identity
Aider has no agent identity. Commits are labelled by appending '(aider)' to the owner's git name and adding a 'Co-authored-by: aider (<model>) <aider@aider.chat>' trailer; these are unauthenticated strings, the trailer email is on the provider's domain, and recipients cannot verify that an action came from the owner's agent.
› How it could pass
Suggestions. Any change that meets the test counts.
- Give the agent an owner-held key (e.g., sign aider commits with an owner-configured key) and document how others verify it.
- Allow attribution under an owner-controlled identity rather than aider.chat.
Fail - V3Change history and rollback
Each session writes a timestamped header with aider version, models, edit format and repo-map settings to the chat history, so runtime and model changes are visible over time. But .aider* files are added to .gitignore by default, config, conventions and memory files have no product change history or attribution, and nothing restores a prior agent state (/undo only reverts aider's own code commits).
› How it could pass
Suggestions. Any change that meets the test counts.
- Version agent state (config, conventions, history, model settings) with attribution of who changed it.
- Offer a one-step restore of prior agent state.
Partial
Modifiable · Can you change anything, and can only you change it?
70%- M1Instructions and logic
Owner layers are editable via conventions files (--read), .aider.conf.yml, model settings files and --commit-prompt, but the base system prompts for each edit format are hard-coded in Python source with no option to replace them, so replacing them needs source edits (G3).
› How it could pass
Suggestions. Any change that meets the test counts.
- Expose the base system prompts and edit-format prompts as owner-replaceable files or settings.
Partial - M2Memory
The only cross-session memory is the Markdown chat history (re-used only with --restore-chat-history, off by default) and input history; both are documented, human-readable files the owner can edit or delete item by item. No hidden profiles are kept.
Pass - M3Tools
There is no plugin, MCP or tool interface; owner-supplied tools can only be used as shell commands the model suggests (with approval) or as --lint-cmd/--test-cmd. Built-ins can largely be switched off (--no-suggest-shell-commands, --no-auto-lint, --no-detect-urls, --no-git, ask mode).
› How it could pass
Suggestions. Any change that meets the test counts.
- Provide a documented interface for owner-built tools the model can call.
- Allow every built-in to be removed individually.
Partial - M4Owner has the final say
Most protections can be changed (confirmations via --yes-always, --no-verify-ssl, --no-gitignore, .aiderignore). Shell-command confirmation is locked: with --yes-always, shell commands are auto-declined (explicit_yes_required) and there is no setting to auto-run them.
› How it could pass
Suggestions. Any change that meets the test counts.
- Offer an owner setting (with a warning) to auto-approve shell commands.
Partial - M5No unilateral change
Aider runs locally with no remote flags; model settings and aliases are bundled with each release. The version check only offers an upgrade behind a confirmation prompt and can be disabled (--no-check-update); owners can pin any version via pip. A daily download of LiteLLM's third-party model-metadata JSON can change token-limit metadata but is not provider-controlled and can be overridden with .aider.model.metadata.json.
Pass
Controllable · Is your word final?
58%- C1Boundaries
File scope is per path (files in chat, --read read-only files, .aiderignore, --subtree-only) and enforced in code, and the agent cannot change its settings without an approval. Shell commands and URL fetching are on/off with per-invocation approval only, with no per-command or per-domain allow/deny lists. No spend capability or outbound messaging exists (G11).
› How it could pass
Suggestions. Any change that meets the test counts.
- Add per-command and per-domain allow/deny lists for shell commands and web access.
Partial - C2Approval gates
Aider gates a fixed set of classes (shell commands, new files, edits to files not in chat, adding URLs, pip installs, architect edits); the owner cannot require approval for edits to files already in the chat or define other gated classes.
› How it could pass
Suggestions. Any change that meets the test counts.
- Let the owner gate any action class, including edits to in-chat files.
Partial - C3Immediate halt
Ctrl-C stops the foreground LLM response and a second Ctrl-C within 2 s exits. The chat-history summarizer runs in a non-daemon background thread that sends chat content to the weak model; it is not cancelled by Ctrl-C, and sys.exit waits for it to finish.
› How it could pass
Suggestions. Any change that meets the test counts.
- Make one control cancel background summarization and all in-flight calls immediately.
Partial - C4Data serves only the owner
Model traffic goes only to the owner-chosen endpoint. Non-content analytics are asked for explicitly but with 'Yes' preselected for the sampled 10% and can be disabled permanently; the PyPI version check is disclosed and switchable; a daily metadata fetch from GitHub (no content) has no off switch. The privacy policy lets changes take effect when posted (material changes on notice) and permits legal disclosure without owner notice. No training, advertising or sale use is described.
- Aider privacy policy (live, last updated April 12, 2025)
- Aider analytics documentation
- main.py analytics prompt
- models.py metadata fetch
› How it could pass
Suggestions. Any change that meets the test counts.
- Default the analytics prompt to No.
- Commit to asking consent before changing data terms and to notify owners of legal disclosures.
- Add a switch for the model-metadata fetch.
Partial - C5Credential custody
Credentials are the owner's own API keys in environment variables, .env, config files or ~/.aider/oauth-keys.env, all visible and removable by the owner, and the provider holds no copy. Aider uses them only to call the owner-selected model.
Pass - C6Full deletion
With no provider-side agent copy, deletion is local, but there is no single delete action or documented procedure: the owner must remove .aider* files in each repo plus ~/.aider/ and home-directory config/env files by hand, with no confirmation. Analytics retention is graded in T3.
› How it could pass
Suggestions. Any change that meets the test counts.
- Provide one command that removes all aider state and reports completion.
Partial
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 Aider (https://github.com/Aider-AI/aider).
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 13:59:33 UTC · 39 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/aider.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.