dot-claude-iff
Step 1

Understand the system

Work here happens in stable work blocks: stretches that survive interruption and can be picked up cold. The agent's half of that promise is mechanical - a resume pointer written to disk before anything risky, an append-only journal as the source of truth, task checkpoints that name their evidence, and one ritual that seals each block. Your half is a single page called the console, which watches without interrupting.

The modules, and exactly what each one touches

ModuleWhat it doesWrites toNetwork
5 hooksheartbeat each turn, resume block at session start, event capture, a policy gate on writes, JSON validation on writes local: .claude/state/, the record folder none
7 toolscontinuity, observation, map, console build, ritual runner, distribution - bash + python3 stdlib, zero pip packages local: .claude/, .claude-iff/, the record folder none
consoleone HTML page + a tiny server reads only; buttons emit commands for you to paste 127.0.0.1 only
3 agentsanatomist (map), retro-analyst (evolution proposals), verifier (claim checking) - run inside Claude Code governed by the policy gate via Claude Code
obsctl analyzeoptional: labels the record with an LLM you configure. Off until you configure it. local: the record's analysis/ only if you enable it

Privacy, data sharing and telemetry - the honest version

Three truths, stated plainly - then the risk map below turns them into exact file locations and what each one is safe to share.

  1. This system phones home to no one. There is no telemetry, no analytics, no update check, no CDN. The hooks and tools make exactly zero network calls. The one exception is obsctl analyze, which is off by default and only ever talks to the endpoint you configure - and with a local Ollama endpoint, even that never leaves your machine. API keys live in your environment or a gitignored .env, never in a committed file, and the tests prove a key placed in config is ignored.
  2. Claude Code itself talks to Anthropic. Your conversation, and files the agent reads, go to the Claude API - that is how Claude Code works, with or without this system, under your account's data settings. This system neither adds to that traffic nor reduces it. What it adds is a local copy: the record captures events so you can inspect and analyze what happened on your own disk.
  3. The record is radioactive, and treated that way. Raw captured events contain prompts, file contents and tool output verbatim (measured at ~70% of capture volume). So the raw record lives in a sibling folder outside the repo, where git structurally cannot reach it; only allowlisted metadata (event names, timestamps, token counts, an integrity anchor) is ever committed. A git push can therefore never publish a prompt, a file body, or a secret from the record - and a CHECK-phase gate fails the ritual if any committed file so much as names your home directory.
Verify, don't trust. Every claim above is a grep away:
# the only network call site in the whole system (analyze, opt-in):
grep -rn "urllib.request" .claude/tools/ .claude/hooks/
# what the hooks are wired to do:
cat .claude/settings.json
# the redaction allowlist that gates what can ever be committed:
python3 -c "import json; print(json.load(open('.claude/config/observe.json'))['seal_allowlist'])"
# the test suite, including the secrets-never-reach-segments proofs:
python3 .claude/tools/tests/run_tests.py
Claude Code will also ask you once whether to trust this project's hooks before running any of them - nothing here executes until you say yes.

The risk map: where files live, and what each is safe to share

Three places hold your data, with three very different sensitivities. Read the colors: safe to push is committed by design, contains your words is committed but carries text you wrote, and never share holds verbatim history that no push can reach - but a zip, a screen share, or a copied folder can.

What this means in practice: