Skip to main content

Aider

Aider sessions are usually a small local model (Qwen3 4B/8B class) run through Ollama or llama.cpp — cheap and fast, but not the model that should be making architectural calls. Anchor treats Aider as a drone harness: it runs /work against plans a bigger session already made ready, and nothing else.

Queen-bee plans, drone executes​

  • Queen-bee (Claude Code, Grok Build, or a human) writes plans into .plans/drafts/ and promotes them to .plans/bugs/ or .plans/features/.
  • Drone (Aider) only runs /work against an already-ready plan — it does not draft, promote, review, or merge.

Aider treats any message starting with / as one of its own built-in commands, so AIDER.md teaches the model to treat the word work — no leading slash — as an instruction to follow a condensed version of the /work procedure itself: pick a ready plan by priority, claim it into .plans/in-progress/, execute its Steps one at a time, run the project's tests before committing, commit on feature/<slug>, then finish to .plans/review-needed/ and stop — a drone never merges and never asks a merge question. If the user types /draft, /review, or anything else Anchor-shaped, the brief points them back to a queen-bee session instead.

Config: always load the brief​

anchor <project-dir> --platform aider

writes AIDER.md and platforms/aider/skills-index.md to the project root plus a tracked .aider.conf.yml.example (never .aider.conf.yml itself — host-specific values like OLLAMA_API_BASE stay in .env, gitignored). Copy the example to .aider.conf.yml and Aider loads both into every session:

read:
- AIDER.md
- platforms/aider/skills-index.md

The same scaffold adds the ignore rules that keep Aider's machine-local files out of the repo — .aider.conf.yml, .aider.model.settings.yml, and the session artifacts (.aider.chat.history.md, .aider.input.history, .aider.llm.history, .aider.tags.cache.v*/). The .example files stay tracked: the config entries are root-anchored so they cannot shadow them. A project scaffolded before these rules existed picks them up from anchor <project-dir> --upgrade, and write_aider_env.py (which writes .env) ensures them too, so a local-model wire-up never leaves host-specific config staged. If Aider already appended its own catch-all .aider*, Anchor leaves it alone rather than stacking a second block.

skills-index.md is the roster: /work is the only Anchor skill Aider runs in v1, and it lists everything else (/draft, /review, /audit, …) as queen-bee-only, so a drone session points the operator back to Claude Code or Grok Build instead of guessing at an unimplemented skill.

Swarm profile: Qwen3 ≤8B and similar​

AIDER.md and skills-index.md are sized for a mid-class model. A ≤8B local model (the typical swarm-local default) runs out of context budget reasoning about the full brief the same way it can run out of budget on a plain hello — see Local Models for the live canary. For that profile, copy platforms/aider/.aider.conf.swarm.yml.example to .aider.conf.yml instead of the default example:

read:
- platforms/aider/work-drone.md
edit-format: diff
map-tokens: 1024
timeout: 60
stream: false

It loads only work-drone.md — a script-first work card scoped to what a small model can reliably follow (run plan_fit.py / work_once.py rather than reasoning about plan lanes by hand) — in place of the fuller AIDER.md and skills-index.md.

The map-tokens: 1024 and timeout: 60 caps are GPU-host defaults. On a CPU-only Ollama host (/api/ps shows size_vram: 0) a cold first turn can exceed 60s and the repo map can stall it outright (measured 2026-09 on one WSL2 + Windows-Ollama host: ~72s with map-tokens: 0, no finish in 560s with 1024), so set map-tokens: 0 and a larger timeout: there.

Turn thinking off with think: false, not /no_think. On Ollama 0.34.0 and 0.34.2 (measured 2026-09), the /no_think message suffix had no effect: a one-word prompt still emitted reasoning. The API-level think: false worked, and Aider reaches it through litellm's reasoning_effort mapping. Copy platforms/aider/.aider.model.settings.yml.example to .aider.model.settings.yml (machine-local, already gitignored by Anchor) — it sets reasoning_effort: none. Older Ollama builds may still honor the suffix, and it was not measured on llama.cpp or vLLM. The same file carries an optional, commented num_ctx line: Aider 0.86.2 already sizes num_ctx for Ollama models on every request, so pinning it is a choice, not a fix.

Type work, not /work. Aider treats any message starting with / as one of its own built-in commands, so a bare /work never reaches the model — Aider answers Invalid command: work itself. Type the word work with no leading slash (or embed it mid-sentence).

Memory-safe local default​

AIDER.md points at the fleet probe (fit_device.py --probe) so a drone picks the Default for wire model — the memory-safer fit under real free-RAM pressure — rather than the largest model that only theoretically fits the box's total RAM. See Local Models.

Unattended twin​

This page covers interactive Aider sessions only. The same reachable Ollama URL also works headless via work_once.py/fleet_watch.py — a machine-local endpoints.yaml entry (e.g. var/endpoints.local.yaml, never the shared scripts/endpoints.yaml) using this host's URL under a shared name like laptop-swarm — for unattended plan-claiming without an Aider session running. See Local Models's drone recipe.

Tracked plans​

Same .plans/ contract as other platforms, with one restriction: a drone session claims ready work and finishes to review-needed/, but never drafts, promotes, or merges — that stays with a queen-bee session or a human running /review. Docs describe current state, not plans — never write product docs from .plans/ contents; document shipped code only.