@cairnkeep/cli 2.15.4 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CONTRIBUTING.md +12 -0
  3. package/README.md +85 -590
  4. package/docs/README.md +87 -0
  5. package/docs/agents.md +193 -0
  6. package/docs/context-intelligence.md +143 -0
  7. package/docs/context-packs.md +33 -0
  8. package/docs/domain-knowledge.md +29 -0
  9. package/docs/ecosystem.md +23 -0
  10. package/docs/learning/CURRICULUM-MAP.md +3 -1
  11. package/docs/learning/FEATURE-GUIDE.md +23 -4
  12. package/docs/learning/README.md +4 -0
  13. package/docs/learning/lessons/L00-why-cairnkeep.md +3 -1
  14. package/docs/learning/lessons/L01-safe-trial.md +3 -3
  15. package/docs/learning/lessons/L02-installation.md +2 -2
  16. package/docs/learning/lessons/L03-first-project.md +9 -10
  17. package/docs/learning/lessons/L19-validated-skill-improvement.md +1 -1
  18. package/docs/learning/lessons/L20-mcp-tool-profiles.md +1 -1
  19. package/docs/learning/lessons/L21-context-packs.md +1 -1
  20. package/docs/learning/lessons/L22-native-windows.md +2 -2
  21. package/docs/learning/lessons/L23-guided-setup.md +18 -5
  22. package/docs/learning/lessons/L24-okf-exchange.md +1 -1
  23. package/docs/learning/lessons/L25-playbooks.md +1 -1
  24. package/docs/learning/lessons/L26-context-intelligence.md +180 -0
  25. package/docs/learning/tracks/evidence-and-evaluation.md +1 -0
  26. package/docs/learning/tracks/operator.md +1 -0
  27. package/docs/learning/tracks/practitioner.md +1 -0
  28. package/docs/learning/video-scripts/V26-context-intelligence.md +144 -0
  29. package/docs/native-windows.md +5 -0
  30. package/docs/operating.md +65 -3
  31. package/docs/privacy-and-data-flow.md +22 -0
  32. package/docs/quickstart.md +12 -4
  33. package/docs/releasing.md +27 -19
  34. package/docs/storage.md +21 -0
  35. package/docs/work-evidence.md +14 -0
  36. package/examples/eval/bundled-fake.json +1 -1
  37. package/mcp-memory-server/dist/context-pack-cli.js +3 -1
  38. package/mcp-memory-server/dist/context-pack-retrieval.js +413 -0
  39. package/mcp-memory-server/dist/context-pack.js +171 -3
  40. package/mcp-memory-server/dist/domain-retrieval-provider.js +257 -0
  41. package/mcp-memory-server/dist/index.js +73 -387
  42. package/mcp-memory-server/dist/mcp-tool-catalog.js +2 -0
  43. package/mcp-memory-server/dist/memory-extraction.js +87 -0
  44. package/mcp-memory-server/dist/memory-proposal-cli.js +110 -0
  45. package/mcp-memory-server/dist/memory-proposal-schema.js +78 -0
  46. package/mcp-memory-server/dist/memory-proposal-store.js +273 -0
  47. package/mcp-memory-server/dist/platform-security.js +32 -26
  48. package/mcp-memory-server/dist/retrieval-benchmark.js +199 -0
  49. package/mcp-memory-server/dist/reviewed-memory-store.js +281 -0
  50. package/mcp-memory-server/dist/work-evidence-schema.js +17 -0
  51. package/mcp-memory-server/dist/work-evidence-store.js +57 -1
  52. package/mcp-memory-server/package.json +8 -1
  53. package/package.json +1 -1
  54. package/schemas/context-usage-receipt.schema.json +41 -0
  55. package/schemas/memory-proposal.schema.json +65 -0
  56. package/schemas/retrieval-benchmark.schema.json +64 -0
  57. package/scripts/cairn-cli.mjs +3 -0
  58. package/scripts/completion.sh +17 -6
  59. package/scripts/doctor.sh +4 -2
  60. package/scripts/setup.mjs +92 -13
  61. package/scripts/terminal-prompts.mjs +172 -0
  62. package/scripts/test-completion.sh +8 -1
  63. package/scripts/test-docs-navigation.sh +63 -0
  64. package/scripts/test-doctor.sh +21 -0
  65. package/scripts/test-phase17-artifact-lifecycle.sh +1 -1
  66. package/scripts/test-release-sbom.sh +44 -16
  67. package/scripts/test-setup-preflight.mjs +130 -0
  68. package/scripts/test-windows-native.mjs +30 -0
  69. package/scripts/verify-docs-parity.sh +28 -28
  70. package/scripts/windows-platform.mjs +8 -5
