{"id":49742646,"url":"https://github.com/isaacriehm/cairn","last_synced_at":"2026-06-08T01:01:25.454Z","repository":{"id":355726355,"uuid":"1229292143","full_name":"isaacriehm/cairn","owner":"isaacriehm","description":"Persistent ground truth for Claude Code. Stop AI agents from drifting on your codebase.","archived":false,"fork":false,"pushed_at":"2026-06-03T19:10:58.000Z","size":9487,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-03T21:03:42.416Z","etag":null,"topics":["adr","ai-agents","ai-memory","anthropic","claude","claude-code","claude-code-plugin","context-engineering","decision-records","ground-truth","mcp","mcp-server","multi-agent","spec-driven-development"],"latest_commit_sha":null,"homepage":"https://github.com/isaacriehm/cairn","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/isaacriehm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-04T22:34:26.000Z","updated_at":"2026-06-03T19:11:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"dbb8c8db-4077-4d9d-ba23-8889c19bb365","html_url":"https://github.com/isaacriehm/cairn","commit_stats":null,"previous_names":["isaacriehm/cairn"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/isaacriehm/cairn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isaacriehm%2Fcairn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isaacriehm%2Fcairn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isaacriehm%2Fcairn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isaacriehm%2Fcairn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/isaacriehm","download_url":"https://codeload.github.com/isaacriehm/cairn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/isaacriehm%2Fcairn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34043822,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adr","ai-agents","ai-memory","anthropic","claude","claude-code","claude-code-plugin","context-engineering","decision-records","ground-truth","mcp","mcp-server","multi-agent","spec-driven-development"],"created_at":"2026-05-09T21:02:47.945Z","updated_at":"2026-06-08T01:01:25.376Z","avatar_url":"https://github.com/isaacriehm.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Cairn\n\n**Persistent ground truth for Claude Code.**\nStop AI agents from drifting.\n\n[![npm version](https://img.shields.io/npm/v/@isaacriehm/cairn?style=flat-square\u0026logo=npm\u0026color=CB3837)](https://www.npmjs.com/package/@isaacriehm/cairn)\n[![Claude Code Plugin](https://img.shields.io/badge/Claude%20Code-Plugin-D97706?style=flat-square)](https://claude.com/claude-code)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)\n[![Node](https://img.shields.io/badge/node-%E2%89%A522-brightgreen?style=flat-square)](https://nodejs.org)\n\n```bash\n/plugin marketplace add isaacriehm/cairn\n/plugin install cairn@isaacriehm-cairn\n/reload-plugins\n```\n\n[The Problem](#the-problem) · [What You Get](#what-you-get) · [Quick Start](#quick-start) · [Glossary](#glossary) · [How It Works](#how-it-works) · [Features](#features) · [Multi-Dev](#multi-developer-enforcement) · [Docs](#documentation)\n\n\u003c/div\u003e\n\n---\n\nA *cairn* is a stack of stones marking a trail. This project stacks the\n**decisions, invariants, and canonical references** that define your\ncodebase into a single queryable ground state — so every Claude Code\nsession starts with the same map.\n\n## The Problem\n\nMonday: you tell Claude Code \"auth tokens expire after 24 hours.\" It\nships. Works.\n\nFriday, new session, new prompt. The agent reads `auth/tokens.ts`, sees\nno comment about expiry, and \"improves\" the code to a 7-day refresh.\nYou catch it in review. Or you don't.\n\nThe model isn't bad. The model has **no memory of what you decided**.\n\nA bigger context window doesn't fix this — it just delays it. What\nfixes it is a structured record on disk that every session reads from\nand writes to. Cairn is that record, plus the runtime that keeps it\nload-bearing.\n\n## What You Get\n\nThree persistent stores, version-controlled in `.cairn/`:\n\n🪨 **Decisions (`DEC-NNNN`)** — every architectural choice gets a\nmarkdown file with rationale, scope, and a supersedes chain. Once\naccepted, canonical until explicitly replaced. The agent reads the\nin-scope decisions before touching the affected code.\n\n```\nDEC-0042  Auth tokens expire after 24 hours\n  Scope:       src/auth/**\n  Rationale:   PCI compliance — short-lived bearer tokens\n  Supersedes:  DEC-0017 (7-day refresh, deprecated 2026-02-14)\n```\n\n🧭 **Invariants (`§INV-NNNN`)** — domain rules whose violation is a\nbug, not a style preference. *\"All API responses must include a\n`request-id` header.\"* Sensors enforce them on every diff at\npre-commit and again at CI.\n\n🗺️ **Canonical map** — `topic → file` index. Ask\n`cairn_canonical_for_topic(\"rate limiting\")` and get the actual file\npaths instead of the agent grepping vaguely or fabricating them.\n\nPlus four runtime layers that keep those stores live: an **MCP\nserver** (29 typed tools), a **Claude Code plugin** (skills + hooks +\nreviewer agent), **sensors** (4 layers of automated diff checks), and\na **CLI** for bootstrap and debug.\n\n## Quick Start\n\nInside Claude Code, in any project:\n\n```bash\n/plugin marketplace add isaacriehm/cairn\n/plugin install cairn@isaacriehm-cairn\n/reload-plugins\n```\n\n(First registers the GitHub repo as a marketplace; second installs the\nplugin; third loads it. The plugin ships a self-contained bundle —\nhooks, MCP server, and CLI all run from `dist/cli.mjs` inside the\nplugin cache. No `npx`, no `npm install -g`, no PATH dependency.)\n\n**Recommended:** disable Claude Code's built-in auto-memory before\nadopting — Cairn is your memory layer and the two conflict:\n\n```\n/memory → Disable Auto-Memory\n```\n\nOpen Claude Code in any project. The plugin auto-detects on session\nstart and offers `[a] adopt now`. Pick `[a]` once. The pipeline streams\ninline so you watch what's happening — typically 2-15 minutes\ndepending on repo size.\n\nWhen it finishes, your next session starts with the full ground state\npreloaded.\n\nIf you want `cairn` directly on your shell PATH (for `cairn doctor`,\n`cairn attention`, `cairn trace`, etc.):\n\n```bash\nnpm install -g @isaacriehm/cairn\n```\n\n…but the plugin doesn't require it. Outside Claude Code, you can adopt\nvia CLI instead:\n\n```bash\ncairn init\n```\n\n## Glossary\n\nRead this once and the rest of the doc reads cleanly.\n\n| Term                | Means                                                                                                  |\n| ------------------- | ------------------------------------------------------------------------------------------------------ |\n| **DEC**             | Decision record — one architectural choice with rationale + scope + supersedes chain.                  |\n| **§INV**            | Invariant — a domain rule the codebase must obey. Violations are bugs.                                 |\n| **Scope**           | The file glob a DEC or §INV applies to (`src/auth/**`, `packages/billing/**`).                         |\n| **Canonical map**   | `topic → file` index. The single source of truth for *\"where does X live?\"*                            |\n| **Sensor**          | A mechanical check on a diff: stub patterns, decision violations, structural holes, attestation match. |\n| **Attestation**     | A reviewer subagent's signed-off summary of what changed and why. Cross-checked by sensors.            |\n| **Drift**           | When code or docs disagree with the ground state in `.cairn/`.                                         |\n| **Bypass**          | A commit that skipped Cairn's hooks (`--no-verify`, broken hook path). Detected and surfaced.          |\n| **Attention queue** | The pile of DEC drafts, baseline findings, drift events, and conflicts waiting for operator review.    |\n| **Tightener**       | The Sonnet-driven step that turns a vague prompt into a structured spec before dispatching subagents.  |\n\n## How It Works\n\nTwo flows: **adoption** runs once when you onboard a repo. **Daily\nflow** runs on every prompt thereafter.\n\n### Adoption (one time)\n\nA single visual pass with 13 phases. The plugin streams output\ninline so nothing is opaque.\n\n| Phase                | What happens                                                                                                            |\n| -------------------- | ----------------------------------------------------------------------------------------------------------------------- |\n| 1. Detect            | Probe environment + framework signals.                                                                                  |\n| 2. Walk              | File manifest, extension stats, language detection.                                                                     |\n| 3. Map               | Sonnet domain mapper proposes module boundaries + `scope-index.yaml` globs.                                             |\n| 4. Seed              | Write `.cairn/` skeleton, `config.yaml`, grandfather pre-adoption commits into `.attested-commits`.                     |\n| 5. Pilot             | Operator picks a seed module from the mapper's top-3 candidates (one A/B/C question).                                   |\n| 6. Brand             | Auto-fill brand / voice / product DEC drafts from the mapper's domain summary (one A/B/C).                              |\n| 7. Topic index      | Content-fingerprint pre-pass — dedupes facts that appear across docs, source, and rules before drafting DECs.           |\n| 8, 9, 10 (parallel) | **Docs ingest** + **Source comments ingest** + **Rules merge** (`CLAUDE.md` / `AGENTS.md`) — all Haiku-batched.         |\n| 11. Baseline         | First sensor sweep against a synthetic full-tree diff. Findings written to `.cairn/baseline/`.                           |\n| 12. Strip            | Per-module strip-replace consent — operator chooses keep / strip / skip for each flagged module.                         |\n| 13. Multi-dev        | Detects package manager, installs git hooks, emits `JOIN.md` for new contributors.                                       |\n\nAfter the pipeline finishes, the **`cairn-attention` skill** drains\nthe resulting draft queue. High-confidence drafts auto-bulk-accept;\nthe rest you triage interactively (or in a browser GUI when the queue\nexceeds 15 items).\n\n### Daily flow\n\n```\nYou type a prompt\n        │\n        ▼\n┌────────────────────────────────────────────────┐\n│  Plugin auto-invokes the cairn-direction skill │\n│   1. Skill loads in-scope DECs, §INVs,         │\n│      and canonical-map entries via MCP         │\n│   2. Main Claude classifies prompt readiness   │\n│   3. If unclear → inline A/B/C questions       │\n│   4. If ready → tightens spec inline, writes   │\n│      .cairn/tasks/active/\u003cid\u003e/spec.tightened.md│\n│   5. Spec dispatched to subagents              │\n└────────────────┬───────────────────────────────┘\n                 ▼\n   Subagents work in your repo with MCP access:\n     cairn_decisions_in_scope, cairn_invariant_get,\n     cairn_canonical_for_topic, cairn_search, …\n                 │\n                 ▼\n   Reviewer subagent attests the diff,\n   extracts non-obvious decisions as DEC drafts\n                 │\n                 ▼\n   Stop hook surfaces inline:\n     \"Review DEC-0099 draft? [a] accept [b] reject [c] edit\"\n                 │\n                 ▼\n   You commit → pre-commit hook runs sensors\n              → CI gate verifies again on PR\n              → drift caught before merge\n```\n\nThe key bit: **the agent never starts cold.** Every prompt enters\nwith the relevant decisions, invariants, and canonical references\nalready loaded into the spec.\n\n## Features\n\n### Memory + ground state\n\n- **Persistent decisions / invariants / canonical map** in\n  version-controlled `.cairn/`.\n- **Component registry** — every component file carries a structured\n  `@cairn \u003cExportName\u003e` header; the agent loads the full in-scope\n  inventory before any UI work and follows USE \u003e EXTEND \u003e CREATE so it\n  never rebuilds a component that already exists. A check gate blocks\n  missing headers / duplicate names; an advisory audit flags probable\n  inline rebuilds.\n- **Supersedes chains** — old decisions stay readable but flagged\n  superseded; the chain is queryable via `cairn_supersedes_chain`.\n- **Scope-aware preload** — the SessionStart hook injects only the\n  DECs / §INVs that apply to files you've recently touched, instead\n  of dumping the whole ledger into context.\n\n### Adoption\n\n- **Single visual pass** — operator watches the pipeline stream\n  inline. No opaque background job.\n- **Haiku-batched classification** — docs, source comments, and\n  rules are ingested in parallel for speed.\n- **Conflict detection** — when two sources disagree, surfaces a\n  side-by-side resolution prompt instead of silently picking one.\n- **Topic-index dedup** — content fingerprints prevent the same fact\n  landing as three separate DEC drafts.\n- **Component-store backfill** — projects adopted before the component\n  store shipped add it in one pass: the `cairn-adopt-components` skill\n  detects the config, dispatches `component-annotator` subagents to write\n  `@cairn` headers, and builds the index + singleton §INVs. No manual\n  header-writing — just ask the agent to adopt the component store.\n\n### Daily flow\n\n- **`cairn-direction` skill** — auto-tightens vague prompts (*\"fix\n  the bug\"*) into structured specs before dispatch. Loads the\n  in-scope DECs, §INVs, and canonical-map entries automatically.\n- **`cairn-attention` skill** — drains the queue of DEC drafts and\n  sensor findings. Auto-bulk-accepts high-confidence drafts; spawns\n  a local browser triage GUI when the queue exceeds 15 items.\n- **Reviewer subagent** — every multi-chunk task ends with the\n  reviewer attesting the diff and extracting non-obvious decisions\n  into DEC drafts.\n- **Status-line badge** — `⬡ cairn` in the Claude Code status row\n  shows pending attention count, bypass warnings, GC state, and the\n  active task title. Color-codes by absolute token usage.\n- **Session trace log** — `cairn trace` pretty-prints unified\n  per-session events. `--tail`, `--errors-only`, `--session`,\n  `--json` flags supported.\n\n### Sensors (four layers)\n\n| Layer          | What it checks                                                                                                |\n| -------------- | ------------------------------------------------------------------------------------------------------------- |\n| **Layer A**    | Regex stub-pattern catalog (incomplete impls) + live SoT alignment via PostToolUse Write/Edit dedupe.         |\n| **Layer B**    | Attestation cross-check — does the reviewer's claim match the actual diff?                                    |\n| **Layer C**    | Decision-assertion enforcement — was the in-scope DEC honored?                                                |\n| **Structural** | Route handlers non-empty, DTOs no fake fields, etc.                                                           |\n\nRun at pre-commit, again at CI. Findings flow into the attention\nqueue. Drift events log to `.cairn/staleness/log.jsonl` and surface\non the next GC sweep.\n\n### Tooling surfaces\n\n- **MCP server** — 29 typed tools across read, write, history,\n  attention, init, and search. Used by the plugin and any other MCP\n  client.\n- **CLI** — `cairn init / join / mcp / gc / scope / doctor / fix /\n  attention / align / baseline / hook / sensor-run / tag / trace /\n  status-line`.\n- **Claude Code plugin** — manifest + 5 hooks (SessionStart, SessionEnd,\n  Stop, UserPromptSubmit, PostToolUse(Read|Write|Edit)) + 3 skills +\n  1 reviewer agent + 3 commands.\n- **Cairn Lens** — VS Code / Cursor extension. Hover, gutter icons,\n  code lens, optional DEC Explorer sidebar. Resolves `§INV-NNNN`,\n  `§DEC-NNNN`, `TODO(TSK-…)` inline. Read-only — same ground state,\n  no separate index.\n- **Browser triage GUI** — local HTTP server spawned when the\n  attention queue is large; avoids per-draft MCP round-trips.\n\n## Editor Extension — Cairn Lens\n\nHover, ghost text, gutter icons, code lens — all resolved live from\n`.cairn/ground/` ledgers. Read-only. Hovering a `@cairn` component\nheader shows its registry entry (`[S]` singleton; amber drift when the\nheader name ≠ the exported name).\n\n| Status      | Meaning                       |\n| ----------- | ----------------------------- |\n| `●` (green) | Active invariant              |\n| `◐` (amber) | Superseded — see chain        |\n| `○` (red)   | Orphan — not in ledger        |\n\nInstall the latest `.vsix` from\n[releases](https://github.com/isaacriehm/cairn/releases) →\n`Cmd/Ctrl+Shift+P` → `Extensions: Install from VSIX…`. Full setup in\n[`packages/cairn-lens/README.md`](packages/cairn-lens/README.md). Because\nthe `.vsix` is not on the Marketplace, Cairn Lens checks npm once a day\nand notifies you when a newer release is published (disable via\n`cairn.lens.checkForUpdates`).\n\n## Multi-Developer Enforcement\n\nOnce a project is Cairn-adopted, every developer runs Cairn — locally\nand at PR time. **Defense in depth:**\n\n| Layer                         | What                                                          | Catches                                                     |\n| ----------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------- |\n| **1. Versioned git hooks**    | `.cairn/git-hooks/{pre,post,commit-msg}-commit`               | Local commits violating ground state.                       |\n| **2. `cairn join` bootstrap** | CLI + `package.json prepare` script                           | Clones that haven't activated `core.hooksPath`.             |\n| **3. CI gate**                | `.github/workflows/cairn-check.yml`                           | `--no-verify` slipping through. **Non-bypassable.**         |\n| **4. Plugin degraded mode**   | SessionStart banner + MCP guard                               | Write tools refuse with `BOOTSTRAP_REQUIRED` until joined.  |\n\nPlus **Stop-hook bypass detection** — flags any HEAD commits not in\n`.cairn/.attested-commits` and surfaces `[a] backfill / [b] accept\n(record DEC) / [c] defer`.\n\n## Disk Layout\n\nAfter `cairn init`:\n\n```\n.cairn/\n├── config.yaml                  slug, version, project_globs\n├── config/                      workflow.md, sensors.yaml, stub-patterns.yaml\n├── ground/\n│   ├── decisions/               DEC-NNNN.md per choice + _inbox/\u003cid\u003e.draft.md\n│   ├── invariants/              INV-NNNN.md per §V rule\n│   ├── canonical-map/           topic → file index\n│   ├── components/              derived @cairn inventory (gitignored; rebuilt from headers)\n│   ├── brand/                   overview.md, voice.md\n│   ├── product/                 positioning.md, personas.yaml\n│   ├── conflicts/               \u003ca-id\u003e__\u003cb-id\u003e.md (DEC↔INV contradictions)\n│   ├── alignment-pending/       ambiguous SoT-align cases queued for review\n│   └── scope-index.yaml         file → DEC/§V resolution\n├── baseline/                    first-sweep audit YAMLs\n├── tasks/active/\u003cid\u003e/           spec.tightened.md, status.yaml, attestation.yaml\n├── sessions/\u003csession-id\u003e/       per-session status + events\n├── staleness/                   drift event log + deferred Layer-A queues\n├── git-hooks/                   pre-commit, post-commit, commit-msg\n├── runs/terminal/               one-shot CLI run logs\n├── backups/source/              .original snapshots (rules-merge can revert)\n├── .attested-commits            commit log used by bypass detection\n└── JOIN.md                      new-contributor bootstrap doc\n```\n\nFull contract: [`docs/FILESYSTEM_LAYOUT.md`](docs/FILESYSTEM_LAYOUT.md).\n\n## Packages\n\n```\npackages/\n├── cairn/                       umbrella + CLI bin (`cairn …`)\n├── cairn-core/                  MCP server, sensors, hooks, init pipeline\n├── cairn-state/                 ground-state schemas + low-level I/O\n├── cairn-frontend-claudecode/   Claude Code plugin (manifest, hooks, skills, agents, commands)\n└── cairn-lens/                  VS Code / Cursor extension (.vsix)\n```\n\n## Documentation\n\n**User guide** — read these to use Cairn day to day:\n\n| Doc                                                          | What                                                                |\n| ------------------------------------------------------------ | ------------------------------------------------------------------- |\n| [Core concepts](docs/guide/concepts.md)                      | Decisions, invariants, canonical map, scope, sensors, drift.        |\n| [Using Cairn day to day](docs/guide/daily-flow.md)           | What happens on every prompt, after the one-time adoption.          |\n| [Adopting Cairn](docs/guide/adoption.md)                     | The 13-phase adoption pipeline, walked through step by step.        |\n| [Working with decisions](docs/guide/decisions.md)            | DEC creation paths, file format, supersedes chain, scope design.    |\n| [Cairn for teams](docs/guide/multi-dev.md)                   | Onboarding contributors, the CI gate, bypass detection.             |\n| [Quick reference](docs/guide/reference.md)                   | CLI commands, MCP tools, status-line, file locations, slash commands. |\n\n**Technical specs** — read these when you're modifying Cairn itself:\n\n| Doc                                                          | What                                                          |\n| ------------------------------------------------------------ | ------------------------------------------------------------- |\n| [System Overview](docs/SYSTEM_OVERVIEW.md)                   | End-to-end surface map + Mermaid diagram of all flows.        |\n| [Architecture](docs/ARCHITECTURE.md)                         | Locked layered model, five-package boundary.                  |\n| [Plugin Architecture](docs/PLUGIN_ARCHITECTURE.md)           | Adoption phases, hooks, multi-dev enforcement, question bar.  |\n| [MCP Surface](docs/MCP_SURFACE.md)                           | Tool-by-tool reference.                                       |\n| [Filesystem Layout](docs/FILESYSTEM_LAYOUT.md)               | `.cairn/` directory contract.                                 |\n\n## Development\n\n```bash\ngit clone https://github.com/isaacriehm/cairn\ncd cairn\npnpm install\npnpm build\npnpm smokes        # 38-smoke gate. all green on a clean tree.\n```\n\nOther root scripts: `pnpm typecheck`, `pnpm clean`, `pnpm smokes:all`\n(every declared smoke), `pnpm smoke:llm-prompt-eval` (opt-in\nreal-Haiku regression — burns quota). See\n[`CLAUDE.md`](CLAUDE.md#common-commands) for the full table.\n\n## Troubleshooting\n\n### Skill listing budget on Sonnet (and other lower-context models)\n\nClaude Code reserves **1% of the model's context window** for the\nskill listing by default. On Opus (1M ctx) that's ~10 000 chars —\nplenty of room. On Sonnet (200k ctx) it's ~2 000 chars, which is\ntight once you add a few user-level plugins (design skills, image\ngenerators, etc.). The cairn family ships ~3 skills + 3 commands; if\nyour listing is over budget, Claude Code drops the lowest-priority\ndescriptions — `cairn-direction` is a frequent victim, which means\nthe auto-invoke trigger gate never sees the prompt.\n\n**Adoption handles this for you.** Phase 1 detect raises\n`skillListingBudgetFraction` to `0.03` in `~/.claude/settings.json`\n(fits cairn + ~30 user skills on Sonnet). The bump is silent,\nidempotent, and only fires when the existing value is missing or\nbelow the floor — operator overrides at or above `0.03` are\npreserved. Restart Claude Code after first adoption to pick up the\nnew budget.\n\nIf you ever need to verify, run `/doctor`. It should report\n`0 dropped`. If a value above `0.03` still shows dropped descriptions,\ndisable user-level skills you don't use (the `/skills` UI toggles\neach one) or set `\"user-invocable-only\"` in `skillOverrides` (hidden\nfrom the auto-invoke listing, still reachable via `/\u003cname\u003e`).\n\n## Status\n\nPre-1.0. The Claude Code plugin is the daily-driven surface; the CLI\nis the bootstrap and debug entrypoint. Issues + PRs welcome.\n\n## License\n\n[MIT](LICENSE) © Isaac Riehm\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\u003csub\u003eBuilt with Claude Code. The plugin architecture takes cues from OpenAI's \"harness lesson\" on agent state — Cairn extends those ideas with explicit decisions, invariants, sensors, and a multi-developer enforcement layer for solo-or-small-team product engineering.\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisaacriehm%2Fcairn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fisaacriehm%2Fcairn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fisaacriehm%2Fcairn/lists"}