Repository navigation
Cairn 2.0 makes the handoff a deliberate step: Cairn acts only when you ask. Summarizer selection moves to the current model generation, and the briefs mark the user's words separately from the summarizer's inference.
Major version: the automatic triggers and the SessionStart/PreCompact hooks are gone, and English is now the default language. See Updating below.
✨ Highlights
🙋 Explicit invocation only
- Cairn runs only on an explicit request:
Cairn Handoff,Cairn resume,Cairn Helpor a status request. There are no more task, session, threshold or compaction triggers. - New installations have no SessionStart/PreCompact hooks. Reinstalling removes the old Cairn hooks and keeps foreign ones; the old hook executables are silent no-ops after the update.
- Passive status displays stay: the Claude Code statusline and the Codex ambient zone.
🧭 Current model generation, calibrated at effort high
- Summarizer pool: Claude Fable 5.1, Opus 5.5, Sonnet 5.5 and Haiku 5.5, plus GPT-6 Astra, GPT-6.1 Sol and GPT-6 Luna, each with a full profile (window, prices, long-context tiers). The previous generation is suspended: it still resolves with the right window, but is never selected.
- Calibrated picks: Claude Opus 5.5 on Claude hosts and GPT-6.1 Sol on Codex hosts, in every zone. The fidelity floor is now 0.84.
- Correct context windows for every current Anthropic and OpenAI model, including Bedrock and other prefixed ids.
📌 Grounded briefs
- A brief puts the decisions and constraints a person set in their own words, in double quotes. The summarizer's own inference is marked
(derived). - A measured value is evidence, not a target, and a deferred option is open, not discarded.
- Quote check in the optional modes (sampling, bridge, API): a quote the source does not hold word for word gets a closing Cairn check note and appears in
unverifiedQuotes. - Resume reads quotes as exact words from the conversation and
(derived)items as inference. An unquoted or derived constraint is checked against the code, or the user is asked, before it stops or redirects the next step.
🛡️ Safer handoffs
- A failed compaction in an optional mode fails the handoff and keeps the previous brief, instead of storing an error text or an empty brief.
- Resume treats ledger content as data, not instructions, and the current code wins over a stale brief.
- Transcript reads are restricted to
.jsonlfiles under~/.claude/projects/(resolved through..and symlinks). The dependency audit is clean.
🌐 English by default, German selectable
- Choose German with
cairn install --lang de, or per session withCAIRN_LANG=de. - Ledgers written before the switch keep working.
⬆️ Updating
git pull
npm install
node dist/server.js installThen restart Claude Code / Codex. The installer refreshes the skills and the marked Cairn block in AGENTS.md, removes the old Cairn hooks and keeps foreign ones. Your ledger stays. If you copied project instructions or skills by hand, replace those copies too (README, "Updating an existing installation").
Requires Node.js ≥ 22.
📏 Measured
- The selection rests on a golden set of 5 probes × 7 models, scored by the 6 other pool models at effort
high(two runs pooled, each reviewer's leniency corrected). Opus 5.5 reaches a fidelity of 0.9596 and GPT-6.1 Sol 0.9573. - The grounded-brief prompt, scored by reviewers that see the source:
- hallucination 0.968 against 0.928 for the old prompt, with recall and verbatim held;
- in an end-to-end handoff, neither Opus 5.5 nor GPT-6.1 Sol wrote the invented lines the old prompt had produced.
- Details and limits: ADR-0012 and ADR-0013 in
docs/adr/ADR-cairn.md.
⚠️ Known limits
- Zone boundaries are provisional.
- Codex rollout parsing depends on an internal, unversioned Codex format.
- Login detection is best-effort.
- Account mode (the default) has no source to check quotes against: the session model writes the brief.
Strict TypeScript · 897 tests · MIT License · full changes in the CHANGELOG · docs in the README