package/README.md CHANGED
@@ -4,620 +4,115 @@
4
4
  [![npm](https://img.shields.io/npm/v/@cairnkeep/cli)](https://www.npmjs.com/package/@cairnkeep/cli)
5
5
  [![license](https://img.shields.io/npm/l/@cairnkeep/cli)](LICENSE)
6
6
 
7
- > A durable, harness-agnostic **memory + context layer** for coding agents.
8
-
9
- A *cairn* is a stack of stones left as a trail marker for whoever follows; a
10
- *keep* is where you store what matters. **Cairnkeep** is where coding agents
11
- stack durable memory — decisions, pitfalls, patterns — and follow the trail
12
- across sessions, projects, and harnesses (Claude Code, Codex CLI, OpenCode,
13
- Kimi Code, Qwen Code, Pi, and other MCP clients).
14
-
15
- ## Five-minute start
16
-
17
- For Codex CLI, Cairnkeep can install the complete project-local memory wiring
18
- in one command:
7
+ > Durable, local-first memory and context for coding agents.
8
+
9
+ Cairnkeep helps coding agents carry project context across sessions and
10
+ harnesses. It stores decisions, constraints, patterns, and lessons in
11
+ project-scoped memory, then gives agents a bounded protocol for finding and
12
+ verifying that context without turning memory into an authority or an
13
+ autonomous agent runtime.
14
+
15
+ ## Why Cairnkeep?
16
+
17
+ - **Continuity across sessions.** Recall project decisions and recurring
18
+ failures instead of rediscovering them from scratch.
19
+ - **Harness independence.** Use the same memory through Claude Code, OpenCode,
20
+ Codex CLI, Kimi Code, Qwen Code, Pi, or another MCP client.
21
+ - **Local by default.** The default stdio server stores data on your computer;
22
+ remote access, embeddings, capture, and external context are explicit
23
+ opt-ins.
24
+ - **Bounded agent guidance.** Managed `AGENTS.md` instructions and project
25
+ playbooks tell compatible agents when to retrieve context and which checks
26
+ apply, but never execute work or grant approval.
27
+ - **Least authority.** Complete MCP annotations, read-only/custom tool profiles,
28
+ capability gates, and immutable context packs keep observation separate from
29
+ action.
30
+
31
+ ## Quick start
32
+
33
+ Cairnkeep requires Node.js 22 or newer. In an interactive terminal, guided
34
+ setup presents selectable Git and memory choices plus checkboxes for every
35
+ supported coding harness:
19
36
 
20
37
  ```bash
21
38
  npm install --global @cairnkeep/cli
22
- cairn setup /path/to/project --git init --harness codex --memory local --yes
39
+ cairn setup /path/to/project
23
40
  cd /path/to/project
41
+ cairn doctor
24
42
  ./.ai/start-codex.sh # Windows: .\.ai\start-codex.cmd
25
43
  ```
26
44
 
27
- Review `.codex/config.toml` and accept Codex's project-trust prompt on first
28
- use. No separate MCP registration or machine-level asset sync is needed. See
29
- the **[quickstart](docs/quickstart.md)** for existing repositories, Claude Code,
30
- verification, and the first remember/recall cycle.
31
-
32
- ## Status
33
-
34
- Shipped: the memory server, the `cairn` CLI (`setup`, `bootstrap`, `memory-server`, `sync`, `sync-pi`, `sync-kimi`,
35
- `doctor`, `playbook`, `trajectory`, `artifact`, `evidence`, `mcp-tools`, `pack`, `notes`, `memory`, `eval`, `audit-timer`, `completion`, `uninstall`) installable via
36
- `npm i -g @cairnkeep/cli`, and the
37
- operating layer (commands,
38
- agents, hooks) installed on Claude Code and OpenCode, plus the native Pi
39
- trajectory extension and thin Pi/Kimi graph and playbook adapters. The generic launchers
40
- expose wrapper seams (`.ai/pre-launch.sh`/`.ai/pre-launch.ps1`,
41
- `CAIRN_EXTRA_SETTINGS`, `.ai/post-exit.sh`/`.ai/post-exit.ps1`) so an enterprise wrapper can add provider/credential setup
42
- without forking them. Also shipped: context exploration (`/context-explore`) and
43
- a thin routing seam (`route_check`), both of which delegate to
44
- [token-miser](https://github.com/cairnkeep/token-miser), a public
45
- cairnkeep-org sibling project.
46
-
47
- Version 2.12 adds a declarative harness registry, first-class Codex project
48
- setup, and a shorter path from installation to verified recall.
49
- Version 2.13 adds opt-in local Git-linked work evidence around generated harness
50
- launchers, including native Windows, without capturing prompts or replacing Git.
51
- Version 2.15 adds bounded project playbooks that help agents select existing
52
- recall, planning, verification, review, security, documentation, and learning
53
- steps without becoming an agent runtime or granting approval.
54
- Version 2.15.4 makes the generic durable-context retrieval the first tool or
55
- command for compatible agents, puts bounded playbook signal values inline,
56
- and supports command- and event-scoped playbook help. Agents still verify
57
- repository provenance, and instruction presence remains distinct from runtime
58
- evidence that a tool was called.
59
-
60
- ## Compatibility
61
-
62
- Node.js 22, 24, and 26 are supported. Cairnkeep 2.x requires Node.js 22 or
63
- newer; Cairnkeep 1.x remains available for older runtimes, although Node.js 18
64
- and 20 are end-of-life upstream.
65
-
66
- | Client or platform | Support level |
67
- |---|---|
68
- | Claude Code on Linux/macOS | Memory server plus commands, agents, hooks, and launchers |
69
- | OpenCode on Linux/macOS | Memory server plus commands, plugins, hooks, and launchers |
70
- | Kimi Code on Linux/macOS | Memory MCP server, project launcher, and opt-in `/graphify` Skill |
71
- | Qwen Code on Linux/macOS | Memory MCP server plus project launcher; no Cairnkeep operating-layer assets yet |
72
- | Pi on Linux/macOS | Memory MCP through a maintained local stdio extension; native opt-in trajectory extension, launcher, and `/graphify` prompt; Pi 0.84.1 minimum for the bridge |
73
- | Codex CLI on Linux/macOS | Project-scoped memory MCP configuration and launcher; no Cairnkeep-specific commands or hooks |
74
- | Other MCP clients | Memory plus optional domain-knowledge and context-pack MCP tools |
75
- | Native Windows x64 | Node-native CLI, guided setup, memory server, bootstrap compatibility, PowerShell/Command Prompt launchers, sync, hooks, doctor, storage lifecycle, Task Scheduler, completion, and uninstall |
76
- | Windows ARM64 | Supported through Windows x64 emulation only; a native database binding is not currently shipped |
77
- | WSL | Uses the normal Linux workflow; distinct from native Windows and Git Bash |
78
-
79
- The `cairn graph` CLI is harness-independent and can be run from a project
80
- shell used by Kimi Code, Pi, Qwen Code, Codex, or another client. Claude Code,
81
- OpenCode, Pi, and Kimi can receive thin `/graphify` adapters; those adapters do
82
- not imply equivalent hooks, agents, or MCP support.
83
-
84
- Linux, macOS, Bash 3.2 portability, native PowerShell on Windows x64, global npm
85
- installation, and clean Node 22/24/26 runtime checks are exercised in CI. See
86
- [Native Windows operation](docs/native-windows.md) for platform-specific setup,
87
- ACL, scheduling, process-tree, and recovery details.
88
-
89
- See [Harness compatibility](docs/harness-compatibility.md) for exact support
90
- levels, trust boundaries, and candidates that are not yet runtime-tested.
91
-
92
- ## Try with Podman
93
-
94
- The minimal OCI image runs the memory server as an unprivileged user and keeps
95
- all databases in a named volume:
96
-
97
- ```bash
98
- podman run --rm -i \
99
- --userns=keep-id:uid=10001,gid=10001 \
100
- --read-only --cap-drop=all --security-opt=no-new-privileges \
101
- --tmpfs=/tmp:rw,noexec,nosuid,size=64m,mode=1777 \
102
- --volume cairnkeep-data:/data:Z,U \
103
- ghcr.io/cairnkeep/cairnkeep:latest stdio
104
- ```
105
-
106
- For persistent authenticated HTTP, rootless Quadlet, isolated workspace mode,
107
- storage paths, secrets, and private derived images, see
108
- **[Containers](docs/containers.md)**.
109
-
110
- ## Components
111
-
112
- - **`mcp-memory-server/`** — an MCP server exposing durable, scoped memory
113
- (`memory_write`, `memory_search`, …) backed by AgentFS, with optional
114
- embedding-ranked search against any OpenAI-compatible endpoint.
115
- - **`bin/cairn`** — the CLI. `cairn setup [path]` guides or deterministically
116
- reconciles selected project assets; `cairn bootstrap [path]` preserves the
117
- established scripted scaffold contract; `cairn doctor` health-checks the configured pieces;
118
- `cairn trajectory list|show|prune` manages opt-in local session trajectories;
119
- `cairn artifact list|show|delete|prune` manages opt-in local artifacts;
120
- `cairn mcp-tools list|status|set|reset` applies least-authority discovery
121
- profiles; `cairn pack` validates, installs, pins, updates, and approves
122
- immutable external context;
123
- `cairn eval validate|run|ablate|report|prune|delete` coordinates explicit
124
- local two-pass and one-capability-at-a-time measurements;
125
- `cairn skill harvest|list|show|review|propose|evaluate|apply|rollback`
126
- turns recurring hindsight evidence into reviewed, measured, reversible
127
- skill-file improvements;
128
- `cairn graph build|query|status|diff|explain|path` owns the local Graphify
129
- workflow from any project shell without installing Graphify-owned harness
130
- assets; Claude Code, OpenCode, Pi, and Kimi add thin `/graphify` wrappers;
131
- `cairn notes distill|search-error|promote|doctor` compiles and searches
132
- default-off local hindsight notes outside the online agent path;
133
- `cairn memory export|import` relocates the durable store between machines
134
- (`export` requires the optional `sqlite3` CLI);
135
- `cairn audit-timer` installs the scheduled memory+wiki audit;
136
- `cairn completion bash|zsh|fish` generates shell completion definitions; and
137
- `cairn sync-pi` installs the native Pi memory and trajectory extensions plus graph prompt;
138
- `cairn sync-kimi` installs the Kimi graph Skill;
139
- `cairn uninstall` reverses the install (backup-first, revertible).
140
- - **`templates/`** — project scaffolding (generic launchers, env) plus the
141
- derived-knowledge layer (wiki, alignment, graph, security, planning).
142
- - **`scripts/`** — asset-sync and maintenance utilities.
143
-
144
- ## Related projects
145
-
146
- - **[token-miser](https://github.com/cairnkeep/token-miser)** — a public
147
- cairnkeep-org sibling that owns context exploration and request routing;
148
- cairnkeep's `context_explore` and `route_check` tools are thin delegates
149
- to it.
150
-
151
- ## Optional companion tools
152
-
153
- cairnkeep runs standalone — none of the tools below are required. Its memory
154
- server, `cairn bootstrap`, and derived-knowledge features work with none of
155
- them. These are the accelerators the author pairs cairnkeep with; each is opt-in.
45
+ Select Codex CLI in the harness checklist for this route. Review
46
+ `.codex/config.toml` and accept Codex's project-trust prompt on first use.
47
+ Automation can supply every choice explicitly; the quickstart documents that
48
+ deterministic form.
156
49
 
157
- | Tool | What it adds | How it plugs in |
158
- |------|--------------|-----------------|
159
- | [lean-ctx](https://github.com/yvgude/lean-ctx) | Compressed reads/searches/shell/dir-maps — large token savings on exploration | Register as an MCP server in your harness |
160
- | [token-miser](https://github.com/cairnkeep/token-miser) | Model routing (`route_check`) + codebase mapping (`context_explore`) | Already integrated, env-gated: `CAIRN_ROUTE_ENDPOINT` / `CAIRN_EXPLORE_BINARY` |
161
- | [rtk](https://github.com/rtk-ai/rtk) | "Rust Token Killer": token-reduced proxy for git/npm/cargo output | Shell-level, no wiring needed |
50
+ See the [quickstart](docs/quickstart.md) for Claude Code, the first
51
+ remember/recall cycle, recovery, and setup ownership. See
52
+ [harness compatibility](docs/harness-compatibility.md) for the exact surface
53
+ supported by each client.
162
54
 
163
- ## Setup
164
-
165
- A working workflow needs three things: the memory server registered, the
166
- operating layer installed into your harness, and a configured project. `cairn
167
- setup` is the recommended guided entry point; `cairn bootstrap` remains the
168
- deterministic compatibility primitive for established scripts. Project setup
169
- reports but never performs machine-level sync. The full ordered walkthrough is
170
- in **[the quickstart](docs/quickstart.md)**; the complete operator reference is
171
- in **[docs/operating.md](docs/operating.md)**.
172
-
173
- This setup is local by default: the registered stdio server stores memory on
174
- the user's computer. Cairnkeep never discovers or selects a remote host.
175
- Remote HTTP storage requires an explicit server deployment and client URL; see
176
- **[Memory storage and deployment](docs/storage.md)** before enabling it.
177
-
178
- The short version for Claude Code:
179
-
180
- ```bash
181
- # 1. Install cairnkeep and register the memory server (server name: cairn-memory)
182
- npm install -g @cairnkeep/cli
183
- claude mcp add cairn-memory -s user -- cairn memory-server
184
-
185
- # 2. Install the operating layer (commands, agents, hooks, scaffold templates)
186
- cairn sync --apply # add --live-root <proj>/.claude to scope it
187
-
188
- # 3. Configure a project deterministically
189
- cairn setup /path/to/project --git init --harness claude --memory local --yes
190
- cp /path/to/project/.ai/env.example /path/to/project/.ai/.env # then edit
191
-
192
- # 4. Launch (and, optionally, check the wiring first)
193
- cd /path/to/project && cairn doctor
194
- ./.ai/start-claude.sh
195
- ```
196
-
197
- After setup, the basic workflow is intentionally small:
198
-
199
- ```text
200
- > /remember Use transactional migrations for schema changes
201
- Stored as patterns/transactional-migrations.
202
-
203
- > /recall transactional migrations
204
- patterns/transactional-migrations: Use transactional migrations for schema changes
205
- ```
206
-
207
- The exact command rendering depends on the client. Any MCP client can call
55
+ The core loop is intentionally small: store a concise, verified project fact,
56
+ close the session, and retrieve it when a later task needs it. Claude Code and
57
+ OpenCode expose `/remember` and `/recall`; any compatible MCP client can use
208
58
  `memory_write` and `memory_search` directly.
209
59
 
210
- Setup also installs a balanced `.ai/playbooks.json` policy and an ownership-safe
211
- managed block in `AGENTS.md`. The block directs compatible agents to make one
212
- task-derived, project-scoped memory search for nontrivial work involving prior
213
- decisions, conventions, constraints, or failures. Results are locators, not
214
- authority; referenced repository sources must be verified, and memory is never
215
- promoted automatically. Agents can evaluate the playbook at task boundaries:
60
+ ## For coding agents
216
61
 
217
- ```bash
218
- cairn playbook check start --complexity standard --familiarity mixed
219
- cairn playbook check finish --changed src/example.ts --completed verify.tests --enforce
220
- ```
62
+ Setup installs a managed project instruction block with a deliberately small
63
+ protocol:
221
64
 
222
- The result selects only existing Cairnkeep actions. It never runs them, enables
223
- a disabled capability, grants approval, or promotes memory automatically. Use
224
- `cairn playbook status`, `set minimal|balanced|strict`, and `enable|disable` to
225
- inspect or customize the project policy.
65
+ 1. For a nontrivial task that may depend on prior project knowledge, make one
66
+ task-derived, project-scoped `memory_search` the first tool or command.
67
+ 2. Treat results as locators, not truth; verify the maintained repository
68
+ sources they reference.
69
+ 3. Continue with normal repository inspection if memory is unavailable or has
70
+ no relevant result.
71
+ 4. Never write, supersede, or approve durable memory unless the user or a
72
+ reviewed workflow explicitly requests it.
226
73
 
227
- For Codex CLI, `cairn setup --harness codex --memory local` writes the
228
- project-scoped `.codex/config.toml` entry and both POSIX and native Windows
229
- launchers. Review the configuration and trust the project before launching.
230
- Existing operator-owned `.codex/config.toml` files are never overwritten; a
231
- reported `skipped` file must be merged by the operator and checked with
232
- `cairn doctor`.
74
+ Cairnkeep playbooks can recommend or require existing review, verification,
75
+ security, documentation, and learning steps. They do not run those steps,
76
+ activate skills, enable capabilities, or authorize destructive work.
233
77
 
234
- For Kimi Code, bootstrap supplies a launcher and Kimi reads the repository's
235
- MCP configuration. A local stdio entry uses `cairn memory-server`. Remote Kimi
236
- configuration requires a literal URL and supports a token reference through
237
- `bearerTokenEnvVar`; it does not expand `${VAR}` in the URL. See
238
- [Harness compatibility](docs/harness-compatibility.md#kimi-code).
78
+ Read [Cairnkeep for coding agents](docs/agents.md) for the full contract,
79
+ authority model, harness behavior, and graceful fallback.
239
80
 
240
- Install Kimi's thin graph Skill separately with `cairn sync-kimi --apply`.
241
- It registers `/graphify` (also `/skill:graphify`) and delegates every supported
242
- operation exclusively to `cairn graph`.
81
+ ## Trust boundary
243
82
 
244
- For Qwen Code, use project `.qwen/settings.json`: local stdio launches
245
- `cairn memory-server`, while remote HTTP uses `httpUrl` and environment-expanded
246
- headers. Review and approve project MCP configuration with
247
- `qwen mcp approve cairn-memory`, then launch with `./.ai/start-qwen.sh`. See
248
- [Harness compatibility](docs/harness-compatibility.md#qwen-code).
83
+ Cairnkeep is not a hosted agent, telemetry service, or automatic remote
84
+ knowledge collector. Memory is durable context, not source-of-truth
85
+ documentation. Configured Claude Code and OpenCode hooks can derive local
86
+ memory candidates; durable promotion and every networked or sensitive capture
87
+ path remain separately controlled. Ordinary uninstall retains durable data
88
+ unless an explicit purge is requested.
249
89
 
250
- For Pi, select Pi during project setup, explicitly install/check its machine
251
- assets, run doctor, and use the generated launcher:
90
+ Start with [Privacy and data flow](docs/privacy-and-data-flow.md) and
91
+ [Memory storage and deployment](docs/storage.md) before enabling remote HTTP,
92
+ embeddings, trajectories, artifacts, work evidence, or context packs.
252
93
 
253
- ```bash
254
- cairn sync-pi --apply
255
- cairn sync-pi --check
256
- cairn setup /path/to/project --git init --harness pi --memory local --yes
257
- cd /path/to/project && cairn doctor && ./.ai/start-pi.sh
258
- ```
259
-
260
- This installs the maintained local stdio memory extension, trajectory capture,
261
- and the thin `/graphify` prompt. The memory extension discovers the effective
262
- server tool catalog and preserves annotations in trusted result details; Pi's
263
- public API has no native annotations field. It adds tools only—no prompt runs,
264
- skill activation, autonomous loop, or remote access. Pi 0.84.1 is the minimum
265
- validated version; v2.11 also passed the registry-current Pi release and the
266
- documented Node, Bash, and native Windows matrix.
267
-
268
- Preview removal before confirming it. Uninstall backs up every managed file it
269
- will change and prints the generated revert command; durable memory and context
270
- packs remain unless their explicit purge flags are supplied:
271
-
272
- ```bash
273
- cairn uninstall --dry-run /path/to/project
274
- cairn uninstall --yes /path/to/project
275
- ```
94
+ ## Documentation
276
95
 
277
- If setup-owned project assets drift, rerun the exact `cairn setup ... --yes`
278
- recovery command reported by `cairn doctor`. For Pi machine-asset drift, run
279
- `cairn sync-pi --apply`, then `cairn sync-pi --check` and `cairn doctor`.
96
+ The [documentation hub](docs/README.md) is the index for setup, agents,
97
+ operations, optional features, deployment, learning paths, and contributor
98
+ guides. In particular:
280
99
 
281
- Closed trajectories can be compiled into local hindsight notes without a model
282
- or embedding service. Capture and distillation are separate opt-ins:
283
-
284
- ```bash
285
- export CAIRN_TRAJECTORY_CAPTURE=1 # affects future closed sessions
286
- export CAIRN_NOTE_DISTILLATION=1
287
- cairn notes distill --project /path/to/project --json
288
- printf '%s\n' 'TypeError: example' | cairn notes search-error --project /path/to/project --json
289
- ```
290
-
291
- Notes keep deterministic failure, resolution, abandonment, and recurrence
292
- history under `~/.cairnkeep/notes/`. Shared promotion is never automatic: it
293
- requires compatible evidence from two distinct projects and an explicit
294
- `cairn notes promote NOTE-ID --with NOTE-ID --confirm`. See the
295
- [operating guide](docs/operating.md#hindsight-notes-opt-in) before enabling
296
- optional model enrichment.
297
-
298
- Prefer working from a clone? Build the server with `cd mcp-memory-server && npm
299
- install && npm run build`, then use `scripts/sync-claude-assets.sh` and
300
- `bin/cairn` in place of the installed `cairn`.
301
-
302
- Step 2 is easy to miss and load-bearing: without it the memory server is
303
- registered but none of the `/remember`, `/recall`, `/wiki-*`, `/security-audit`,
304
- or `/repo-review` commands (and no memory hooks) exist. OpenCode uses the
305
- `sync-opencode-*.sh` scripts instead — see the operating guide.
306
-
307
- The launchers load `.ai/.env` and start the harness in the repo root. They stay
308
- deliberately minimal — provider/profile specifics belong in your own wrapper,
309
- which plugs in through the launcher seams below.
310
-
311
- **Wrapper seams.** The generic launchers are no-ops beyond loading `.ai/.env`
312
- unless a wrapper opts in:
313
-
314
- - **`.ai/pre-launch.sh`** — sourced after `.env`, before the harness starts. May
315
- export env (e.g. a provider base URL) or abort the launch by returning
316
- non-zero. This is where credential refresh / connectivity setup lives.
317
- - **`CAIRN_EXTRA_SETTINGS`** — path to a settings file layered onto the harness
318
- (`--settings` for Claude Code, `OPENCODE_CONFIG` for OpenCode). Kimi, Qwen,
319
- and Pi do not interpret this variable in their generic launchers.
320
- Process env still wins, so an inline value beats the profile.
321
- - **`.ai/post-exit.sh`** — sourced after the harness exits, with
322
- `CAIRN_EXIT_STATUS` set to its exit code.
323
-
324
- **Contributor mode.** Working on a repo you don't own? `cairn bootstrap
325
- --untracked /path/to/project` additionally writes the scaffolded paths
326
- (`.ai/`, `.planning/`, `.agentfs/`) into the repo's `.git/info/exclude`, so the workflow
327
- files stay purely local: nothing to commit or push, invisible to every other
328
- contributor, and no edit to the shared `.gitignore`. The trade-off is that
329
- untracked planning state lives only on that clone — deleting the clone
330
- deletes it. To move the durable memory itself between machines, use
331
- `cairn memory export` / `cairn memory import`.
332
-
333
- ## Configuration
334
-
335
- The memory server and collaboration commands are configured entirely through
336
- `.ai/.env` (any OpenAI-compatible API for extraction and embedding-ranked
337
- search):
338
-
339
- | Variable | Purpose |
340
- |---|---|
341
- | `CAIRN_LLM_API_KEY` | API key for the extraction / embeddings endpoint |
342
- | `CAIRN_LLM_API_URL` | Base URL of the OpenAI-compatible endpoint |
343
- | `CAIRN_LLM_EXTRACTION_MODEL` | Chat model used for memory extraction |
344
- | `CAIRN_MEMORY_EMBEDDING_URL` | Embeddings endpoint (falls back to `CAIRN_LLM_API_URL`) |
345
- | `CAIRN_MEMORY_EMBEDDING_MODEL` | Embedding model name (required for semantic search) |
346
- | `CAIRN_MEMORY_EMBEDDING_TIMEOUT_MS` | Embedding request timeout before substring fallback (default `15000`) |
347
- | `CAIRN_AGENTFS_BASE_DIR` | Base dir for global memory scopes (default `~/.cairnkeep`) |
348
- | `CAIRN_MCP_TOOL_PROFILE` | Process override for MCP exposure: `full`, `read-only`, or `custom` |
349
- | `CAIRN_MCP_ALLOWED_TOOLS` | Comma-separated exact allowlist required by a custom process profile |
350
- | `CAIRN_CONTEXT_PACKS` | Opt in to local context-pack list/search/read/related tools (default off) |
351
- | `CAIRN_CONTEXT_PACK_HTTP` | Separately consent to context-pack tools over authenticated HTTP (default off) |
352
- | `CAIRN_PACK_BASE_DIR` | Immutable pack objects, source records, pointers, and retrieval cache (default `~/.cairnkeep/packs`) |
353
- | `CAIRN_PLAYBOOK_PROFILE` | Process-only playbook profile override: `minimal`, `balanced`, or `strict` (project default: `balanced`) |
354
- | `CAIRN_PLAYBOOK_ACTOR` | Optional local receipt label; caller-supplied and unauthenticated in v2.15 |
355
- | `CAIRN_PLAYBOOK_ACTOR_KIND` | Optional local actor kind: `user`, `agent`, or `service` |
356
- | `CAIRN_PLAYBOOK_SESSION` | Optional bounded session label used by playbook decisions and receipts |
357
- | `CAIRN_TRAJECTORY_CAPTURE` | Opt in to local structured session capture (`1`, `true`, `yes`, or `on`; default off) |
358
- | `CAIRN_TRAJECTORY_SESSION_MAX_BYTES` | Maximum serialized bytes per captured session (default `5242880`, 5 MiB) |
359
- | `CAIRN_TRAJECTORY_STORE_MAX_BYTES` | Maximum logical bytes across local trajectories (default `268435456`, 256 MiB) |
360
- | `CAIRN_TRAJECTORY_RETENTION_DAYS` | Retain captured sessions for this many days (default `30`) |
361
- | `CAIRN_TRAJECTORY_REDACTION_FILE` | Optional project-contained redaction config (default `.ai/trajectory-redaction.json` when present) |
362
- | `CAIRN_REDACTION_FILE` | Optional project-contained redaction config shared by trajectories and artifacts (falls back to `CAIRN_TRAJECTORY_REDACTION_FILE`) |
363
- | `CAIRN_WORK_EVIDENCE` | Capture bounded Git state around generated harness launches (off by default) |
364
- | `CAIRN_WORK_EVIDENCE_PATCH` | Request an optional redacted patch artifact (off by default; also requires `CAIRN_ARTIFACT_STORE`) |
365
- | `CAIRN_WORK_EVIDENCE_RETENTION_DAYS` | Work-evidence retention (default `30`; `0` disables age pruning) |
366
- | `CAIRN_WORK_EVIDENCE_STORE_MAX_BYTES` | Project-local work-evidence metadata budget (default `67108864`, 64 MiB) |
367
- | `CAIRN_WORK_EVIDENCE_MAX_TOUCHED_PATHS` | Maximum touched-path labels per record (default and hard maximum `4096`) |
368
- | `CAIRN_WORK_EVIDENCE_PATCH_MAX_BYTES` | Maximum optional patch bytes (default `1048576`, 1 MiB; the artifact cap can lower it) |
369
- | `CAIRN_COMPACTION_CAPTURE` | Opt in to local harness-produced compaction capture and fresh-session recovery (off by default) |
370
- | `CAIRN_ARTIFACT_STORE` | Expose four local stdio artifact tools (off by default; independent of compaction capture) |
371
- | `CAIRN_ARTIFACT_HTTP` | Separately consent to artifact tools over authenticated HTTP (off by default; also requires `CAIRN_ARTIFACT_STORE`) |
372
- | `CAIRN_ARTIFACT_MAX_BYTES` | Maximum stored bytes per artifact (default `1048576`, 1 MiB) |
373
- | `CAIRN_ARTIFACT_SESSION_MAX_BYTES` | Maximum logical bytes per artifact session (default `16777216`, 16 MiB) |
374
- | `CAIRN_ARTIFACT_STORE_MAX_BYTES` | Maximum logical bytes in one artifact store (default `268435456`, 256 MiB) |
375
- | `CAIRN_ARTIFACT_RETENTION_DAYS` | Artifact age retention (default `30`) |
376
- | `CAIRN_COMPACTION_MAX_REVISIONS` | Retained compaction revisions per session (default `8`) |
377
- | `CAIRN_ARTIFACT_GENERATED_FILE_SNAPSHOT_MAX_BYTES` | Generated-file inline snapshot cap (default `262144`, 256 KiB; lower if the artifact cap is lower) |
378
- | `CAIRN_NOTE_DISTILLATION` | Opt in to one-shot/scheduled local note distillation and lookup (default off) |
379
- | `CAIRN_NOTE_ENRICHMENT` | Separately opt in to remote/local prose enrichment; never implied by credentials (default off) |
380
- | `CAIRN_NOTE_ENRICHMENT_MODEL` | Explicit chat model for optional note enrichment (no default) |
381
- | `CAIRN_NOTE_ENRICHMENT_TIMEOUT_MS` | Optional enrichment timeout (default `15000`) |
382
- | `CAIRN_TYPED_MEMORY_NODES` | Opt in to typed metadata, filters, logical note address spaces, and `memory_import` (default off; restart the server after changing) |
383
- | `CAIRN_CAPABILITY_CONTRACT` | Opt in to the managed eight-capability contract (default off) |
384
- | `CAIRN_CAPABILITY_LOGGING` | Override payload-free local callback logging (`1`/`0`; default off) |
385
- | `CAIRN_CAPABILITY_MEMORY_WRITE` | Override `memory.write` for this process |
386
- | `CAIRN_CAPABILITY_MEMORY_SEARCH` | Override `memory.search` for this process |
387
- | `CAIRN_CAPABILITY_NOTES_DISTILL` | Override `notes.distill` for this process |
388
- | `CAIRN_CAPABILITY_WIKI` | Override `wiki` for this process |
389
- | `CAIRN_CAPABILITY_GRAPH` | Override `graph` for this process |
390
- | `CAIRN_CAPABILITY_SECURITY_AUDIT` | Override `security.audit` for this process |
391
- | `CAIRN_CAPABILITY_ROUTE_CHECK` | Override `route.check` for this process |
392
- | `CAIRN_CAPABILITY_CONTEXT_EXPLORE` | Override `context.explore` for this process |
393
- | `CAIRN_EVAL` | Opt in to the local evaluation coordinator (default off; does not select a harness, model, endpoint, credential, or network) |
394
- | `CAIRN_GIT_PROVIDER` | Git host for collaboration commands: `github`\|`gitlab`\|`codeberg`\|`forgejo`\|`none` ([docs/git-providers.md](docs/git-providers.md)) |
395
- | `CAIRN_ROUTE_ENDPOINT` | Base URL of an already-running token-miser routing/tiering proxy (unset → `route_check` is inert) |
396
- | `CAIRN_GRAPHIFY_BINARY` | Optional Graphify command/path override (default `graphify` from `PATH`; JavaScript helpers run through Node) |
397
- | `CAIRN_EXPLORE_BINARY` | Absolute path to the `token_miser` binary used by `context_explore` (unset → the tool throws) |
398
- | `CAIRN_EXPLORE_REPO_ROOT` | Default repo root for `context_explore` when no per-call `repo_root` is given |
399
- | `CAIRN_EXTRA_SETTINGS` | Optional settings/config file the launcher layers onto the harness (wrapper seam) |
400
- | `CAIRN_ANYTHINGLLM_SYNC_SCRIPT` | Override path to the domain-knowledge sync script (when the integration lives outside the repo) |
401
- | `CAIRN_ANYTHINGLLM_PROJECTS_FILE` | Override path to the bundled sync script's project configuration |
402
- | `CAIRN_ANYTHINGLLM_STATE_FILE` | Override path to the bundled sync script's incremental state |
403
-
404
- Without an API key, search degrades gracefully to substring matching.
405
- There is no Cairnkeep telemetry. Optional extraction, embeddings, document RAG,
406
- remote memory, and delegated exploration can send content to endpoints you
407
- configure. Review [Privacy and data flow](docs/privacy-and-data-flow.md) before
408
- enabling them.
409
-
410
- ### MCP authority and context packs
411
-
412
- Every tool publishes a stable title and all four MCP annotation hints. Use
413
- `cairn mcp-tools set read-only` for observation-only clients, or an exact custom
414
- allowlist when a workflow needs fewer tools. Process settings override the
415
- strict project file; the default remains `full`. Profiles only remove tools and
416
- cannot bypass capability or feature gates. See
417
- [MCP tool profiles](docs/mcp-tool-profiles.md).
418
-
419
- Context packs are immutable, digest-addressed local document/skill bundles.
420
- They are installed and project-pinned manually; no background Git sync occurs.
421
- With `CAIRN_CONTEXT_PACKS=1`, enabled documents are searchable and their local
422
- links traversable through four read-only MCP tools. Skills remain invisible until their exact file digest is
423
- approved, and are never copied or executed. See
424
- [Immutable context packs](docs/context-packs.md). OKF 0.1/0.2 import and
425
- privacy-reviewed OKF 0.2 export are documented in
426
- [Open Knowledge Format exchange](docs/open-knowledge-format.md).
427
-
428
- ### Managed capability contract (opt-in)
429
-
430
- `CAIRN_CAPABILITY_CONTRACT=1` enables one versioned, typed boundary around the
431
- existing capability owners. The master flag and callback logging are both off
432
- by default. With the master flag unset, MCP registration, installed
433
- Markdown/workflow bytes, commands, processes, configuration reads, logging,
434
- output, and performance remain on the legacy path.
435
-
436
- | Capability ID | Kind | Existing owner | Compatibility default | Process override |
437
- |---|---|---|---:|---|
438
- | `memory.write` | MCP tool | `memory_write` | on | `CAIRN_CAPABILITY_MEMORY_WRITE` |
439
- | `memory.search` | MCP tool | `memory_search` | on | `CAIRN_CAPABILITY_MEMORY_SEARCH` |
440
- | `notes.distill` | offline job | note distillation CLI/timer | off | `CAIRN_CAPABILITY_NOTES_DISTILL` |
441
- | `wiki` | operating workflow | installed wiki commands/workflows | on | `CAIRN_CAPABILITY_WIKI` |
442
- | `graph` | operating workflow | installed graph commands | inherited from `graphify.enabled`, otherwise off | `CAIRN_CAPABILITY_GRAPH` |
443
- | `security.audit` | operating workflow | installed security commands/workflows | on | `CAIRN_CAPABILITY_SECURITY_AUDIT` |
444
- | `route.check` | MCP tool | existing token-miser routing delegate | on | `CAIRN_CAPABILITY_ROUTE_CHECK` |
445
- | `context.explore` | MCP tool | existing token-miser exploration delegate | on | `CAIRN_CAPABILITY_CONTEXT_EXPLORE` |
446
-
447
- Manage project overrides in `.ai/capabilities.json` through the CLI rather than
448
- editing JSON:
449
-
450
- ```bash
451
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities list
452
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities status --json
453
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities disable context.explore
454
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities reset context.explore
455
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities logging enable
456
- ```
457
-
458
- Process overrides take precedence over project values, which take precedence
459
- over compatibility defaults. `reset` removes an explicit override and restores
460
- the inherited state; it does not mean enabled. Changes to the four MCP
461
- capabilities (`memory.write`, `memory.search`, `route.check`, and
462
- `context.explore`) require a fresh memory-server start and disabled tools are
463
- omitted from `tools/list`. Offline and operating workflows resolve state at
464
- each invocation. Enabling the master does not enable `notes.distill` or graph
465
- when their compatibility inputs remain off.
466
-
467
- Callback records are local, payload-free operating evidence, not evaluation
468
- results or telemetry. They require the contract, callback logging, and local
469
- trajectory capture to be enabled together. Cairnkeep makes no capability gain,
470
- memory-quality, or efficiency claim from this instrumentation; Phase 19 must
471
- first create an explicit all-enabled baseline and measure one-disabled states.
472
- See the [operating guide](docs/operating.md#managed-capability-contract-opt-in),
473
- [storage contract](docs/storage.md#capability-callback-storage), and
474
- [privacy flow](docs/privacy-and-data-flow.md#capability-callback-flow).
475
-
476
- ### Evaluation harness (opt-in, measurement only)
477
-
478
- `CAIRN_EVAL=1` enables `cairn eval` for a committed schema-v1 task set and an
479
- explicit operator-owned adapter program. `validate` resolves immutable inputs,
480
- limits, commands, digests, output containment, and a deterministic serial
481
- schedule without invoking the adapter. `run` measures from-scratch Run 1 versus
482
- a fresh Run 2 that can see only its own task's immutable note snapshot.
483
- `ablate` measures an explicit all-eight-capabilities-on baseline against one
484
- exactly-one-disabled treatment, with both passes in both arms. Execution prints
485
- the invocation estimate and requires `--yes`; there is no retry, inference,
486
- provider, endpoint, credential, model, or network default.
487
-
488
- The canonical local JSON report records optional reported turns/tokens/cost,
489
- independently verified pass state, full and note-eligible populations,
490
- missingness, paired deltas, capability/notes/revision digests, and seeded
491
- bootstrap uncertainty. Turns compare only under exact matching turn-semantics
492
- compatibility IDs; token totals are never inferred and unknown verifier results
493
- are never counted as pass or fail. Reports describe estimates and
494
- inconclusive/small-sample conditions; they do not claim causality,
495
- significance, quality change, or efficiency change.
496
-
497
- The bundled fake task set and adapter are deterministic, offline framework
498
- fixtures. They cannot support a Cairnkeep performance statement. Any future
499
- efficiency statement requires a separate committed `live-evaluation` artifact
500
- whose source, task-set, report, schema, note-snapshot, missingness, runtime, and
501
- claim anchors all pass `scripts/verify-phase19-runtime-evidence.mjs`. No such
502
- live claim or evidence artifact is shipped here, and external paper calibration
503
- is neither a Cairnkeep result nor an acceptance target.
504
-
505
- Reports and note snapshots stay under
506
- `.agentfs/eval/experiments/<experiment-id>/`; default uninstall retains them,
507
- while explicit purge is backup-first and revertible. Cancellation retains an
508
- inspectable partial report. POSIX process-group cleanup and Windows descendant-
509
- tree cleanup through `taskkill.exe /T` are tested by their platform contracts. See the
510
- [operating guide](docs/operating.md#evaluation-harness-opt-in),
511
- [storage contract](docs/storage.md#evaluation-report-and-note-snapshot-storage),
512
- and [privacy flow](docs/privacy-and-data-flow.md#evaluation-adapter-and-report-flow).
513
-
514
- ### Validated skill improvement (opt-in)
515
-
516
- `cairn skill` promotes repeated, resolved hindsight evidence through a guarded
517
- lifecycle: local harvest, explicit evidence review, bounded proposal generation,
518
- separate exploration and confirmation evaluations, exact-digest application,
519
- and backup-first rollback. Cairnkeep never rewrites a live skill during proposal
520
- or evaluation, never sends evidence to the proposal adapter before approval,
521
- and never applies a candidate automatically.
522
-
523
- Proposal generation uses an explicit strict adapter configuration with an
524
- environment allowlist. Evaluation remains disabled unless `CAIRN_EVAL=1`, uses
525
- the existing isolated worktree runner and independent verifier, and requires
526
- disjoint committed task sets bound to one immutable source revision. A
527
- candidate is eligible only when both stages meet the configured improvement
528
- floor with no regression or unknown pair. See the
529
- [validated skill guide](docs/skill-improvement.md),
530
- [storage contract](docs/storage.md#validated-skill-storage), and
531
- [privacy flow](docs/privacy-and-data-flow.md#validated-skill-improvement-flow).
532
-
533
- ### Typed memory nodes and structured import (opt-in)
534
-
535
- `CAIRN_TYPED_MEMORY_NODES=1` adds schema-v1 `node_type`, canonical `tags`,
536
- `address_space`, hard list/search filters (`node_types`, `tags_all`,
537
- `tags_any`), and exactly one new MCP tool: `memory_import`. The flag is read
538
- when each server/session is created, so restart after changing it. Unset keeps
539
- the existing 14 tools, schemas, response roots, raw values, files, processes,
540
- network behavior, and output unchanged. It adds no read/edit/update/delete
541
- aliases; `memory_supersede` remains the sole edit operation.
542
-
543
- Core types are `memory`, `knowledge`, `hindsight`, `shared`, and `provenance`;
544
- extensions use a namespaced form such as `team:runbook`. Tags are ASCII
545
- lowercase, with whitespace and underscores normalized to hyphens, deduplicated,
546
- and sorted. Filters are applied before ranking. Exact key/tag/type hits precede
547
- semantic results; without a working configured embedding endpoint, search uses
548
- stable local substring matching.
549
-
550
- `memory_import` accepts one inline schema-v1 batch for one concrete scope and
551
- one `memory`, `project-notes`, or `shared-notes` address. It supports 1–256
552
- unique relative keys, values up to 256 KiB each and 5 MiB total, optional
553
- `import_id`, `dry_run`, and `conflict_policy: reject|supersede`. Results contain
554
- only digests, counts, keys, and actions—never supplied values. The default
555
- reject policy cannot overwrite; explicit supersede preserves typed history.
556
- Note addresses require `scope: project` and logical keys, never filesystem
557
- paths. See the [operating guide](docs/operating.md#typed-memory-nodes-and-note-address-spaces-opt-in).
558
-
559
- ### Git-linked work evidence (opt-in)
560
-
561
- `CAIRN_WORK_EVIDENCE=1` makes generated Claude Code, OpenCode, Pi, Kimi, Qwen
562
- and Codex launchers record bounded start/end Git state and links to exact local
563
- trajectories, artifacts and reviewed-memory writes. It records no prompts,
564
- keystrokes or reasoning, and harness launch remains fail-open when Git or
565
- capture is unavailable. Inspect it with `cairn evidence list|show|delete|prune|doctor`.
566
- Optional patch capture requires both `CAIRN_WORK_EVIDENCE_PATCH=1` and
567
- `CAIRN_ARTIFACT_STORE=1`; Cairnkeep never applies or restores a patch. See the
568
- [work-evidence guide](docs/work-evidence.md).
569
-
570
- ### Compaction continuity and artifacts (opt-in)
571
-
572
- `CAIRN_COMPACTION_CAPTURE=1` captures only harness-produced compaction summaries
573
- from the pinned Claude Code `PostCompact` 2.1.219 and 2.1.220 payloads and
574
- OpenCode `session.compacted` 1.17.20 seam. It stores redacted immutable revisions locally and injects the latest
575
- valid structured goals, decisions, TODOs, and critical errors when a session
576
- starts. A resumed session is preferred; a fresh session falls back to the
577
- newest valid project summary and marks stale context for validation. The raw
578
- redacted summary is available only through an explicit read. Cairnkeep never
579
- generates or triggers compaction.
580
-
581
- `CAIRN_ARTIFACT_STORE=1` independently exposes exactly four stdio MCP tools:
582
- `artifact_write`, `artifact_read`, `artifact_list`, and `artifact_delete`.
583
- The initial kinds are exactly `compaction_summary`, `diff`, `test_output`, and
584
- `generated_file`. Generated-file paths are labels only; the server never reads
585
- them. Operators can inspect retained local data whether or not MCP writes are
586
- currently enabled:
587
-
588
- ```bash
589
- cairn artifact list --kind compaction_summary --json
590
- cairn artifact show ARTIFACT-ID --json
591
- cairn artifact delete ARTIFACT-ID --dry-run --json
592
- cairn artifact prune --dry-run --include-protected --json
593
- ```
100
+ - [Quickstart](docs/quickstart.md)
101
+ - [For coding agents](docs/agents.md)
102
+ - [Context intelligence](docs/context-intelligence.md)
103
+ - [Operating guide](docs/operating.md)
104
+ - [Harness compatibility](docs/harness-compatibility.md)
105
+ - [Privacy and data flow](docs/privacy-and-data-flow.md)
106
+ - [Guided learning paths and video scripts](docs/learning/README.md)
594
107
 
595
- Both capabilities are default-off, local, and require no key, model, endpoint,
596
- telemetry, or network. Remote tools require double consent:
597
- `CAIRN_ARTIFACT_STORE=1` plus `CAIRN_ARTIFACT_HTTP=1`, as well as the existing
598
- bearer, `Host`, and validated `X-Cairn-Project` controls. Artifact HTTP never
599
- exposes trajectory data. See the [operating guide](docs/operating.md#compaction-continuity-and-artifacts-opt-in),
600
- [storage contract](docs/storage.md#artifact-storage), and
601
- [privacy flows](docs/privacy-and-data-flow.md#compaction-and-artifact-flows).
108
+ The repository supports Linux, macOS, native Windows x64, WSL, Node.js 22/24/26,
109
+ and real Bash 3.2 within the boundaries documented in the compatibility guides.
602
110
 
603
- ## More
111
+ ## Contributing and support
604
112
 
605
- - **Guided learning paths and video scripts** — [docs/learning/README.md](docs/learning/README.md)
606
- - **Optional document RAG** (`domain_knowledge_*` via AnythingLLM) — [docs/domain-knowledge.md](docs/domain-knowledge.md)
607
- - **Building a private overlay** (wrap cairnkeep for your org/provider) — [docs/building-an-overlay.md](docs/building-an-overlay.md)
608
- - **Managed overlay distributions** (wrapper CLI, policy lock, private registry, rollback) — [docs/overlay-distributions.md](docs/overlay-distributions.md)
609
- - **Full operating guide** — [docs/operating.md](docs/operating.md)
610
- - **Memory storage and deployment** — [docs/storage.md](docs/storage.md)
611
- - **Podman and OCI containers** — [docs/containers.md](docs/containers.md)
612
- - **Privacy and data flow** — [docs/privacy-and-data-flow.md](docs/privacy-and-data-flow.md)
613
- - **MCP tool profiles** — [docs/mcp-tool-profiles.md](docs/mcp-tool-profiles.md)
614
- - **Immutable context packs** — [docs/context-packs.md](docs/context-packs.md)
615
- - **Open Knowledge Format exchange** — [docs/open-knowledge-format.md](docs/open-knowledge-format.md)
616
- - **Validated skill improvement** — [docs/skill-improvement.md](docs/skill-improvement.md)
617
- - **Git providers** — [docs/git-providers.md](docs/git-providers.md)
618
- - **Support** — [SUPPORT.md](SUPPORT.md)
619
- - **Contributing** — [CONTRIBUTING.md](CONTRIBUTING.md)
620
- - **Security policy** — [SECURITY.md](SECURITY.md)
113
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development and pull-request
114
+ guidelines, [SUPPORT.md](SUPPORT.md) for help, and [SECURITY.md](SECURITY.md) for
115
+ private vulnerability reporting.
621
116
 
622
117
  ## License
623
118